Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Гостевая на РНР. Баг или недостаток кода?!

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Проблема со сценарием
kozakmamai
Отправлено: 08 Июня, 2007 - 08:31:48
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2007  
Откуда: Украина


Помог: 0 раз(а)




Всем привет!
Вот хочу обратиться за помощью.
Код пока приводить не буду, авось обойдется. Вот в чем вопрос:
Прочитал статью по созданию гостевой на РНР (кстате, у вас на ресурсе Улыбка ) без использования базы данных, то-есть все записываеться в *.dat файл. При создании же собственного кода я все уяснил из примера и написал свой. На локальном компе установил XAMPP (Апач, интерпретатор РНР, ну все что нужно). Проверил работу под разными браузерами. Все гуд. Но вот когда закинул в инет на хост, заметил збой, который заключался в следующем:
-------------------------------- -------------------------------- ------------------
При внесении данных от пользователя, стараничка записала их и выводила гостевую с первой записью. При внесении второй, страничка выводит три сообщения: Первое - которое я оставил первым, второе - тоже сообщение что и первое только на 3 сек (3...6 сек) позже записаное и третье - второе (последним оставленное).
-------------------------------- -------------------------------- ------------------
Если короче то почему-то два раза записываються данные но с интервалом в секунды.
Что это может быть? Может код? А может хост?
-------------------------------- -------------------------------- ------------------
я вот тут сижу тестирую гостевую, так после записи шестого сообщение между 6 и 5 появилось второе...вообще ничего не пойму Недовольство, огорчение
Может это связано с кэшированием?
Помогите! плз.
 
 Top
evgenijj
Отправлено: 08 Июня, 2007 - 09:13:07
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




kozakmamai пишет:
Код пока приводить не буду, авось обойдется.

Не обойдется.
 
 Top
kozakmamai
Отправлено: 08 Июня, 2007 - 09:47:31
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2007  
Откуда: Украина


Помог: 0 раз(а)




Вот код
Сори за мусор, прошу конструктивно критиковать
Код большой я привел функцию записи и тело которое визывает функции, и тело это кажись стоит не там где нужно Недовольство, огорчение
-------------------------------- -------------------------------- -------------------------
function write_table()
{
global $file_table;
global $max_rec;
$recs = file($file_table) or ($recs = array());
$name = strip_tags(trim($_GET['msg_name']));
$mail = strip_tags(trim($_GET['msg_mail']));
$url = strip_tags(trim($_GET['msg_url']));
$message = strip_tags(trim($_GET['msg_message']));

$name = str_replace("|","¦",$name);
$mail = str_replace("|","¦",$mail);
$url = str_replace("|","¦",$url);
if(strlen($message)>1000) $message = substr($message,0,1000);
$message = str_replace("|","¦",$message);
$message = stripslashes($message);
$message = str_replace("rn","<br>",$message);
$message = str_replace(" ","&nbsp;",$message);

array_unshift($recs,"$name|$mail|$url|".date('d.m.Y,H:i:s')."|$messagen");
if(count($recs)>$max_rec) $recs = array_slice($recs,0,$max_rec);
$f = fopen($file_table,"w");
for($i=0; $i<count($recs); $i++)
{
fwrite($f,$recs[$i]);
}
fclose($f);
}

//-----BEGIN-------------------- -------------------------------- -----------------------------

if(isset($_COOKIE['autoriz']))
{
$form_lock = "on";
$in_message = "Привіт, ".$_COOKIE['name']."!<br>";

if(isset($_GET['del_msg'])) del_msg_table();
if(isset($_GET['msg_out'])) {del_cookie(); $form_lock = "off"; $in_message = "Ви зайшли як гість!";}
}

else
{
$form_lock = "off";
$in_message = "Ви зайшли як гість!";
if(isset($_GET['msg_log']) && ($_GET['msg_log'] != null) && ($_GET['msg_pass'] != null))
{
$a = autoriz();
if($a[0] === "yes")
{
set_cookie();
$form_lock = "on";
$in_message = "Привіт, ".$a[1]."!";
write_autoriz($a[1]);
}
else $in_message = "Ви ввели не вірний логін або пароль";

}
if(isset($_GET['msg_log'])&&(($_GET['msg_log'] == null)||($_GET['msg_pass'] == null))) $in_message = "Помилка при введенні данних!";

}

if(isset($_GET["msg_name"]))
{
write_table();
}

write_page();
read_table();
echo "</div>";
?>

<html>
<head>
<title></title>
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>

<fieldset style="padding:10px;width:550px;border: 1px solid red; float:left">
<form action="index.php" method="get" name="fild1">
<table width="500">
<tr>
<td width="200" class="align">
Введіть Ім"я:</td><td><input type="text" name="msg_name" size="20" <?php if($form_lock == "on") echo "disabled";?>></td>
</tr>
<tr>
<td class="align">
E-mail:</td><td><input type="text" name="msg_mail" size="20" <?php if($form_lock == "on") echo "disabled";?>></td>
</tr>
<tr>
<td class="align">
URL:</td><td><input type="text" name="msg_url" size="20" <?php if($form_lock == "on") echo "disabled";?>></td>
</tr>
<tr>
<td class="align">
Введіть текст:</td><td><textarea name="msg_message" cols="20" rows="3" style="color:red" <?php if($form_lock == "on") echo "disabled";?>></textarea></td>
</tr>
<tr>
<td class="align">
Відправити данні:</td><td><input type="submit" value="Відправити" <?php if($form_lock == "on") echo "disabled";?>></td>
</tr>
</table>
</form>
</fieldset>

<fieldset >
<form action="index.php" method="get" name="fild2">
<table width="300" height="175">
<?php
if($form_lock == "on")
{
echo "<tr><td><input type='submit' value='ВИХІД'><input type='hidden' name='msg_out' value='out''><p onClick='stat()'>stat</p></td></tr>";
echo "<script type='text/javascript'>function stat(){helpwindow = window.open('stat.dat','myhelp','toolbar=o,width=300, height=200');}</script>";
}
else
{
echo "<tr><td width='100'>Логін</td><td><input type='text' name='msg_log' maxlen='5' size='10'></td></tr>";

echo "<tr><td>Пароль</td><td><input type='password' name='msg_pass' maxlen='5' size='10'><td></tr>";

echo "<tr><td></td><td><input type='submit' value='ВХІД'><td></tr>";
}
?>
</table>
</form>
<?php
//echo "Чи існує змінна in_message =".isset($in_message)."<br>";
if(isset($in_message)) echo $in_message;
?>
</fieldset>
<br><br>
</body>
</html>
 
 Top
evgenijj
Отправлено: 08 Июня, 2007 - 09:53:04
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Ну и зачем мне произвольно выдранный кусок кода. Может ты эту функцию дважды вызываешь - вот и дублируются записи. Нужны все исходники, а не обрывки.
 
 Top
evgenijj
Отправлено: 08 Июня, 2007 - 12:06:19
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Заменяем
PHP:
скопировать код в буфер обмена
  1.  
  2. f(isset($_GET["msg_name"]))
  3. {
  4.     write_table();
  5. }
  6.  

на
PHP:
скопировать код в буфер обмена
  1.  
  2. if(isset($_GET["msg_name"]))
  3. {
  4.     write_table();
  5.     header("Location: ".$_SERVER["PHP_SELF"]);
  6. }
  7.  


Кстати, вот это if ( $_GET['msg_log'] == null ) не слишком удачное решение (если вообще рабочее):
http://php.su/functions/?is-null
Для NULL-значений не существует понятий "больше", "меньше", "равно".
 
 Top
kozakmamai
Отправлено: 08 Июня, 2007 - 12:09:34
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2007  
Откуда: Украина


Помог: 0 раз(а)




NULL
Так если все же кнопка передачи формы была нажата и формально данные были пересланы и проверка isset дает true, но значения нет. Так как лучше проверять? $_GET["msg_log"] == ""
header
Хм..дик ростолкуй плз. что да к чему
 
 Top
evgenijj
Отправлено: 08 Июня, 2007 - 12:19:39
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Ты отправляешь данные формы методом GET. Соответственно, в адресной строке браузера после отправки формы будет
http: //server.com/index.php ? name=Peter & msg=MyMessage
Если нажать кнопку "Обновить" или "Переход" - сообщение будет записано еще раз. После записи в файл я перенаправляю пользователя на ту же страницу, но без GET-параметров:
http://server[dot]com/index.php

P.S. if ( !empty( $_GET["msg"] ) ) { ... }
Фунция empty() возвращает TRUE если переменная не установлена, равна нулю или пустой строке
 
 Top
kozakmamai
Отправлено: 08 Июня, 2007 - 12:21:37
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2007  
Откуда: Украина


Помог: 0 раз(а)




А если использовать передачу по методу POST это избавит от проблемы?
 
 Top
evgenijj
Отправлено: 08 Июня, 2007 - 12:22:56
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




kozakmamai пишет:
А если использовать передачу по методу POST это избавит от проблемы?

От этой избавит, но появятся другие Улыбка
 
 Top
kozakmamai
Отправлено: 08 Июня, 2007 - 12:28:28
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2007  
Откуда: Украина


Помог: 0 раз(а)




Плиз...хелп...с GET понятно, через него буду пересылать данные оставленные пользователем, а вот авторизацию хочу передавать POSTом, может черкнешь пару слов про возможные проблемы Улыбка
 
 Top
evgenijj
Отправлено: 08 Июня, 2007 - 12:50:26
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




kozakmamai пишет:
Плиз...хелп...с GET понятно, через него буду пересылать данные оставленные пользователем, а вот авторизацию хочу передавать POSTом, может черкнешь пару слов про возможные проблемы Улыбка

http://webdesign[dot]site3k[dot]net/conj[dot][dot][dot]end/d/forms[dot]html

Блин, есть же еще "энтузиасты" которые сайты на фреймах делают. Сам же по этой ссылке зайти не могу.
http://webdesign[dot]site3k[dot]net/div/[dot][dot][dot]end/d/forms[dot]html
 
 Top
kozakmamai
Отправлено: 08 Июня, 2007 - 14:25:22
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Июнь 2007  
Откуда: Украина


Помог: 0 раз(а)




Ахх...
Спасибо большое за хелпище!! Улыбка Буду розбирать!
 
 Top
evgenijj
Отправлено: 08 Июня, 2007 - 14:46:38
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




После отправки данных методом POST пользователь может нажать кнопку "Назад" или "Обновить" (при этом ему будет выведено предупреждение "Страница содержит устаревшие данные формы...") и отправить данные формы на сервер еще раз - соответственно запись в гостевой опять-таки будет продублирована. Чтобы этого избежать - перенаправляем пользователя на ту же страницу после того, как добавили запись в гостевую книгу (аналогично тому, как мы делали для метода GET)
fwrite( ... );
Header("Location: http://".$_SERVER["SERVER_NAME"].$_SERVER["SCRIPT_NAME"]);

http://makoviychuk[dot]ru/2007/01/24[dot][dot][dot]olneniya-formyi/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB