[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Отправка данных из формы в php-файл
stromen
Только осваиваю php на примере простенького сайта.
У меня есть страница, на которой пользователи прочитав заметку могут оставлять комментарии. В форме -> input-поле для ввода имени, textarea для текста и кнопочка-submit (ну, и пару скрытых полей для дополнительных переменных).
По нажатию кнопки данные отправляются в файл commets.php методом post.
Файл commets.php обрабатывает данные (проверяет все ли заполнено, обрезает теги и т. д.) и если все в порядке, то добавляет комментарий в базу данных и перенаправляет на страницу с комментариями. Вот так:
PHP
header("Refresh: 0;url=$location");


Все работает, но вот только после удачной отправки комментария, если нажать кнопку "Назад" в браузере, то открывается файл commets.php blink.gif И если теперь нажать кнопку "Обновить" то в базу добавиться только что добавленная заметка.

В поиске ответа копался в исходниках довольно известного блог-движка wordpress. Но не понял - там много всего - мне сразу не побороть wink.gif Там тоже по нажатию кнопки данные обрабатывает php-файл, но после обработки данных, добавлении их в базу и перенаправлении на страницу комментариев, если нажать кнопку "Назад" в браузере, то перехода к php-файлу-обработчику не происходит.

Вопрос в том, как избавиться от этого эффекта в моем случае?



Спустя 12 минут, 43 секунды (27.12.2008 - 23:22) Guest написал(а):
Сохраняй данные в сессию. И проверяй - если только что комментировал, то не отрывай страницу. Или же добавление комментария через ajax

Спустя 1 час, 35 минут, 48 секунд (28.12.2008 - 00:58) FatCat написал(а):
Файл-обработчик генерит html-код страницы мета-рефреша. По кнопке "назад" браузер грузит его из кеша, не стучась на сервер. wink.gif

Спустя 33 минуты, 49 секунд (28.12.2008 - 01:32) stromen написал(а):
Цитата (FatCat @ 27.12.2008 - 21:58)
Файл-обработчик генерит html-код страницы мета-рефреша. По кнопке "назад" браузер грузит его из кеша, не стучась на сервер. wink.gif

Вот именно smile.gif
Но в wordpress как-то с этим борятся. И кнопка "назад" не открывает php-файл-обработчик, а переходит сразу на страницу с комментами.
Может кто знает как это реализовать?

Про ajax сложновато... sad.gif Как я понял это какой-то жосткий сплав серверных и браузерных скриптовых языков, требующий значительных умений и опыта в разработке. Я же пока только начинаю smile.gif

Спустя 10 часов, 42 минуты, 40 секунд (28.12.2008 - 12:15) sergeiss написал(а):
Недавно тут говорили на эту тему.

Безо всякого аджакса можно сделать. Просто в случае правильно переданных параметров происходит сначала запись в БД, затем идет переадресация на промежуточную страницу (где пишется текст типа "Ваши данные удачно обновлены"), а затем идет переадресация уже с промежуточной на исходную страницу.
При этом избавляешься от всех описанных тобой проблем.

Причина - все переданные через POST данные теряются (уже после записи в БД!!!), поэтому обновлению нечего добавлять. Все поля для ввода чистые.

PS. Если я непонятно объяснил -спрашивай.

Спустя 1 день, 6 часов, 46 минут, 31 секунда (29.12.2008 - 19:01) stromen написал(а):
Хм... То ли я вас не понимаю, то ли вы smile.gif Может я плохо объсянил? Давайте попробуем еще раз wink.gif
Итак, у меня есть два файла:
1 - view.php, в котором есть статья, а внизу статьи - форма для отправки комментария.
2 - comments.php, в который посылаются данные из формы, обрабатываются и заносятся в базу. После занесения происходит перенаправление на файл view.php.

Все происходит по такой схеме:
user posted image

Как видно, в позиции 2 в браузере открывается файл comments.php, но это происходит очень быстро и почти незаметно. НО!!!

После удачного добавления комментария в базу мы находимся в позиции 3. Как видно, если мы нажмем "Назад" в браузере, то откроется файл comments.php. А если потом нажать "Обновить" то, естественно, в базу полетит еще один точно такой же комментарий.

Как я понял, вы предлагаете сделать еще один файл (скажем, OK.php), который будет говорить что "Ваш комментарий успешно добавлен" и будет перенаправлять на страницу с комментариями. То есть, схема будет такова:
user posted image

Тогда мне непонятен смысл. Пользователь два раза нажмет кнопку "Назад" и окажется в том же comments.php.

Вот код файла comments.php.
PHP
<?php
include 
("blocks/bd.php"); // тут происходит подключение к mySQL
if (isset($_POST['author'])) {
  $author = $_POST['author'];
}
if (isset($_POST['text'])) {
  $text = $_POST['text'];
}
if (isset($_POST['guard'])) {
  $guard = $_POST['guard'];
}
if (isset($_POST['sub_com'])) {
  $sub_com = $_POST['sub_com'];
}
if (isset($_POST['id_news'])) {
  $id_news = $_POST['id_news'];
}
if (isset($_POST['id_guard'])) {
  $id_guard = $_POST['id_guard'];
}
// Проверка правильности ввода данных
if (isset($sub_com)) {
  if (isset($author)) {
    trim($author);
  } else {
    $author='';
  }
  if (isset($text)) {
    trim($text);
  } else {
    $text='';
  }
  if (empty($author) or empty($text) or $author=='Имя' or $text=='Текст') {
    exit ("<table class='warning' width='100%' height='100%' border='0' cellpadding='0' cellspacing='0'>
           <tr>
             <td align='center'>
               Не все поля заполнены.<br>
               Их не так много. Пожалуйста, заполните все.<br>
               <input name='back' type='button' value='Назад' onclick='jаvаscript:self.back();'>
             </td>
           </tr>
           </table>"
);
  }
  $author = stripslashes($author);
  $text = stripslashes($text);
  $author = htmlspecialchars($author);
  $text = htmlspecialchars($text);
  $result = mysql_query("SELECT num FROM guard WHERE id=$id_guard",$db);
  $myrow = mysql_fetch_array($result);
  if ($guard != $myrow['num']) {
    exit ("<table class='warning' width='100%' height='100%' border='0' cellpadding='0' cellspacing='0'>
           <tr>
             <td align='center'>
               Введен неправильный код.<br>
               Попробуйте еще раз<br>
               <input name='back' type='button' value='Назад' onclick='jаvаscript:self.back();'>
             </td>
           </tr>
           </table>"
);
  }
  $now = date("d.m.Y - H:i");
  $result = mysql_query("INSERT INTO news_comments (news, author, text, date) VALUES ('$id_news', '$author', '$text', '$now')", $db);
  $location = 'view.php?id='.$id_news.'#comments';
  header("Refresh: 0;url=$location");
  exit();
}

Спустя 16 часов, 42 минуты, 31 секунда (30.12.2008 - 11:44) sergeiss написал(а):
Сорри dry.gif , ты прав. Я недопонял немного по написанному ранее тексту. Да, еще один промежуточный файл - это будет уже перебор.
Но совсем уж защититься от любителей кнопки "Назад" вряд ли удастся.

Спустя 1 час, 13 минут, 19 секунд (30.12.2008 - 12:57) stromen написал(а):
rolleyes.gif
Я не зря приводил пример wordpress. Там тоже есть форма отправки комментария. И данные тоже пересылаются в php-файл по нажатию кнопки submit, но вот после удачного добавления комментария, если нажать кнопку "назад", то промежуточный php-файл не открывается.

Я думал может как-то можно запретить кэширование данных, чтобы даже если переходило на файл comments.php то данные, переданные ему, не сохрянялись...

Ну ладно, и на этом спасибо smile.gif

Спустя 3 минуты, 43 секунды (30.12.2008 - 13:01) bret написал(а):
Через header("Location: ...") не пробовал7
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.