Nbbt » 2009.04.26 16:36

Иии нужна помощь. Пишу (точнее пытаюсь) написать гостевую. Вопрос: как сделать чтоб одинаковые сообщения не добавлялись, и при "обновлении" страницы со скриптом тоже не добавлялись сообщения? Гостевую делаю на файле, форма>скрипт обрабатывает и записывает в файл в виде

ник|мыло|сайт|город|сообщение
следующая строка в таком же виде и т.д

Gemorroj, need help!)

Gemorroj » 2009.04.26 16:50

доставай последнее сообщение из бд и сравнивай с тем, что постится. если совпадают, то шли нахуй.

Nbbt » 2009.04.26 16:51

У меня на файле... И я х3 как доставать и сравнивать, мож намекнешь?

Gemorroj » 2009.04.26 16:56

смотря каким образом ты хранишь данные в файле.

Nbbt » 2009.04.26 16:56

fputs ($fp,"$nick|$mail|$site|$town|$mess\r\n");

Gemorroj » 2009.04.26 17:01

ты учел, что в любой из переменных может встречаться символ | и структура может нарушиться?

Nbbt » 2009.04.26 17:03

Потом буду заменять на L (l)
Добавлено спустя   1 минуту  10 секунд:
Или предложишь лучший вариант? )

Gemorroj » 2009.04.26 17:04

дай полный код записи данных, начиная с fopen

Nbbt » 2009.04.26 17:06

$fp = fopen ("messages.dat","a");
fputs ($fp,"$nick|$mail|$site|$town|$mess\r\n");
fclose ($fp);

Gemorroj » 2009.04.26 17:15

Код:

1
span style="color: #0000BB"><?php// считываем файл в массив$data = file('messages.dat');// берем последий элемент$end = end($data);// разбиваем строку по символу | и присваиваем элементам именаlist($nick, $mail, $site, $town, $mess) = explode('|', $end);?>

Ну вот, соответственно, в переменной $mess будет последнее сообщение.

Nbbt » 2009.04.26 17:19

В $mess? Почему?

Gemorroj » 2009.04.26 17:34

выполни скрипт и посмотри

Nbbt » 2009.04.26 17:54

Уже разобрался, спасибо огромное)))

Nbbt » 2009.04.26 18:43

Но теперь возникла проблемка: при добавлении сообщения, если messages.dat пустой появляются ошибки... Они конечно не мешают, но смотрится это не прилично :)

JInn » 2009.04.26 20:00

Можно проще. Проверяешь субмит, если есть записываешь, если нет то нет. Как записал - субмит убил и все.
Извиняюсь, это не прокатит ) Вот как можно: после того как сообщение записал, в суперглобальную переменную (я в сессию) заносишь сообщение, а перед записью сверяешь с тем, что по посту пришло, если одинаковое, то не записываем. Это точно работает. Я думаю так быстрее будет, чем доставать из базы или файла. Выглядеть это будет так

Код:

1
2
if (isset($_SESSION['старое сообщение']) && $_SESSION['старое сообщение'] != $_POST['новое сообщение'])
{тут пошла запись в базу или файл} а после записи $_SESSION['старое сообщение'] = $_POST['новое сообщение'];

Если есть тема сообщения то можно тему кидать в сессию, оно меньше по размеру

Nbbt » 2009.04.27 18:55

Пока тот вариан меня устраивает, но всё равно спасибо.
Появился новый вопрос. У меня сообщения при таком цикле

Код:

1
2
3
4
$file = file('messages.dat');
$count = count($file);
for ($i = 0; $i < $count; $i++) {
$text = explode("|",$file[$i]);

Выводятся с первого по последний, а как сделать чтоб с последнего по первый?

Nbbt » 2009.04.27 23:18

ПыХаПэ сЪеЛЪ мОй мОзгГ *CRAZY*
Ждал, ждал, пока кто ответит... Перелапатил несколько скриптов, обсосал все ф-ции на php.su... Ниче не нашел... И Вот оно -- нечайно увыдел спасительное array_reverse
Радости небыло предела)))
Вобсщем всё оказалось просто, правда мозг сгорел =(
Итог:

Код:

1
2
3
4
5
$file = file('messages.dat');
$file = array_reverse($file);
$count = count($file);
for ($i = 0; $i < $count; $i++) {
$text = explode("|",$file[$i]);

Теперь всё вроде норм пока выводится
Гемор, похвалишь?)))
Добавлено спустя   1 минуту  59 секунд:
Блин, столько долгов в универе, а этот несчасный мой первый кривой скрипт не дает покоя, блин =)))

Gemorroj » 2009.04.28 09:14

ну можно было сделать и без array_reverse =)

Код:

1
for ($i = $count; $i >= 0; $i--) {
Nbbt » 2009.04.28 13:08

Помогите с регуляркой...
Что не правильно? Почему не работает?

preg_match("/^[-a-zA-Z0-9_]+[\@][-a-zA-Z0-9_\.]+$/"

Gemorroj » 2009.04.28 13:37

собаку слешировать и в скобки брать не надо.
preg_match('/^[a-z][a-z0-9_\.\-]{1,23}@([a-z][a-z0-9\-]{1,24}\.){1,3}[a-z]{2,6}$/i', $email)
пользуйся такой)

JInn » 2009.04.28 14:00

Вот бы если бы еще объяснил кто нить че это такое - регулярка... Я понимаю что это проверка мыла, пользуюсь, но как работает не догоняю...

Nbbt » 2009.04.28 15:59

Я тут читал
http://www.php.su/articles/?cat=regexp&page=001

http://pyha.ru/forum/topic/19.0

еше тут о символах
http://ru.wikipedia.org/wiki/Представление_символов_в_регулярных_выражениях

Nbbt » 2009.04.28 17:22

Gemorroj, чтот твоя регулярка не зафурыкала  =(
Я такую использовал:

Код:

1
if (preg_match("/[^(\w)|(\@)|(\.)|(\-)]/",$mail))

Норм пашет

Gemorroj » 2009.04.28 18:02

эта регулярка используется почти во всех местах на этом сайте, где требуется проверка емыла)

Nbbt » 2009.04.28 22:27

Забил я на проверку регулярками... думаю

Код:

1
2
3
htmlspecialchars(stripslashes(trim(
и
substr(

хватит...

Gemorroj » 2009.04.28 22:49

stripslashes не нужно.

Nbbt » 2009.04.29 09:25

Gemorroj написал:

stripslashes не нужно.

Ok :)

Nbbt » 2009.04.29 10:07

Gemorroj написал:

ну можно было сделать и без array_reverse =)

Код:

1
for ($i = $count; $i >= 0; $i--) {

Проверил этот вариант, работает, сообщения "переворачиваются", НО вылезает ошибка :) аррай_реверс рулит в этом случае

Gemorroj » 2009.04.29 11:19

блин. ошибка вылезает из-за того, что ты что-то не так сделал. и потом без array_reverse быстрее.

DarkDaNTe » 2009.04.29 14:49

Все ошибки из-за кривых рук, тупых хостингов и глупой головы)Гг

Nbbt » 2009.04.29 22:36

Я понимаю, что всё норм сделал, работало же с твоим примером, просто + к работе ошибка  вылезала. Насчет глупой головы и кривых рук не надо.... Норм у меня всё, все когда-то начинающими были, да, я могу сделать ошибку, но всегда стараюсь исправлять, и больше не допускать. Гемор, помоги с постраничной навигацией пожалуйста... Исходя из этого както ведь можно?:

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$file = file('messages.dat');
$file = array_reverse($file);
$count = count($file);
for ($i = 0; $i < $count; $i++) {
$text = explode("|",$file[$i]);
echo '<div class="nick">';
if($text[3] == '') { echo '<b>'.$text[0].'</b>'; } else { echo '<b>'.$text[0].'</b> ('.$text[3].')'; }
echo '</div>';
echo '<div class="info">';
if($text[1] != '') { echo 'Маил: '.$text[1].'<br/>'; } else { echo 'Маил: Не указан<br/>'; }
if($text[2] != '') { echo 'Сайт: <a href="http://'.$text[2].'/">'.$text[2].'</a><br/>'; } else { echo 'Сайт: Не указан<br/>'; }
echo '</div>';
echo '<div class="mess">';
echo ''.$text[4].'';
echo '</div>';
Gemorroj » 2009.04.29 22:47

зачем ты вот так написал?

echo ''.$text[4].'';

Nbbt » 2009.04.29 22:48

Это само сообщение, а как надо?
Добавлено спустя   1 минуту  47 секунд:
Оно как и имя обязательное поле, условие для вывода не нужно

Gemorroj » 2009.04.29 23:05

кавычки там не нужны.
и множественные echo тоже.
получаешь номер страницы, умножаешь его на количество выводимых сообщений (10 например). - это будет начальная цифра в цикле. затем к этой цифре прибавляешь количество выводимых сообщений (все та же 10) - это будет цифра, при которой скрипт выйдет из цикла.

Nbbt » 2009.04.29 23:29

Ничего не понял :(

Nbbt » 2009.05.01 20:17

Сделал....