| |
|
|
| | На странице есть форма, данные которой по submit добавляются в базу данных на сервере. После добавления данных в базу страница перезагружается.
Если после перезагрузки страницы нажать F5 (обновить страницу), то в базу данных добавляется ещё одна запись, аналогичная последней добавленной, т.к. в форме по прежнему содержатся данные от предыдущей загрузки формы. Как можно это предотвратить?
P.S.
В осле данного эффекта нет. После обновления страницы дублирования записей в базе данных не происходит, т.к. в осле форма после F5 не содержит никаких данных. | |
| |
|
|
| |
|
|
| |
для: Хулиган
(22.11.2007 в 08:49)
| | | Делать перенаправление на другую страницу после записи в базу:
<?
header('location: file.php');
|
Или устанавливать какой либо флаг для проверки. | |
| |
|
|
| |
|
|
| |
для: Хулиган
(22.11.2007 в 08:49)
| | |
<?
exit('<HTML><HEAD><META HTTP-EQUIV="REFRESH" CONTENT="0; URL='.$_SERVER['HTTP_REFERER'].'"></HEAD><BODY></BODY></HTML>');
|
смысл в том чтобы после записи в базу поставить exit в тексте которого содержется пренаправление назад или на любую другую страницу... | |
| |
|
|
| |
|
|
| |
для: KPETuH
(22.11.2007 в 09:04)
| | | так а состояние кнопки кто проверять будет? Вы же когда на кнопку давите вы получаете скрытую переменную в POST["type"] - вот и проверяйте ее наздоровье. Хоть 500 раз рефреш давите, а пока кнопку не надавите $type никогда не станет равна saveKart
<input type='hidden' name='type' value='saveKart'>
|
| |
| |
|
|
| |
|
|
| |
для: Alex Boxgorn
(22.11.2007 в 11:50)
| | | не могу сказать точно, но помоему это не выход :) при рефреше скорее всего будет отправлятся ваше скрытое поле :) | |
| |
|
|
| |
|
|
| |
для: KPETuH
(22.11.2007 в 12:33)
| | | с каких шишов оно отправляться будет? эти переменные передаются по методу POST. А отправка осуществляется только при нажатии кнопки с type=submit
echo $_POST["type"] // при нажатии рефреш вы ничего не получите в этой переменной, а при нажатии на кнопку $_POST["type"] будет равен 'saveKart'
<input type='hidden' name='type' value='saveKart'>
<input type='submit' name='submit' value='Сохранить изменения' class='button'>
|
только после операций проводимых вами при нажатии кнопки не забудьте для страховки, если так хотите, удалить переменную. | |
| |
|
|
| |
|
|
| |
для: Alex Boxgorn
(22.11.2007 в 12:42)
| | | при рефреше происходит повторнаая передача данных, замечено на некоторых браузерах, поэтому и придумана конструкция предложенная мною... | |
| |
|
|
| |
|
|
| |
для: Alex Boxgorn
(22.11.2007 в 12:42)
| | | К сожалению, ни один из предложеных способов не работает
На форме есть input, который изначально пустой, а по нажатию кнопок в форме в него прописывается либо 'save', либо 'add'.
Но при рефреше этот input не пустой, а содержит значение, которое в него было записано при предыдущем submit'е...
Поэтому проверка скрытого input лишена смысла: он никогда не бывает пустым при обновлении страницы.
Способ с exit не работает возможно по причине того, что скрипт, добавляющий данные в базу, находится в том же файле, что и html-код страницы с формой.
В общем файл editnews.php выглядит так:
<?
if(isset($_POST['action'])) {
$link = mysql_connect("localhost", "user", "pass") or die ("Could not connect");
mysql_select_db ("base") or die ("Could not select database");
mysql_query("SET NAMES cp1251");
if ($_POST['action'] == "save"){
$i=1;
while (isset($_POST["message".$i] )){
$message = trim($_POST["message".$i]);
$prevmessage = $_POST["prevmessage".$i];
if (0 != strlen($message)){
//update news
mysql_query("UPDATE `news` SET content = '$message' WHERE content = '$prevmessage'");
}
else{
//delete news
mysql_query("DELETE FROM `news` WHERE content = '$prevmessage'");
}
$i++;
}
}
else if ($_POST['action'] == "add"){
if (isset($_POST["newmessage"] )){
$newmessage = trim($_POST["newmessage"]);
$added = "NOW()";
if (0!=strlen($newmessage)){
$sql_str = "INSERT INTO `news` VALUES (";
$sql_str.= " $added,";
$sql_str.= " '$newmessage',";
$sql_str.= " '')";
$result = mysql_query($sql_str);
}
}
}
mysql_close($link);
//exit('<HTML><HEAD><META HTTP-EQUIV="REFRESH" CONTENT="0; URL='.$_SERVER['HTTP_REFERER'].'"></HEAD><BODY></BODY></HTML>');
}
?>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title></title>
</head>
<body>
.....
.....
<form name=frm_edit action=editnews.php method=post>
.....
<input type=hidden name='action' id='action' value=''>
<input type=button value=' ' onclick="send_edit()">
<input type=button value=' ' onclick="send_add()">
</form>
.....
.....
</body>
<script type="text/javascript" language="javascript">
function send_edit(){
document.getElementById('action').value = "save";
document.forms['frm_edit'].submit();
}
function send_add(){
document.getElementById('action').value = "add";
document.forms['frm_edit'].submit();
}
</script>
</html>
|
| |
| |
|
|
| |
|
|
| |
для: Хулиган
(22.11.2007 в 14:05)
| | | поробуйте использовать разные форму на каждую кнопку и не использоватья яваскрипт в данным образом... | |
| |
|
|
| |
|
|
| |
для: Хулиган
(22.11.2007 в 14:05)
| | | Что-то не верится, что не работает:
<?
mysql_close($link);
header('location: path/file.php');
|
и никакие F5 не сработают уже. | |
| |
|
|
| |
|
|
| |
для: sim5
(22.11.2007 в 14:22)
| | | header('location: /editnews.php'); я пробовал первым делом, ещё до того, как задать свой вопрос, но этот способ даёт ошибку:
Cannot modify header information - headers already sent by (output started at z:\home\site..ru\www\editnews.php:2) in z:\home\site.ru\www\editnews.php on line 38.
Видимо придётся разнести форму и скрипт по её обработки в разные файлы...
Спасибо всем. | |
| |
|
|
| |
|
|
| |
для: Хулиган
(22.11.2007 в 17:03)
| | | Про это Cannot modify header information - headers already sent by... уже столько раз говорилось, что ей богу вам должно быть просто стыдно. Это не header('location: /editnews.php'); не работает, это у вас перед пердачей заголовка, есть вывод в браузер! | |
| |
|
|
| |
|
|
| |
для: sim5
(22.11.2007 в 17:21)
| | | Мне не стыдно. Я знаю, что нельзя ничего выводить до передачи заголовка. И нечего не вывожу в браузер. Весь код до header(location) приведен выше без каких-либо сокращений. И там нет вывода в браузер. | |
| |
|
|
| |
|
|
| |
для: Хулиган
(22.11.2007 в 17:43)
| | | Если бы не было, то вы бы получили это сообщение только в том случае, если перед ним получили либо замечание или ошибку, например, при записи в базу. Но вы об этом не упоминаете, значит у вас где-то пустая строка, или перед тегом РНР есть пустая строка, а достаточно и одного пробела. Проверьте еще раз. | |
| |
|
|
| |
|
|
| |
для: sim5
(22.11.2007 в 17:21)
| | | Посыпаю голову пеплом :(((
Оказывается, пустая строка, в которой нет абсолютно ничего, воспринимается как вывод в браузер...
Пустая строка была оставлена для удобства чтения кода, а оказалось, что она воспринимается как вывод в браузер и мой header('location') по этой причине не работал.
Ещё раз всем спасибо. Проблема решена. Форма больше не содержит прежних данных при обновлении через header('location') | |
| |
|
|