|
|
|
| Подскажите как правильно реализовать комментарии к статьям
комментарии состоят из трех модулей
1.модуль вывода оставленных комментариев из БД
2.формы ввода нового комментария расположенной на этой странице
3 обработчик
структура может быть двух видов
1 модуль вывода и форма вместе и отдельно обработчик
2 все вместе
тут возникают свои нюансы
если используем вариант 1:
проблема что если не правильно набрано поле то обработчик выводит надпись об этом и редиректит на лист формы ,при этом все введенные данные полей обнуляются ,что не есть хорошо ,можно тупо выводить только надпись о некорректности, и чтобы вернуться обратно в форму и сохранить ранее введенные данные пользователю надо воспользоваться стрелкой назад в браузере что не все догадываются...
плюс что обработчик вызывается только когда нужно
если используем вариант 2:
проблем с сохранением ранее введенных данных нет..
минусы --->если форма заполнена правильно.. то производится запись в БД ,но чтобы эта запись появилась надо перезагрузить страницу.вручную......можно решить это созданием дополнительной странички ,где будет только вывод сообщения об успешном заполнении формы и код редиректа обратно на страницу комментариев...
еще минус что если будет открыто одновременно допустим сто страниц ,то на каждой будет код обработчика ..это тоже пусть небольшая но нагрузка по трафику...
подскажите есть ли более лучшие варианты скрипта комментариев на странице для статьи...или какой из двух предпочтительней | |
|
|
|
|
|
|
|
для: serjinio
(15.09.2008 в 03:28)
| |
<?
//инициализируем переменную поля ввода
$text = isset($_POST['text']) ? $_POST['text'] : "";
$error = "";
//проверяем пришла ли форма и обрабатываем полученное
if ($text) {
//если допущены ошибки
$error = "Так вот нельзя!";
}
//выводим форму по умолчанию и ошибках
if ($error || !$_POST['submit']) echo
"<p>" .$error. "</p><form method=\"post\">
<textarea name=\"text\">" .$text. "</textarea>
<input type=\"submit\" name=\"submit\" value=\"Send\">
</form>";
|
И при ошибках ввода, ранее введенное пользователем не потеряется. Что касается вывода комментария при ошибках ввода, то его можно просто заблокировать до тех пор, пока не будет ошибок. А уж одним это скриптом делать, разными, роли не играет. | |
|
|
|
|
|
|
|
для: sim5
(15.09.2008 в 03:46)
| | Это стандартный вариант ,когда обработчик и форма совмещены,а как сделать чтобы обработчик вынести отдельно и в случае ошибок в обработчике возвратиться на страницу формы с сохранением ранее введенных данных?? | |
|
|
|
|
|
|
|
для: serjinio
(15.09.2008 в 12:09)
| | не возвратиться.
Сгенерировать заново форму с заполненными полями. | |
|
|
|
|
|
|
|
для: Trianon
(15.09.2008 в 13:10)
| | Промучился с генерацией формы все получилось ,но слишком много кода ,плюнул на это и сделал сессией...вот приблизительная схема рабочая...
Форма
<?php
session_start();
?>
<form action="ccc.php" method="post" name="coments" >
<input name="author" type="text" value="<?php echo $_SESSION['username'] ; ?>" size="45" maxlength="21">
--------------------------
<input name="submit" value="Отправить" type="submit">
</form>
|
Обработчик
<?php session_start();
include ("config.php");//сonnect BD
@$author=$_SESSION['username']=substr(htmlspecialchars(trim($_POST['author'])), 0, 21);
@$email=$_SESSION['e_mail']=substr(htmlspecialchars(trim($_POST['email'])), 0, 30);
---------------------------------------
// Проверяем поле ---> author ///
if (empty($author))output_err(0);
if(preg_match('|[^a-zA-Z_А-Яа-я0-9-]+|is',$author)) output_err(1);
if(strlen($author) < 2)output_err(2);
------------------------------------------------
function output_err($num)
{
$err[0] = 'ОШИБКА! Вы не ввели своё имя!';
$err[1] = 'ОШИБКА! В имени недопустимый символ!';
$err[2] = 'ОШИБКА! Слишком короткое имя!';
$err[3] = 'ОШИБКА! Вы не ввели e-mail!';
------------------------------------------------------
$err[7] = 'ОШИБКА! В сообщении недопустимые символы!';
echo '<p>'.$err[$num].'</p>';
exit ("<p>Вы ввели не всю информацию,заполните корректно все поля!</p>
<html><head><meta http-equiv='Refresh' content='3; URL=xxxx.php'></head></html>"
);
if (($_SERVER['REQUEST_METHOD']=='POST')&& (count($_POST)>0))
{
// тут проверяем есть ли такой пользователь в БД.....
// если есть.... и майл и имя совпадают то....
$res = mysql_query ("INSERT INTO................",$db);
if ($res == 'true'){
session_destroy(); // разрушаем сессию
echo'<br>Ваш комментарий успешно добавлен!';
// можем отправить письмо админу..если надо.............
echo"<html><head><meta http-equiv='Refresh' content='3; URL=xxxx.php'></head></html>";
}
//если не совпадают....то.....{}///
}
|
вопрос такого плана надо ли обрабатывать поле value
типа
value="<?=htmlspecialchars($_SESSION['username']) ?>"
|
| |
|
|
|
|
|
|
|
для: serjinio
(16.09.2008 в 11:14)
| | Нужно проверять на допустимые вами символы. А вообще... Вот что это такое:
@$email=$_SESSION['e_mail']=... К чему тут собака? | |
|
|
|
|
|
|
|
для: sim5
(16.09.2008 в 11:41)
| | Задницу прикрыть ..в случае какой-то ошибки чтобы никто не видел.... | |
|
|
|
|
|
|
|
для: serjinio
(16.09.2008 в 15:35)
| | И какую вы тут ошибку на свою задницу ожидаете, если не секрет? А недопустимые символы в логине надо запрещать, а не "прикрывать" их html-эквивалентами. И вообще, использование сесии для того чтобы запомнить сообщение, это не ахти выход. Что вам вам мешает обработку сообщения делать в одном скрипте, производить запись, и переходить на другой скрипт, основной? | |
|
|
|
|
|
|
|
для: sim5
(16.09.2008 в 15:49)
| | Да поставить ссылку на скрипт комментариев в котором совместить форму и обработчик самый оптимальный вариант, но захотелось сделать по принципу блоговых комментариев где форма встроена в посты..
а чем плохо передавать переменные сессией ..чем это грозит или в чем неудобство? | |
|
|
|
|
|
|
|
для: serjinio
(17.09.2008 в 03:01)
| | Ну и встраивайте в посты, это разве накладывает какие-то ограничения на свободу ваших действий? Не надо никаких сохранений промежуточных в сессиях, все можно сделать без этого, как, я вам писал. Нужна всего лишь навсего грамотная структура кода. | |
|
|
|
|
|
|
|
для: sim5
(17.09.2008 в 07:33)
| | Ну чтож если гора не идет к Магомету...то объеденим плюсы обработчика и формы в одном флаконе... и желание сделать форму с комментариями на одной странице,а обработчик подгружать по мере надобности........те когда требуется написать комментарий....и избавимся от любых промежуточных вариантов передачи в форму переменных для сохранение ранее введеных данных...
Обработчик
<?php
error_reporting(E_ALL & ~E_NOTICE);
$author=substr(htmlspecialchars(trim($_POST['author'])), 0, 21);
$email=substr(htmlspecialchars(trim($_POST['email'])), 0, 30);
// Проверяем поле ---> author ///
if (empty($author)){$err.='ОШИБКА! Вы не ввели своё имя!';}
if(preg_match('|[^a-zA-Z_А-Яа-я0-9-]+|is',$author)) {$err.='<p>ОШИБКА! В имени недопустимый символ или пробелы!<br>
Запрещен html код!</p>';}
if(strlen($author) < 2){$err.='<p>ОШИБКА! Слишком короткое имя!</p>';}
// Проверяем поле ---> email ////
if (empty($email)){$err.='<p>ОШИБКА! Вы не ввели e-mail!</p>';}
.........................................................................................
if (isset($err)) {echo '<div><font color=red>'.$err.'</font></div>' ;}
if (($_SERVER['REQUEST_METHOD']=='POST') && (count($_POST)>0) && (!isset($err)))
{
// Запрос к базе данных на добавление сообщения
$res = mysql_query ("INSERT INTO `comments`..................................., NOW()) ", $db);
if ($res == 'true'){
echo'<div class="ok">Ваш комментарий успешно добавлен !</div>';
// можем отправить письмо админу..............Можно еще чего надо..........
// очищаем форму и выводим с базы добавленный коммент....
echo"<html><head><meta http-equiv='Refresh' content='3; URL = $_SERVER[PHP_SELF] '> </head> </html> ";
}
//...........Можно еще чего надо..........
}
|
Форма
<?php
echo '<h3 id="с">Оставьте комментарий</h3>';
if (($_SERVER['REQUEST_METHOD']=='POST')&& (count($_POST)>0))
{
include ('обработчик.php');// если что-то введено и нажата капа...подгружаем обработчик.....
}
?>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post" >
<input name="author" type="text" value="<?php echo $author ;?>" size="45" maxlength="21">
--------------------------
<input name="submit" value="Отправить" type="submit">
</form>
|
Всё работает просто замечательно ,но есть проблемка..если возникает ошибка или выводится сообщение о добавлении комментария браузер дергается и смещает фокус в начало страницы.. в принципе ничего страшного ..эти сообщения я вывожу в самом верху перед статьёй,но если статья большая и много комментариев то приходится крутить вниз до самой формы чтобы исправить ..достаточно не удобно...и вот такой вопрос как сделать вывод ошибок или в всплывающем окне или на ява скрипте чтобы было оно где-то посередине экрана или ближе к форме....те к низу....в каком направлении думать...??? | |
|
|
|
|
|
|
|
для: serjinio
(17.09.2008 в 13:50)
| | Это вы проверяете собственно говоря лишнее, так как в случае запрещенных символов (а вы все ли хотите иметь в имени?), вместо одного, может быть троица :)
Я вам уже писал (это как раз для защиты вашей задницы, как вы выразились, и для того, чтобы иметь возможность вернуть данные уже введенные пользователем, а также по умолчанию):
<?
$author = isset($_POST['author']) ? substr(trim($_POST['author'])), 0, 21) : "";
|
И вы не получите предупрежедений в случае, если не было еще отпарвки формы, и заметьте без всяких "собак".
Я вам два способа описал, как можно сделать, вы не хотите. Так как вы делаете, я бы не за что не стал, и обошелся бы без применения всплывающеих окошек и JS. | |
|
|
|
|
|
|
|
для: sim5
(17.09.2008 в 14:02)
| | Вы совершено правы ,просто это был кусок кода проверки из первых экспериментов,где некоторые поля не проверялись регулярками.... сделал еще два варианта один по Вашему рецепту другой подгрузкой формы с обработчиком по ссылке...все прекрасно работает...сейчас подчищу код и буду тестировать все варианты...какой понравится такой и оставлю..Спасибо за помощь ..Наконец-то полностью разобрался в данном вопросе....остальное нюансы :) | |
|
|
|
|
|
|
|
для: serjinio
(15.09.2008 в 12:09)
| | Допустим, у вас скрипт А выводит сообщения и форму добавления сообщения. Хотя, на мой взгляд, нужно не выводить форму, а делать ссылку на открытие этой формы. Вот эта ссылка как раз и ведет на скрипт В, который выводит форму, принимает ее данные и обрабатывает. Если данные введены с ошибками, возвращаем форму, если верно, записываем их в базу и делаем перенаправление на скрипт А. Собственно так выглядит данный форум. | |
|
|
|