<?
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 не знаю адекватно ли это с точки зрения безопасности.
mysql_real_escape_string заменил на htmlspecialchars не знаю адекватно ли это с точки зрения безопасности.
Спустя 7 минут, 25 секунд (4.07.2010 - 21:17) sergeiss написал(а):
Yurchi - объясняю логику.
Вот ты зашел в форму, ПОСТ-данных пока нету. Заполнил данные. Отправил на сервер, лучше всего в этот же скрипт.
Если данные НЕ верны, то предлагаешь их скорректировать, при этом выводишь то, что юзер уже ввёл. Чтобы ему не вводить заново всё.
А если же данные верны, то используешь их для записи в БД. И уже затем (не выводя ничего на экран!!!) пишешь header(location:URL) с указанием адреса той же гостевой книги, т.е. скрипт сам на себя переходит.
Скрипт вызывается заново, но только ПОСТ-данные уже "обнулены". Поэтому нету повторного ввода. И юзер может "до посинения" жать F5, страница будет обновляться. Но ПОСТ-данных нету, поэтому ничего повторно вводиться не будет.
После header(location:URL) надо сразу же написать exit().
Обрати внимание - на этом форуме после выбора "Новые сообщения" (меню вверху) происходит нечто подобное
И это неспроста.
Вот ты зашел в форму, ПОСТ-данных пока нету. Заполнил данные. Отправил на сервер, лучше всего в этот же скрипт.
Если данные НЕ верны, то предлагаешь их скорректировать, при этом выводишь то, что юзер уже ввёл. Чтобы ему не вводить заново всё.
А если же данные верны, то используешь их для записи в БД. И уже затем (не выводя ничего на экран!!!) пишешь header(location:URL) с указанием адреса той же гостевой книги, т.е. скрипт сам на себя переходит.
Скрипт вызывается заново, но только ПОСТ-данные уже "обнулены". Поэтому нету повторного ввода. И юзер может "до посинения" жать F5, страница будет обновляться. Но ПОСТ-данных нету, поэтому ничего повторно вводиться не будет.
После header(location:URL) надо сразу же написать exit().
Обрати внимание - на этом форуме после выбора "Новые сообщения" (меню вверху) происходит нечто подобное
![wink.gif](http://phpforum.ru/html/emoticons/wink.gif)
Спустя 38 минут, 4 секунды (4.07.2010 - 21:55) Yurchi написал(а):
Окей, я понял, спасибо ![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Только не всё так просто. Сначала генерируется сама страница а потом грузиться скрипт, поэтому заголоки не получается отправить.
Вся структура моего сайта - это страница place.php, и пример:
Все скрипты хранятся в папке рядом из страничкой с дизайном.
![smile.gif](http://phpforum.ru/html/emoticons/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 - на самом деле всё достаточно просто. Только надо четко структурировать скрипт. Тогда описанный мной алгоритм "работает как часы". И я его не придумывал, а давно уже умные люди посоветовали
А я им пользуюсь постоянно там, где ввод данных идет. Ты просто поверь мне, что это просто. И затем сделай это всё.
А если ты хочешь, чтобы юзер не просто перенаправился, а у еще и видел какую-то промежуточную страницу, где написано что-нибудь типа "Ваше сообщение принято, подождите, через 10 секунд Вы будете перенаправлены обратно в гостевую книгу", то тогда надо использовать не header("location:URL"), а header("Refresh: 10, URL").
Тогда будет выведено всё содержимое, вплоть до exit(). Можно использовать любое красивое форматирование, а не только простой вывод.
И еще. Существенно! В твоем коде я вижу признак "бесовщины-поповщины", цикл do-while для вывода данных из БД.... Забудь о нем!!! Прочитай эту тему http://phpforum.ru/index.php?showtopic=21916, и да пребудет с тобой сила форума!
![smile.gif](http://phpforum.ru/html/emoticons/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](http://phpforum.ru/html/emoticons/biggrin.gif)
Спустя 34 минуты, 27 секунд (4.07.2010 - 22:41) sergeiss написал(а):
Значит, еще раз по порядку.
Работаем в пределах одного скрипта.
1. Проверка данных. Никакого вывода в браузер, никаких заголовков никуда не выводим! Если есть ошибки, то информацию о них пишем в какие-нибудь переменные.
При начальном заходе в скрипт этот блок обходится "автоматически".
2. Если данные проверялись и надо перейти на эту же страницу, то используем header( 'Refresh: 10, URL'), где 10 - это время до перехода, в секундах (можно установить любое другое), URL - адрес для перехода. Можно его взять из параметров, принятых скриптом, либо прописать жёстко. Это я описал выше.
После header выводим что-нибудь для информации пользователя. Можно, в том числе, вывести ссылку для быстрого возврата к скрипту (к гостевой книге в твоем случае), если пользователь уже прочитал текст и не хочет ждать всё указанное время. Делай тут всё, что угодно! Это будет работать в течение обозначенного интервала времени.
И в конце выводимых данных обязательно поставь exit(), иначе так всё и будет выводиться, что есть в скрипте далее.
Эта часть также "автоматически" обходится при начальном заходе в скрипт.
3. А вот уже далее располагай нужные заголовки документа. И далее выводи форму.
Если при проверке данных были обнаружены ошибки, то они уже известны, ты можешь вывести информацию о них и обязательно выведи юзеру все введенные им ранее данные. Чтоб он не вводил всё заново. Чтоб из-за одной-двух закорючек не перебирать много-много текста.
Работаем в пределах одного скрипта.
1. Проверка данных. Никакого вывода в браузер, никаких заголовков никуда не выводим! Если есть ошибки, то информацию о них пишем в какие-нибудь переменные.
При начальном заходе в скрипт этот блок обходится "автоматически".
2. Если данные проверялись и надо перейти на эту же страницу, то используем header( 'Refresh: 10, URL'), где 10 - это время до перехода, в секундах (можно установить любое другое), URL - адрес для перехода. Можно его взять из параметров, принятых скриптом, либо прописать жёстко. Это я описал выше.
После header выводим что-нибудь для информации пользователя. Можно, в том числе, вывести ссылку для быстрого возврата к скрипту (к гостевой книге в твоем случае), если пользователь уже прочитал текст и не хочет ждать всё указанное время. Делай тут всё, что угодно! Это будет работать в течение обозначенного интервала времени.
И в конце выводимых данных обязательно поставь exit(), иначе так всё и будет выводиться, что есть в скрипте далее.
Эта часть также "автоматически" обходится при начальном заходе в скрипт.
3. А вот уже далее располагай нужные заголовки документа. И далее выводи форму.
Если при проверке данных были обнаружены ошибки, то они уже известны, ты можешь вывести информацию о них и обязательно выведи юзеру все введенные им ранее данные. Чтоб он не вводил всё заново. Чтоб из-за одной-двух закорючек не перебирать много-много текста.