Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как сделать, чтоб при обновленнии страницы данные повторно не передавались
 
 автор: ndach   (11.08.2004 в 07:04)   письмо автору
 
 

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

   
 
 автор: Artem S.   (11.08.2004 в 08:20)   письмо автору
 
   для: ndach   (11.08.2004 в 07:04)
 

Возможно вас устроит такой вариант

(станица с которой передают данные)---->скрипт добавления (здесь же ре-директ на третью станицу)--->(третья станица).

Смысл в том что сама запись в базу данных происходит отдельно. В скрипт возможно придется не только передавать те данные которые вы планируете записать в БД, но и переменную для ре-директа

   
 
 автор: cheops   (11.08.2004 в 10:59)   письмо автору
 
   для: Artem S.   (11.08.2004 в 08:20)
 

Добавлю только что редирект можно осуществить, разместив после добавления записи в базу данных HTTP-заголовок следующего формата

<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</HEAD></HTML>

Вместо index.php может быть как полный, так и относительный путь.

   
 
 автор: ndach   (11.08.2004 в 12:12)   письмо автору
 
   для: Artem S.   (11.08.2004 в 08:20)
 

А других вариантов нету? Просто коду меня уже написан, и мне просто нужно зафиксить эту проблему. А разделять код на два скрипта как то не очень хочется. . .

   
 
 автор: Artem S.   (11.08.2004 в 12:35)   письмо автору
 
   для: ndach   (11.08.2004 в 12:12)
 

1) Хранить в значениях сессии что данный пользователь уже отправил данные. В этом случае весь скрипт заносим в
<?php if ($_SESSION['key']==1) {
//тело скрипта
}  ?>

Запись в переменой key необходимо делать с передачей данных.

2) Проверять введенную запись. Если такая запись уже есть, то пропускать скрипт. Для это достаточно сделать проверку в начале скрипта. Недостаток, в том, что все равно будит обращение к БД.

   
 
 автор: ndach   (11.08.2004 в 12:57)   письмо автору
 
   для: Artem S.   (11.08.2004 в 12:35)
 

Я все таки решил остановиться на разбиении кода на две части, так несколько проблем решается.

Пасибо бальшое за советы

   
 
 автор: cheops   (11.08.2004 в 12:57)   письмо автору
 
   для: ndach   (11.08.2004 в 12:12)
 

Не используйте кнопку обновить... Перегрузите страницу программно, отослав соотвествующий заголовок:

<HTML><HEAD> 
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'> 
</HEAD></HTML> 

Если бы вы привели здесь код, можно было бы подумать вместе как лучше поступить...

   
 
 автор: ndach   (11.08.2004 в 12:58)   письмо автору
 
   для: cheops   (11.08.2004 в 12:57)
 

Код большой, да и мне надо как раз сделать так, чтобы не возникало ошибок при нажатии кнопки обновить.

   
 
 автор: cheops   (11.08.2004 в 13:13)   письмо автору
 
   для: ndach   (11.08.2004 в 12:58)
 

Если захотите оставить всё в одном файле, можно использовать несколько обработчиков

<?php
if(!isset($_POST['add'])) $act "add";
else 
$act "upd";
?>
<form method=post>
<input type=text name=pos >
<input type=hidden name=act value=<?php echo $act?>>
<input type=submit value=Обновить>
</form>
<?php
// Обработчик формы на добавление
if($_POST['act'] == 'add')
{
  
// добавляем в базу сообщение
}
if(
$_POST['act'] == 'upd')
{
  
// Просто перегружаем форму
    
echo "<HTML><HEAD>
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
          </HEAD></HTML>"
;
}
?>

Играясь со скрытыми полями - всегда можно добится от формы любого поведения, без кода, конечно сложно что-то более конструктивное написать....
Но у такого подхода есть один недостаток - код получается здорово замороченный и трудночитаемый - разделение формы и обработчика в этом плане сильно облегчает жизнь...

   
 
 автор: ndach   (11.08.2004 в 13:38)   письмо автору
 
   для: cheops   (11.08.2004 в 13:13)
 

Чего то я никак последний скрипт не могу разобрать. Я так понял переменная add посылается откуда то из др скрипта. А зачем нужна act, если здесь она не считывается??

   
 
 автор: cheops   (11.08.2004 в 13:54)   письмо автору
 
   для: ndach   (11.08.2004 в 13:38)
 

Да... чего-то я задумался :))) Поправил... Из формы мы отправляем переменную act, которая может принимать два значения: add - для добавления сообщения и upd - для обновления страницы.

   
 
 автор: ndach   (11.08.2004 в 14:27)   письмо автору
 
   для: cheops   (11.08.2004 в 13:54)
 

Короче говоря, если я посылаю переменные первый раз, то у меня переменной нету, а если обновляю то она создается

   
 
 автор: cheops   (11.08.2004 в 14:49)   письмо автору
 
   для: ndach   (11.08.2004 в 14:27)
 

Ну скорее так: когда происходит первое обращение к форме, элемент суперглобального массива $_POST['act'] не установлен и переменная $act получает значение "add" - добавлять данные. При нажатии на кнопку данные отправляются этому же скрипту, так как значение $_POST['act'] теперь равно "add" скрипт заходит в первый if и добавляет данные. При этом перменная $act получает значение "upd" - и если теперь нажать кнопку "Обновить" - скрипт пергрузит форму, так зайдёт во второй if. После этого нажатие кнопки приведёт опять к добавлению... Кстати, а почему вы не хотите использовать две кнопки - одна для добавления, другая для обновления.

   
 
 автор: ndach   (12.08.2004 в 07:33)   письмо автору
 
   для: cheops   (11.08.2004 в 14:49)
 

У меня скрипт разбит на 2 файла. Первый выводит форму для внесения различной инф в базу, всякие там <input>,<textarea>, и.т.д. Затем нажимается кнопка ок, и инф передается во второй скрипт, где уже вносится в базу.Т.е. кнопка добавить по существу находится в другом скрипте.
Можно добавить внизу кнопку обновить, но при этом мне все равно надо чтоб при нажити ctrl+r или "обновить" в IE у меня не возникало ошибок, вот.

   
 
 автор: cheops   (12.08.2004 в 09:50)   письмо автору
 
   для: ndach   (12.08.2004 в 07:33)
 

А зачем кнопка во втором скрипте? После добавления инфомации следует ухдить (редиректом) от туда - обатно к форме или к странице, где происходит отображение результатов добавления. Если кнопка всё-таки нужна, то как я выше писал, а s1271tvg ниже :), можно при помощи if всегда ограничить добавление информации в базу данных одним разом.

   
 
 автор: ndach   (12.08.2004 в 10:53)   письмо автору
 
   для: cheops   (12.08.2004 в 09:50)
 

У меня второй скрипт одновременно является скриптом отображения инфы

   
 
 автор: ndach   (12.08.2004 в 10:55)   письмо автору
 
   для: ndach   (12.08.2004 в 10:53)
 

thanks, я усе понял, ща буду ТВОРИТЬ

   
 
 автор: s1271tvg   (12.08.2004 в 08:28)   письмо автору
 
   для: ndach   (11.08.2004 в 07:04)
 

Собственно говоря у меня сделано просто и не надо на два файла разбивать и исправить уже существующий код достаточно как мне кажется легко
<?php
$sql
="insert into 'gbook' values (NULL,'".to_sql($name)."','".to_sql($email)."','".to_sql($theme)."','".to_sql($msg)."',$tim,'".to_sql($date)."',0,$parent_id,$num_msg,$first)";
$res=mysql_query($sql);
if(isset(
$res))
{
?>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Refresh" content="0; URL=index.php">
</head><body></body></html>
<?php
echo "Сообщение успешно добавлено";
exit;
}
else 
"Хер тебе а не сообщение";
?>

вот вроде и все потом хоть заобновляйся ничего повторно в базу не пишется. Вот.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования