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
Форумы портала PHP.SU :: Версия для печати :: Форма добавления комментариев
Форумы портала PHP.SU » » Вопросы новичков » Форма добавления комментариев

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

1. Andry - 16 Июля, 2018 - 21:47:01 - перейти к сообщению
Не могу сообразить как реализовать привязку id статьи с id комментария, подскажите пожалуйста что я не так сделал и как мне исправить положение)

PHP:
скопировать код в буфер обмена
  1.  
  2. $db = new PDO('mysql:host=localhost;dbname=monorailsbase', 'root', '');
  3. $db->exec("SET NAMES UTF8");
  4.  
  5. if(count($_POST) > 0){
  6.  $name = trim($_POST['name']);
  7.  $text = trim($_POST['text']);
  8.  $mail = trim($_POST['mail']);
  9.  $id_page = $_GET['id'];
  10.  
  11.  $text = htmlspecialchars($text);
  12.  $name = htmlspecialchars($name);
  13.  $mail = htmlspecialchars($mail);
  14.  
  15.  if($name != '' && $text != '' && $mail != '') {
  16.   $query = $db->prepare("INSERT INTO comment_form SET name=:name, text=:text, mail=:mail, id_page=:id_page");
  17.  
  18.   $params = ['name'=>$name,'text'=>$text,'mail'=>$mail, 'id_page'=>$id_page] ;
  19.   $query->execute($params);
  20.   exit(0);
  21.  }
  22. }
  23.  $id_page=$_POST['id_page'];
  24.  $id_page = "%$id_page%";
  25.  $query = $db->prepare("SELECT * FROM comment_form WHERE id_page LIKE ?");
  26.  $query->execute(array($id_page));
  27.  $comments = $query->fetchAll();
  28.  


CODE (html):
скопировать код в буфер обмена
  1.  
  2. <form method="post" action="/articles/article.php?id=<?php echo $_GET['id'];?>" class="comment-form">
  3. <h3>Leave A Message</h3>
  4. <div class="row">
  5. <div class="form-group col-md-6">
  6. <input type="text" name="name" placeholder="Your Name*" class="form-control" value="<?php echo $name;?>">
  7. </div>
  8. <div class="form-group col-md-6">
  9. <input type="text" name="mail" placeholder="Email Addr" class="form-control" value="<?php echo $mail;?>">
  10. </div>
  11. <div class="form-group col-md-12">
  12. <textarea name="text" placeholder="Your Comment*" rows="8" class="form-control" value="<?php echo $text;?>"></textarea>
  13. </div>
  14. <input type='hidden' name='id' value="<?=$id_page;?>\">
  15. <input type="submit" value="Submit Comment" name="Submit Comment" title="Submit Comment"/>
  16. </div>
  17. </form>
  18.  
2. Doox911 - 18 Июля, 2018 - 07:41:59 - перейти к сообщению
Andry пишет:
Не могу сообразить как реализовать привязку id статьи с id комментария, подскажите пожалуйста что я не так сделал и как мне исправить положение)

PHP:
скопировать код в буфер обмена
  1.  
  2. $db = new PDO('mysql:host=localhost;dbname=monorailsbase', 'root', '');
  3. $db->exec("SET NAMES UTF8");
  4.  
  5. if(count($_POST) > 0){
  6.  $name = trim($_POST['name']);
  7.  $text = trim($_POST['text']);
  8.  $mail = trim($_POST['mail']);
  9.  $id_page = $_GET['id'];
  10.  
  11.  $text = htmlspecialchars($text);
  12.  $name = htmlspecialchars($name);
  13.  $mail = htmlspecialchars($mail);
  14.  
  15.  if($name != '' && $text != '' && $mail != '') {
  16.   $query = $db->prepare("INSERT INTO comment_form SET name=:name, text=:text, mail=:mail, id_page=:id_page");
  17.  
  18.   $params = ['name'=>$name,'text'=>$text,'mail'=>$mail, 'id_page'=>$id_page] ;
  19.   $query->execute($params);
  20.   exit(0);
  21.  }
  22. }
  23.  $id_page=$_POST['id_page'];
  24.  $id_page = "%$id_page%";
  25.  $query = $db->prepare("SELECT * FROM comment_form WHERE id_page LIKE ?");
  26.  $query->execute(array($id_page));
  27.  $comments = $query->fetchAll();
  28.  


CODE (html):
скопировать код в буфер обмена
  1.  
  2. <form method="post" action="/articles/article.php?id=<?php echo $_GET['id'];?>" class="comment-form">
  3. <h3>Leave A Message</h3>
  4. <div class="row">
  5. <div class="form-group col-md-6">
  6. <input type="text" name="name" placeholder="Your Name*" class="form-control" value="<?php echo $name;?>">
  7. </div>
  8. <div class="form-group col-md-6">
  9. <input type="text" name="mail" placeholder="Email Addr" class="form-control" value="<?php echo $mail;?>">
  10. </div>
  11. <div class="form-group col-md-12">
  12. <textarea name="text" placeholder="Your Comment*" rows="8" class="form-control" value="<?php echo $text;?>"></textarea>
  13. </div>
  14. <input type='hidden' name='id' value="<?=$id_page;?>\">
  15. <input type="submit" value="Submit Comment" name="Submit Comment" title="Submit Comment"/>
  16. </div>
  17. </form>
  18.  

1. Где не можете сделать привязку БД, скрипт?
2. Я бы в шаблоне проверял переменные на существование перед выводом!
PHP:
скопировать код в буфер обмена
  1.  
  2. <input type="text" name="name" placeholder="Your Name*" class="form-control" value="<? if isset ( $name ) { echo $name; } ?>">
  3.  

3. И зачем вы тут используете exit(0)? и как в вашем понимании он должен работать?
PHP:
скопировать код в буфер обмена
  1.  
  2.  if($name != '' && $text != '' && $mail != '') {
  3.   $query = $db->prepare("INSERT INTO comment_form SET name=:name, text=:text, mail=:mail, id_page=:id_page");
  4.  
  5.   $params = ['name'=>$name,'text'=>$text,'mail'=>$mail, 'id_page'=>$id_page] ;
  6.   $query->execute($params);
  7.   exit(0);
  8.  }
  9. }
3. Andry - 18 Июля, 2018 - 08:53:52 - перейти к сообщению
Цитата:
1. Где не можете сделать привязку БД, скрипт?

CODE (html):
скопировать код в буфер обмена
  1. <input type='hidden' name='id' value="<?=$id_page;?>\">

передает id страницы (статьи), не могу понять как составить правильно запрос чтобы мне выводило комментарии только те которые относятся к данной статье. Мне же щас выводит все статьи.
Цитата:
И зачем вы тут используете exit(0)? и как в вашем понимании он должен работать?

если убрать exit(0) то каждый раз при обновлении страницы идёт запись в бд.
4. miketomlin - 19 Июля, 2018 - 09:46:23 - перейти к сообщению
Andry, полно косяков.

CODE (htmlphp):
скопировать код в буфер обмена
  1. <input type='hidden' name='id' value="<?=$id_page;?>\">

Вы же использовали GET-параметр для идентификации страницы (что вполне допустимо). Так проще поставить на автомат проверку существования данной страницы. Комменты-орфаны точно никому не нужны. И существование каждого POST-параметра отдельно проверяйте. Эта проверка может быть заменой вашей "if(count($_POST) > 0)".

Цитата:
передает id страницы (статьи), не могу понять как составить правильно запрос чтобы мне выводило комментарии только те которые относятся к данной статье. Мне же щас выводит все статьи.
CODE (SQL):
скопировать код в буфер обмена
  1. ...WHERE `id_page`={$page['id_page']}
Т.е. в коде страницы, на которой выводятся специфичные для нее комменты, по-любому должен быть доступен ее идентификатор.

Цитата:
если убрать exit(0) то каждый раз при обновлении страницы идёт запись в бд.
Редирект, потом exit. Атрибут value в элементах формы зачищаем. Вам еще рано делать такие штуки.

Концовка кода – бред. Какой нафиг $_POST['id_page'], если это типа ветка для обработки GET-запроса.
5. Andry - 20 Июля, 2018 - 11:27:57 - перейти к сообщению
Немного переделал, получилось вот так.
PHP:
скопировать код в буфер обмена
  1. function check_length($value = "", $min, $max) {
  2.     $result = (mb_strlen($value) < $min || mb_strlen($value) > $max);
  3.     return !$result;
  4. }
  5.  
  6. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  7.        
  8.         if ( isset( $_POST['id'] ) && !empty( $_POST['id'] ) ):
  9.        
  10.                 $nameErr=null;
  11.                 $name=trim($_POST["name"]);
  12.                 $name=strip_tags($name);
  13.                 $name=htmlspecialchars($name,ENT_QUOTES);      
  14.                 $name=stripslashes($name);
  15.                 if(strlen($name)=="0"):
  16.                         $nameErr.="Заполните поле 'Ваше имя'<br>";
  17.                 endif;
  18.                
  19.                 $textErr=null;
  20.                 $text=trim($_POST["text"]);
  21.                 $text=strip_tags($text);
  22.                 $text=htmlspecialchars($text,ENT_QUOTES);
  23.                 $text=stripslashes($text);
  24.                 if(strlen($text)=="0"):
  25.                         $textErr.="Заполните поле 'Текст Сообщения'<br>";
  26.                 endif;
  27.                
  28.                 $mail=null;
  29.                 $mail=trim($_POST["mail"]);
  30.                 $mail=strip_tags($mail);
  31.                 $mail=htmlspecialchars($mail,ENT_QUOTES);
  32.                 $mail=stripslashes($mail);
  33.                 if(!filter_var($mail, FILTER_VALIDATE_EMAIL)):
  34.                         $mailErr.="Неверное значение<br>";
  35.                 endif;
  36.                
  37.                 $id_page = $_GET['id'];
  38.  
  39.         if(!empty($name) == check_length($name, 2, 25) && !empty($text) == check_length($text, 2, 1000) && !empty($mail) != $mailErr) {        
  40.                 $query = $db->prepare("INSERT INTO comment_form SET name=:name, text=:text, mail=:mail, id_page=:id_page");
  41.                 $params = ['name'=>$name,'text'=>$text,'mail'=>$mail, 'id_page'=>$id_page] ;
  42.                 $query->execute($params);
  43.                
  44.                 header('Location: '.$_SESSION['PHP_SELF']);
  45.                 exit();
  46.                 } else {
  47.                 $allErr.="Введенные данные некорректные<br>";  
  48.                 }      
  49.         endif;
  50. }
  51.         $query = $db->prepare("SELECT * FROM comment_form");
  52.         $query->execute();
  53.         $comments = $query->fetchAll();
  54.  

Не получается выполнить
PHP:
скопировать код в буфер обмена
  1. header('Location: '.$_SESSION['PHP_SELF']); exit();

выдает ошибку, но даже с ошибкой записи идут в бд.
С концовкой вообще не знаю что
PHP:
скопировать код в буфер обмена
  1. <?=$_GET['id'];?>
- работает
PHP:
скопировать код в буфер обмена
  1. <?=$id_page;?>
- не работает
думал ещё передавать значение через
PHP:
скопировать код в буфер обмена
  1. <?=$_SERVER['QUERY_STRING'];?>

но так тоже не присылало значений.
Подскажите как мне обойтись без $_GET['id'], чую всё из-за него)
6. miketomlin - 20 Июля, 2018 - 13:13:01 - перейти к сообщению
Цитата:
Не получается выполнить
Что за $_SESSION['PHP_SELF']? Нужно как-то так:
PHP:
скопировать код в буфер обмена
  1. $_SERVER['REQUEST_URI'].'#comment-'.$insert_id


Цитата:
С концовкой вообще не знаю что
А что это вообще за концовка? Выборка всех комментов для их вывода что ли? Я вам в пред. посте писал, что в запросе нужно как минимум указать условие с id статьи.

Цитата:
думал ещё передавать значение через
Это все детали. Главное, что все же в адресе передаете, а не в POST-параметре. Можно частично использовать общий код для обоих типов запросов (действий). При проверке корректности id, например. Адреса в запросах будут одинаковые. Лучше конечно в пути передавать. И не числовой id, а слаг, чтобы получились красивые ЧПУ, например http://g09[dot]ru/articles/my-first-article .

И разберитесь прежде с основной логикой, после уже будете про всякие strip_tags думать.
(Добавление)
P.S. При ошибке вставки можете перенаправлять, например, на '/error'.$_SERVER['REQUEST_URI'], либо по возможности сохранять данные, но выставлять «флаг скрытности», если что-то не так. Короче полет фантазии не ограничен. И программирование – это удовольствие, а у вас пока получается напряг Улыбка

 

Powered by ExBB FM 1.0 RC1