Forum Webscript.Ru

Программирование => PHP => Тема начата: Derbyt от 14 Ноября 2002, 18:38:29

Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Derbyt от 14 Ноября 2002, 18:38:29
После того, как пользователь отправит форму скрипту, он (пользователь), как и положено видит результат своих трудов. Но если он тыкнет кнопку в браузере обновить, то добавиться такая же запись, и так до бесконечности. Скрипт записывает значения переменных формы в БД. Как сделать так, чтобы при обновлении записи в БД не добавлялись.
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: mike от 14 Ноября 2002, 18:48:41
Например так, как сделано на этом форуме при вставке сообщения: результат работы скрипта - страница, которая перенаправляет на страницу результата.
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: я... от 14 Ноября 2002, 18:55:11
согласен, иначе никак... =(((
header("Location: your.page");
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Derbyt от 14 Ноября 2002, 18:55:19
Если я правильно понял, то предлагается разделить скрипт на 2 файла - скрипт формы и скрипт страницы с результатами
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: я... от 14 Ноября 2002, 18:57:45
Derbyt,
зачем??
просто после операции отправляешь пользователя на ту же самую страницу, но уже без параметров....
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Макс от 14 Ноября 2002, 19:06:53
я еще часто в таблицу добавляю поле
hash char(32) и делаю его уникальным ключом.

А в скрипте при добавлении определяю его как:
$hash = md5(implode("", $_POST));
В таком случае второй раз строка добавлена не будет, ни при обновлении, ни при двойном нажатии сабмита
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Derbyt от 14 Ноября 2002, 19:16:09
Что-то я не догоняю...
Приведу кусок кода в котором происходит добавление записи. Подскажи, куда сунуть это перенаправление.

//Здесь идет проверка мессаги и запись формы в БД
if (isset($message)) {
$myGB->add_record($name, $town, $email, $message, $smilies);
 }
//Здесь идет проверка - нуно показать пользователю форму или не нуно -соответственно если не нуно, показывается результат
if (isset($addrec)){
echo "

Оставьте свое сообщение:
";
echo "(*) Обязательные поля";
echo "

";
echo "";
echo "";
echo "";
echo "";
echo "
* Имя:
* Сообщение:
Город:
Email:
";
echo "
";
echo "";
}
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Меняздесьдавнонет от 15 Ноября 2002, 00:23:12
я шизею, дорогая редакция...

Вставить после
$myGB->add_record($name, $town, $email, $message, $smilies);

Но такого измывательства над орумом я давно не видел.
Это ж чем надо думать, чтобы каждую строку в рнр обуть.......
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Derbyt от 15 Ноября 2002, 09:46:17
Парни, простите меня пожалуйста. Я больше так не бу...
И, конечно, спасибо всем поможавшим
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Derbyt от 15 Ноября 2002, 11:09:07
Может я бестолковый совсем, но ведь хедеры вставляются до генерации хтмл, а в моем (сильно запущеном) случае сначала идет скрипт на яве, потом хтмл, а уж потом описание класса и исполняемый код. Кто-нить может подсказать, как перегрузить страницу без параметров не используя хедер. Спасибо.
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Макс от 15 Ноября 2002, 11:20:36
если по простому и не вдаваясь в подробности протокола HTTP
то в самое начало скрипта вставь ob_start(); :

ob_start();
... //твой скрипт
$myGB->add_record($name, $town, $email, $message, $smilies);
header("....");
exit;
...// дальше твой скрипт
?>
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Derbyt от 15 Ноября 2002, 11:45:26
2 Макс

Советом воспользовался, но к сожалению ничего не получилось. ПХП пишет мол -  Cannot add header information - headers already sent by (guest.php:1) in guest.php on line 369. А строка 369:
header ("Location: [url]http://test2.ru/guest.php[/url]");
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Croaker от 15 Ноября 2002, 12:18:46
"сколько раз твердили миру..." (с)

1) Ну ребят, не нельзя же так... Не отсылаются хеадеры после любого print`а, echo или инклуда html файла...

2) Зачем ты пересылаешь на ссылку :) Ты хочешь, чтобы тебя на http://test2.ru/guest.php перенсло?

header("Location: http://test2.ru/guest.php").

3) Если у тебя проблема в том, чтобы при релоуде страници поле не добавлялось - как вариант: http://www.azznews.ru - посмотри как там сделано в добавлении коментариев к статьям.
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Макс от 15 Ноября 2002, 15:30:23
Цитировать
1) Ну ребят, не нельзя же так... Не отсылаются хеадеры после любого print`а, echo или инклуда html файла...
еще и как отсылаются :cool:  если буферизацию включить
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Croaker от 15 Ноября 2002, 15:35:22
Цитировать
еще и как отсылаются  если буферизацию включить


ИМХО изврат
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Макс от 15 Ноября 2002, 15:46:24
для страниц, которые строятся по принципу:
switch ($action) {
  case "add":
   // добавление чего-то
  case "edit":
   // код для редактирования

...
  default:
   ...
}
?>
иногда очень удобно.



ЗЫ
только не надо сейчас разводить флейм по поводу "отстойности" такой структуры
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: я... от 15 Ноября 2002, 15:58:17
может проще исключить из ф-ции add_record вывод, вероятнее всего, сообщения "ваше сообщение отправлено"...
а вообще, можно сделать и так:

 echo "";
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Derbyt от 16 Ноября 2002, 18:51:51
2 Макс

Браузер находит этот рефреш и перегружает страницу, а там опять рефреш и т.д. и т.д. Может ты хотел сказать, что надо вставить этот рефреш в иф...елсе, по какому-либо передаваемому параметру. Но я думаю, что все же проще проверять, например, последнюю мессагу и сравнивать с текущей, и, если одинаковые, то ничего добавлять в БД не надо. Вот только с твоим советом касаемо $hash = md5(implode("", $_POST));, не разобрался.
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: я... от 17 Ноября 2002, 11:41:26
по-моему это глупость...
делай так:

1.
function post_message(...)
{
...
echo "";
}


2.
function list_messages(...)
{
...
}


3.
if(!isset($action))$action="listing";
if(($action=="post")&&($message!=""))post_message(...);
else list_messages(...);


сорри, но более понятно, я уже не смогу написать...
Название: При обновлении страницы юзером добавляется новая запись -как этого избежать !??
Отправлено: Макс от 17 Ноября 2002, 14:24:18
Derbyt
1. в форме кнопку оформляеш так:

(здесь главное что у кнопки есть имя submit

2. в скрипте добавление оформляеш так:

if ($submit) {
... // твой код который добавляет запись в бд
header("Location: http://".$HTTP_HOST.$PHP_SELF);
exit;
}
... // далее твой код выводящий записи


Цитировать
Но я думаю, что все же проще проверять, например, последнюю мессагу и сравнивать с текущей, и, если одинаковые, то ничего добавлять в БД не надо.
делай как хочеш, я просто тебе предложил вариант в котором не надо никаких сравнений делать, это за тебя будет делать mysql

Цитировать

 Вот только с твоим советом касаемо $hash = md5(implode("", $_POST));, не разобрался.

1. Ты знаеш что такое md5?
2. Ты знаеш что такое unique key в базах данных?
$hash = md5(implode("", $_POST)); - просто определяется md5-хеш текущей записи. После этого определения делаеш
INSERT INTO твоя_таблица (список полей, ... , hash)
VALUES (список значений , ... , \'$hash\');
и все mysql сама проверит, есть ли такая запись в таблице, если есть, то запись не будет добавляться.