[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обнуление POST запроса
Yurchi
Когда нажимаю "Обновить", то сообщение дублируеться в гостевой, типо добавляется повторно...


<?
include 'settings.php';

if ( isset($_SESSION['user'])) echo
'<form action="" method="post">
<input type="hidden" name="user" value="'
.$_SESSION['user'].'">
<input type="hidden" name="time" value="'
.$_SESSION['user'].'">
Тут вы можеть сказть всё что думаете об игре, альянсе,
соратниках, своей тёще и других приятных и не очень вещах.<br />
<b>Суть:</b><br />
<textarea class="book" name="content" ></textarea><br /><br />
<input type="submit" title="Высказатся" value="Высказатся">
</form>'
;

if (isset ($_POST['content']))
{
$post = htmlspecialchars($_POST['content']);
$user = intval($_SESSION['user']);

$post_sql = mysql_query("INSERT INTO `book` ( `user` , `message` ) VALUES ( '$user' , '$post' )");
if (!$post_sql) echo "Error!\n";
unset($_POST['content']);
}
?>
<div id="book">
<?php

$num = 10;

$temp_page = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM book"));
$posts_page = $temp_page[0]; $total = intval(($posts_page - 1) / $num) + 1;

$page = isset($_GET['page']) && $_GET['page'] >= 0 ? intval($_GET['page']) : 0;
if($page > $total) $page = $total;
$start = $page * $num;

$result = mysql_query("SELECT * FROM book ORDER BY `id` DESC LIMIT $start, $num ");
if( mysql_num_rows($result) > 0 )
{
echo '<p class="paginator">';
if ( $page != 0 ) echo '<a a href="place.php?place=book&page=' . ($page - 1) . '"><img src="prev.gif"></a> ';
if ( ($page + 1) != $total ) echo '<a href="place.php?place=book&page=' . ($page + 1) . '"><img src="next.gif"></a>';
echo '</p>';

$row = mysql_fetch_array($result);
do {

$user_sql = mysql_query("SELECT `name` FROM `user` WHERE `id` = '{$row['user']}' LIMIT 1");
$user_row = mysql_fetch_array($user_sql);

$user = $user_row['name'];
$head = '<h2>'.$row['time'].'-'.$row['date'].'</h2>'."\n".'<h1>' . $user .' говорит:</h1>'."\n";
$body = '<p>' . $row['message'] . '<p><br />'."\n";
echo $head.$body ;}
while ($row = mysql_fetch_array($result));

echo '<p class="paginator">';
if ( $page != 0 ) echo '<a a href="place.php?place=book&page=' . ($page - 1) . '"><img src="prev.gif"></a> ';
if ( ($page + 1) != $total ) echo '<a href="place.php?place=book&page=' . ($page + 1) . '"><img src="next.gif"></a>';
echo '</p>';
}
else echo 'Тут как-то тихо..."';
?>
</div>


p.s. сервер почему-то ругаеться на функцию mysql_real_escape_string.



Спустя 56 минут, 31 секунда (3.07.2010 - 01:01) linker написал(а):
Цитата
Когда нажимаю "Обновить", то сообщение дублируеться в гостевой, типо добавляется повторно..

Операции добавление, редактирования, удаления, просмотра разносите по разным скриптам.

По ходу текста не обнаружил строки с mysql_real_escape_string.

Спустя 46 минут, 1 секунда (3.07.2010 - 01:47) sergeiss написал(а):
Есть такая штука - функция header. Совместно с параметром 'Location ...' (надо указать этот же скрипт), позволяет как раз "обнулить" ПОСТ-данные.
Сначала проверяешь то, что введено, и если есть ошибки, то отдаешь данные на доработку. А если всё нормально, то используешь то, о чем я написал в начале.

Спустя 1 день, 19 часов, 22 минуты, 59 секунд (4.07.2010 - 21:10) Yurchi написал(а):
Я самоучка, и поэтому знаю только что header(location:URL) это переадрасация, nothing more.

mysql_real_escape_string заменил на htmlspecialchars не знаю адекватно ли это с точки зрения безопасности.


Спустя 7 минут, 25 секунд (4.07.2010 - 21:17) sergeiss написал(а):
Yurchi - объясняю логику.

Вот ты зашел в форму, ПОСТ-данных пока нету. Заполнил данные. Отправил на сервер, лучше всего в этот же скрипт.
Если данные НЕ верны, то предлагаешь их скорректировать, при этом выводишь то, что юзер уже ввёл. Чтобы ему не вводить заново всё.
А если же данные верны, то используешь их для записи в БД. И уже затем (не выводя ничего на экран!!!) пишешь header(location:URL) с указанием адреса той же гостевой книги, т.е. скрипт сам на себя переходит.
Скрипт вызывается заново, но только ПОСТ-данные уже "обнулены". Поэтому нету повторного ввода. И юзер может "до посинения" жать F5, страница будет обновляться. Но ПОСТ-данных нету, поэтому ничего повторно вводиться не будет.

После header(location:URL) надо сразу же написать exit().

Обрати внимание - на этом форуме после выбора "Новые сообщения" (меню вверху) происходит нечто подобное wink.gif И это неспроста.

Спустя 38 минут, 4 секунды (4.07.2010 - 21:55) Yurchi написал(а):
Окей, я понял, спасибо smile.gif
Только не всё так просто. Сначала генерируется сама страница а потом грузиться скрипт, поэтому заголоки не получается отправить.

Вся структура моего сайта - это страница place.php, и пример:

//Дизайн, хтмл, дивы и другая фигня.
// Потом маленька врезка из ПХП

<?php
$place = isset($_GET['place']) ? $_GET['place'].'.php' : 'news.php';
include($place);
?>


Все скрипты хранятся в папке рядом из страничкой с дизайном.

<html>
<
head>
<
title>Великий сайт великой Империи</title>
<
link rel="stylesheet" href="style.css" type="text/css">
</
head>
<
body>
<
div id="netbar">
<
a href="?place=login">Предъявить документ<a> ||
<
a href="?place=reg">Получить гражданство<a>
</
div>
<
div id="ocean"></div>
<
div align="center">
<
div id="main">
<
div id="head"></div>
<
div id="menu">

<
table class="menu">
<
tr>
<
td><img src="img/horn.png"></td>
<
td><img src="img/fire.png"></td>
<
td><img src="img/photo.png"></td>
<
td><img src="img/scroll.png"></td>
</
tr>
<
tr>
<
td><a href="?place=news">Вести</a></td>
<
td><a href="?place=book">Референдум</a></td>
<
td><a href="?place=photo">Вернисаж</a></td>
<
td><a href="?place=people">Имперцы</a></td>
</
tr>
</
table>


</
div>
<
div id="content">

<?php

$place = isset($_GET['place']) ? $_GET['place'].'.php' : 'news.php';
include($place);

?>
</div>
<
div id="footer">Мой сранный копирайт (с) 2010</div>

</
div>
</
body>
</
html>


<?
include 'settings.php';
include 'functions.php';

if ( isset($_SESSION['user']))

{
if (isset ($_POST['content']))
{
$post = htmlspecialchars($_POST['content']);
$user = intval($_SESSION['user']);
$date = date('Y-m-d');
$time = date('H:I:s');

$post_sql = mysql_query("INSERT INTO `book` ( `user` , `message` , `date` , `time` ) VALUES ( '$user' , '$post' , '$date' , '$time' )");
if (!$post_sql) echo "Error!\n";

};

echo
'<form action="" method="post">
<input type="hidden" name="user" value="'
.$_SESSION['user'].'">
Тут вы можеть сказть всё что думаете об игре, альянсе,
соратниках, своей тёще и других приятных и не очень вещах.<br />
<b>Суть:</b><br />
<textarea class="book" name="content" ></textarea><br /><br />
<input type="submit" title="Высказатся" value="Высказатся">
</form>'
;

}
?>
<div id="book">
<?php

$num = 10;

$temp_page = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM book"));
$posts_page = $temp_page[0]; $total = intval(($posts_page - 1) / $num) + 1;

$page = isset($_GET['page']) && $_GET['page'] >= 0 ? intval($_GET['page']) : 0;
if($page > $total) $page = $total;
$start = $page * $num;

$result = mysql_query("SELECT * FROM book ORDER BY `id` DESC LIMIT $start, $num ");
if( mysql_num_rows($result) > 0 )
{
echo '<p class="paginator">';
if ( $page != 0 ) echo '<a a href="place.php?place=book&page=' . ($page - 1) . '"><img src="prev.gif"></a> ';
if ( ($page + 1) != $total ) echo '<a href="place.php?place=book&page=' . ($page + 1) . '"><img src="next.gif"></a>';
echo '</p>';

$row = mysql_fetch_array($result);
do {

$user = get_user_url($row['user']);

$head = '<h1>'.$row['time'].'/'.$row['date'].'---'. $user .' говорит:</h1>'."\n";
$body = '<div class="post">' . $row['message'] . '</div>'."\n";
$footer = '<div class="footer"></div><br />'."\n";
echo $head.$body.$footer ;}
while ($row = mysql_fetch_array($result));

echo '<p class="paginator">';
if ( $page != 0 ) echo '<a a href="place.php?place=book&page=' . ($page - 1) . '"><img src="prev.gif"></a> ';
if ( ($page + 1) != $total ) echo '<a href="place.php?place=book&page=' . ($page + 1) . '"><img src="next.gif"></a>';
echo '</p>';
}
else echo 'Тут как-то тихо..."';
?>
</div>

Спустя 11 минут, 13 секунд (4.07.2010 - 22:06) sergeiss написал(а):
Yurchi - на самом деле всё достаточно просто. Только надо четко структурировать скрипт. Тогда описанный мной алгоритм "работает как часы". И я его не придумывал, а давно уже умные люди посоветовали smile.gif А я им пользуюсь постоянно там, где ввод данных идет. Ты просто поверь мне, что это просто. И затем сделай это всё.

А если ты хочешь, чтобы юзер не просто перенаправился, а у еще и видел какую-то промежуточную страницу, где написано что-нибудь типа "Ваше сообщение принято, подождите, через 10 секунд Вы будете перенаправлены обратно в гостевую книгу", то тогда надо использовать не header("location:URL"), а header("Refresh: 10, URL").
Тогда будет выведено всё содержимое, вплоть до exit(). Можно использовать любое красивое форматирование, а не только простой вывод.

header("Refresh: 10, URL");
echo 'Ваше сообщение принято, подождите, через 10 секунд Вы будете перенаправлены обратно в гостевую книгу.';
exit();


И еще. Существенно! В твоем коде я вижу признак "бесовщины-поповщины", цикл do-while для вывода данных из БД.... Забудь о нем!!! Прочитай эту тему http://phpforum.ru/index.php?showtopic=21916, и да пребудет с тобой сила форума! biggrin.gif

Спустя 34 минуты, 27 секунд (4.07.2010 - 22:41) sergeiss написал(а):
Значит, еще раз по порядку.

Работаем в пределах одного скрипта.

1. Проверка данных. Никакого вывода в браузер, никаких заголовков никуда не выводим! Если есть ошибки, то информацию о них пишем в какие-нибудь переменные.
При начальном заходе в скрипт этот блок обходится "автоматически".

2. Если данные проверялись и надо перейти на эту же страницу, то используем header( 'Refresh: 10, URL'), где 10 - это время до перехода, в секундах (можно установить любое другое), URL - адрес для перехода. Можно его взять из параметров, принятых скриптом, либо прописать жёстко. Это я описал выше.
После header выводим что-нибудь для информации пользователя. Можно, в том числе, вывести ссылку для быстрого возврата к скрипту (к гостевой книге в твоем случае), если пользователь уже прочитал текст и не хочет ждать всё указанное время. Делай тут всё, что угодно! Это будет работать в течение обозначенного интервала времени.
И в конце выводимых данных обязательно поставь exit(), иначе так всё и будет выводиться, что есть в скрипте далее.
Эта часть также "автоматически" обходится при начальном заходе в скрипт.

3. А вот уже далее располагай нужные заголовки документа. И далее выводи форму.
Если при проверке данных были обнаружены ошибки, то они уже известны, ты можешь вывести информацию о них и обязательно выведи юзеру все введенные им ранее данные. Чтоб он не вводил всё заново. Чтоб из-за одной-двух закорючек не перебирать много-много текста.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.