Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2011, 19:09   #1
Vervolf
Пользователь
 
Аватар для Vervolf
 
Регистрация: 14.01.2011
Сообщений: 97
Вопрос Странное поведение PHP с MySQL..запись в базе дублируется после обновления страницы

Уважаемые программисты. Прошу Вас о помощи.Не знаю в чем дело.у меня есть страничка на php там форма данных отправляет данные в MySQL таблицу. все работает успешно, только с одним НО! если после добавления данных перезагрузить страницу, данные дублируются в базе и на самой странице. вот ссылка на саму страничку:http://stih.px6.ru
вот код страницы
PHP код:
<html>
<head>
 <title></title>
</head>

<body bgcolor="#000000" text="CCccCC">
<div align="center">
<?php
$i
=Rand(1,3);
if (
$_COOKIE['ii']==$i) {$i++;}
if (
$i==4) {$i=1;}
$_COOKIE['ii']=$i;
setcookie("ii",$_COOKIE['ii']);
echo(
"<center>");
if (
$i==1) {Echo("<img src='1.jpg'>");}
if (
$i==2) {Echo("<img src='2.jpg'>");}
if (
$i==3) {Echo("<img src='3.jpg'>");}
echo(
"</center>");
?>
<hr color="#222222">
<?php
$hostname 
"localhost"
$username "root"
$dbname "dbforum";
$password "pass01"
$userstable "tablemessage";

// устанавливаем соединение с базой данных 
$dbcnx = @mysql_connect($hostname,$username,$password); 
if (!
$dbcnx
{
  
// Выводим предупреждение
  
echo ("<P>В настоящий момент сервер базы данных не доступен, поэтому 
  корректное отображение страницы невозможно.</P>"
);
  
// Завершаем работу в случае неудачи
  
exit();
}

if (!@
mysql_select_db($dbname$dbcnx)) 
{
  echo( 
"<P>В настоящий момент база данных не доступна, поэтому
            корректное отображение страницы невозможно.</P>" 
);
  exit();
}
//
if(!empty($_GET['name']{0}))
{
if(!empty(
$_GET['text']{0}))
{
$gettext=htmlspecialchars($_GET['text']);//$msg = htmlspecialchars($msg);
$getname=htmlspecialchars($_GET['name']);
$ins "INSERT INTO $userstable (textmessage, name,time, date) VALUES('$gettext','$getname',current_time,now())"
mysql_query($ins) or die(mysql_error());
}
}

$handle mysql_query("select count(1) from $userstable");
$tmp  mysql_fetch_array($handle);
echo 
"Количество записей: ".$tmp[0]."<br>";

$exp mysql_query("select * from $userstable");
for (
$i=1;$i<=$tmp[0];$i++)
{
$exmess mysql_fetch_array($exp);
echo 
'Имя:'.$exmess['name'].' | ';
echo 
'Дата:'.$exmess['date'].' | ';
echo 
'Время:'.$exmess['time'].' |<br>';
echo 
'Сообщение: <br>'.$exmess['textmessage'].'<br>';
echo 
'-------------------- <br>';
}

//
/*$message=$_GET['mes'];
if(!empty($_GET['mes']{0}))
{
$query = "INSERT INTO $userstable (textmes) VALUES('$message')"; 
mysql_query($query) or die(mysql_error());
$message="";

}
$_GET['mes']="";//include */

//
if(mysql_close($dbcnx)) // разрываем соединение
{
  echo(
"ok");
}
else
{
  echo(
"Не удалось завершить соединение");
}
if(
$_POST)
{
     
header("Location: {$_SERVER['HTTP_REFERER']}");
     exit;
}
?>


<?php
/*While ($ba!==20)
{
Echo("<br>");
$ba++;
}*/
?>
<hr color="#222222">

<form action="index.php" method="get">
Имя:<br>
<input type="text" name="name" value=""><br>
Текст сообщения:<br>
<textarea name="text" cols="50" rows="10"></textarea><br>
<input type="submit" value="Добавить запись"><br>
</form>

</div>
<hr color="#222222">
<Center>
<font color="CCccCC">
<?php
$_COOKIE
['pos']=$_COOKIE['pos']+1;
setcookie("pos",$_COOKIE['pos']);
echo 
'Вы посетили эту страницу '.'<font color="FF0000">'.$_COOKIE['pos'].'</font>'.' раз';
?>
</font>
</center>
</body>
</html>
Vervolf вне форума Ответить с цитированием
Старый 29.07.2011, 20:13   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

1. Для передачи значений формы используйте метод POST.
2. Вам бы желательно упорядочить ваш код по принципу "PHP-код сверху, HTML-вывод снизу" - т.е. обработка форм,cookies, запросы к БД - весь этот код должен быть вверху документа, а весь вывод в браузер - под ним.
3. Чтобы избежать повторной записи данных в БД - нужно после записи делать принудительный редирект на эту же страницу - это позволит очистить POST и GET.
Сделать это можно при помощи функции header() - но до её вызова не должно быть никакого вывода в браузер(потому нужен п.2), либо при помощи javascript.
Andkorol вне форума Ответить с цитированием
Старый 29.07.2011, 20:25   #3
Vervolf
Пользователь
 
Аватар для Vervolf
 
Регистрация: 14.01.2011
Сообщений: 97
По умолчанию

Спасио, все попробую!
Vervolf вне форума Ответить с цитированием
Старый 29.07.2011, 20:30   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
3. Чтобы избежать повторной записи данных в БД - нужно после записи делать принудительный редирект на эту же страницу - это позволит очистить POST и GET.
Сделать это можно при помощи функции header() - но до её вызова не должно быть никакого вывода в браузер(потому нужен п.2), либо при помощи javascript.
Ели вы таки будете использовать GET - то редирект должен выполняться без GET-параметров, естественно.
Andkorol вне форума Ответить с цитированием
Старый 29.07.2011, 20:37   #5
Vervolf
Пользователь
 
Аватар для Vervolf
 
Регистрация: 14.01.2011
Сообщений: 97
По умолчанию

Все заработало!Спасибо большое!просто нужно было поменять метот GET на метод POST и массив изменить.
Vervolf вне форума Ответить с цитированием
Старый 29.07.2011, 20:38   #6
Vervolf
Пользователь
 
Аватар для Vervolf
 
Регистрация: 14.01.2011
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Ели вы таки будете использовать GET - то редирект должен выполняться без GET-параметров, естественно.
а как его так выполнить?чтобы не передавать GET параметры.
Vervolf вне форума Ответить с цитированием
Старый 29.07.2011, 20:47   #7
Vervolf
Пользователь
 
Аватар для Vervolf
 
Регистрация: 14.01.2011
Сообщений: 97
По умолчанию

блин.. работает только на локальной машине.. а когда заливаю на серв(настройки подключения меняю), какой то сумбур.. форма ввода вообще пропадает после написания сообщения.. что за ерунда?
Vervolf вне форума Ответить с цитированием
Старый 29.07.2011, 20:49   #8
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Vervolf Посмотреть сообщение
а как его так выполнить?чтобы не передавать GET параметры.
Ну в вашем случае это будет просто header('Location: index.php');

Я имел ввиду, что в случае с GET вам не подойдет вариант с использованием $_SERVER['HTTP_REFERER'], т.к. там будет содержаться часть строки с данными (http://stih.px6.ru/index.php?name=_name&text=_text).
Andkorol вне форума Ответить с цитированием
Старый 29.07.2011, 20:54   #9
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от Vervolf Посмотреть сообщение
блин.. работает только на локальной машине.. а когда заливаю на серв(настройки подключения меняю), какой то сумбур.. форма ввода вообще пропадает после написания сообщения.. что за ерунда?
Форма ваша вероятно пропадает из-за этого:
PHP код:
if($_POST

     
header("Location: {$_SERVER['HTTP_REFERER']}"); 
     exit; 

так как вы теперь используете POST.
Andkorol вне форума Ответить с цитированием
Старый 29.07.2011, 20:56   #10
Vervolf
Пользователь
 
Аватар для Vervolf
 
Регистрация: 14.01.2011
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
Форма ваша вероятно пропадает из-за этого:
PHP код:
if($_POST

     
header("Location: {$_SERVER['HTTP_REFERER']}"); 
     exit; 

так как вы теперь используете POST.
а без этого на локальной машине не работает..ну, так же сообщения дублируются..
Vervolf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
php поиск по базе Mysql Dmitry1983 PHP 8 27.06.2011 18:01
Обновления после версии 4 PHP Che Guevara PHP 1 27.07.2010 13:07
Странное поведение gets alex_alpha Общие вопросы C/C++ 3 27.03.2010 18:21
Запрос к MySQL без обновления страницы denisov PHP 3 02.03.2010 19:39
Странное поведение DLL Yurk@ Компоненты Delphi 4 01.02.2009 01:23