Анналы comment php. Простая система комментирования с использованием AJAX

25.04.2017


Всем привет!
Продолжаем изучать основы PHP с нуля!
В этом уроке я расскажу, что такое комментарий в PHP и на практике попробуем прописать в коде свой комментарий. Но это еще не все. Еще хочу рассказать, как закомментировать код и для чего это вообще нужно делать.

Что такое комментарий в PHP
Комментарий в PHP – это подсказка php-разработчика для быстрого ориентирования в коде, а также для правок.

Комментарий в PHP невиден для пользователя, который открыл веб-страницу для просмотра. Даже если пользователь надумается посмотреть исходный код страницы, комментарий все равно виден не будет, так как и весь код php.

PHP комментарий коде

Существует 2 вида комментариев для кода PHP:

→ однострочный
→ многострочный

⇒ Однострочный комментарий для PHP
Для однострочного комментария следует применять символы «// » или «# »

После этих символов все, что записано в одну строку будет игнорироваться и считаться как комментарий.

Подпишись на обновление"; # подписка (это комментарий) ?>


Подпишись на обновление

⇒ Многострочный комментарий для PHP
Многострочный комментарий для PHP начинается с символа «/* » и заканчивается символом «*/ ».
Все, что находится между этими символами, будет игнорироваться и считаться как комментарий.
Многострочный комментарий используется, если в записи несколько строк.

На экране вы только увидите вот такой текст:

Привет читателям блога - сайт!!!

P.S.: Всегда комментируйте свой код. Если вы считаете, что вспомните все, что делали в коде через 1-2 года, вы ошибаетесь, шанс очень маленький. Даже если и вспомните, то придется потратить кучу времени на изучение – что, куда и зачем…
Сделайте приятное для себя будущего – закомментируй код и ты сам себе потом скажешь «СПАСИБО!!!».
Оставь комментарий в коде, это займет 1 минуту времени, но сэкономит тебе в будущем целый день.

Закомментировать PHP код

Припустим, вы написали php код, но по каким-то причинам вам нужно удалить из кода 2 строки.
Я не спешу удалять что-то из кода, особенно, если это php-код, я лучше его закомментирую. А вдруг нужно будет код вернуть. Легче же разкомментировать, чем по-новому писать код.

Как закомментировать код в PHP
Пример с однострочным комментарием:

Подпишись на обновление"; ?>

Пример с многострочным комментарием.

Комментарии в PHP аналогичны комментариям, которые используются в HTML. В синтаксисе PHP комментарий начинаются всегда с особой последовательностью символов и весь текст, который появляется между этих спецсимволов, будет проигнорирован интерпретатором.

В HTML основная цель комментария в том, чтобы служить в качестве примечания разработчикам, которые могут просматривать исходный код вашего сайта. Комментарии РНР отличаются тем, что они не будут отображаться для посетителей. Единственный способ посмотреть PHP комментарии это открыть файл для редактирования. Это делает PHP комментарии полезными только для PHP — программистов.

В случае, если вы забыли или не знали, как делаются комментарии в HTML, то смотрите пример ниже.

Синтаксис php комментариев: однострочный комментарий

Тогда как в html есть только один вид комментариев, в PHP имеется целых два типа. Первый тип, который мы будем обсуждать, это однострочный комментарий. То есть комментарий, который говорит интерпретатору игнорировать все, что происходит на этой линии справа от комментариев. Для использования этого комментария следует применять символы «//» или «#» и весь текст справа будет игнорироваться интерпретатором PHP.

Psst...You can"t see my PHP comments!"; // echo "nothing"; // echo "My name is Humperdinkle!"; # echo "I don"t do anything either"; ?>

Результат:

Hello World! Psst...You can"t see my PHP comments!

Обратите внимание на то, что несколько наших команд echo не были обработаны, потому что мы закомментировали их с помощью специальных символов комментирования. Этот тип комментариев часто используется для быстрой записи о сложном и запутанном коде или чтобы временно удалить строку кода PHP (для отладки).

Синтаксис php комментариев: многострочный комментарий

Как и HTML — комментарии, многострочные комментарии в PHP могут быть использованы для комментирования больших блоков кода или для записи комментов в несколько строк. Многострочные комментарии в PHP начинается с «/*» и заканчиваются «*/». Все, что находится между этими символами, будет игнорироваться.

Результат.

Я когда-то писал о . Так вот, мы с Вами там рассмотрели только "жадных " представителей. Однако, не всегда их "жадность " нам помогает, очень часто она и вредит. Чуть ниже я покажу пример, где чётко видно то, что они иногда делают, а также покажу как уменьшить их пыл и сделать квантификаторы повторений "ленивыми" .

Давайте разберём простой и уже ставший классическим пример:

$str = "Небольшая строка c жирным выделением.";
.*<\/b>
echo $result_str;
?>

Возможно, Вы ожидаете что-то наподобие этого: "Небольшая здесь_жирное_выделение с здесь_жирное_выделение выделением ". То есть просто замена содержимого внутри тега <b > на заданную нами строку вместе с самим тегом. Однако, это не совсем так, поскольку здесь вступает в игру "жадность квантификаторов ". И в результате замена была не внутри каждого тега <b >, а от самого первого открывающего тега до самого последнего закрывающего. В этом и состоит жадность.

Вот как надо писать данный код, чтобы замена происходила так, как мы хотим:

$str = "Небольшая строка c жирным выделением.";
$result_str = preg_replace("/.*?<\/b>/i", "здесь_жирное_выделение", $str);
echo $result_str;
?>

Всё, что мы изменили это регулярное выражение, поставив после квантификатора повторений ".* " знак вопроса, который как раз и делает квантификатор "ленивым" . Теперь результатом будет: "Небольшая здесь_жирное_выделение c здесь_жирное_выделение выделением. ", чего мы и пытались добиться.

Я очень надеюсь, что Вы осознали проблему "жадности" квантификаторов и поняли, как они работают. А также осознали, как это можно исправить простым знаком "? ". Эта тема действительно важная, и огромное количество новичков в регулярных выражениях делают одни и те же ошибки, связанные с "жадностью" квантификаторов повторений , поэтому если Вы ещё не осознали весь смысл до конца, то перечитайте статью ещё раз.

Шаг 1 - XHTML

Сначала посмотрим на разметку комментария. Данный код генерируется PHP с классом Comment .

demo.php

Имя пользователя
30 Jun 2010

Текст комментария

div avatar содержит ссылку (если пользователь ввел правильный URL при размещении комментария) и изображение аватара, которое мы получаем с gravatar.com . Мы вернемся к формированию разметки на шаге PHP. В завершении следуют div name div time и текст комментария.

Другим важным элементом в XHTML является форма комментария. Она отправляется с помощью POST . Все поля, кроме URL, должны быть заполнены.

demo.php

Добавить комментарий

Форма отправляется с помощью AJAX. Проверка выполняется в фоновом режиме в submit.php . Каждое поле имеет соответствующий элемент label , с установленным атрибутом for .

Шаг 2 - PHP

PHP обрабатывает коммуникацию с базой данных MySQL и генерирует разметку для комментария. Он также получает окончание запроса AJAX и вставляет данные комментария в таблицу comments .

demo.php

/* / Выбираем все комментарии и наполняем массив $comments объектами */ $comments = array(); $result = mysql_query("SELECT * FROM comments ORDER BY id ASC"); while($row = mysql_fetch_assoc($result)) { $comments = new Comment($row); }

Запрос MySQL выбирает все записи из таблицы и заполняет массив $comments объектами класса comment . Данный массив выводится далее при выполнении скрипта.

demo.php

/* / Вывод комментариев один за другим: */ foreach($comments as $c){ echo $c->markup(); }

Каждый комментарий имеет метод markup() , который генерирует правильный HTML код, готовый для вывода на страницу. Ниже приведены определения класса и метода.

Класс получает строку из базы данных (получаемую с помощью mysql_fetch_assoc() ) и сохраняет ее в переменной $data . Она доступна только методу класса.

comment.class.php - Часть 1

class Comment { private $data = array(); public function __construct($row) { /* / Конструктор */ $this->data = $row; } public function markup() { /* / Данный метод выводит разметку XHTML для комментария */ // Устанавливаем псевдоним, чтобы не писать каждый раз $this->data: $d = &$this->data; $link_open = ""; $link_close = ""; if($d["url"]){ // Если был введн URL при добавлении комментария, // определяем открывающий и закрывающий теги ссылки $link_open = ""; $link_close = ""; } // Преобразуем время в формат UNIX: $d["dt"] = strtotime($d["dt"]); // Нужно для установки изображения по умолчанию: $url = "http://".dirname($_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"])."/img/default_avatar.gif"; return "
".$link_open." ".$link_close."
".$link_open.$d["name"].$link_close."
".date("d M Y",$d["dt"])."

".$d["body"]."

"; }

Скрипт использует gravatar для представления аватара в комментариях. Gravatar - это очень полезный сервис, который устанавливает соответствие аватара с email адресом. Изображение аватара может быть легко получено с помощью передачи кодированного функцией md5() вашего email адреса на gravatar.com.

Скрипт определяет адрес URL, на котором выполняется, и определяет точный адрес изображения default_avatar.gif . Данное изображение передается на параллельно с хэшем md5, и если никакого аватар не было найдено для переданного email адреса, то будет выведено альтернативное изображение.

comment.class.php - Часть 2

public static function validate(&$arr) { /* / Данный метод используется для проверки данных отправляемых через AJAX. / / Он возвращает true/false в зависимости от правильности данных, и наполняет / массив $arr, который преается как параметр либо данными либо сообщением об ошибке. */ $errors = array(); $data = array(); // Используем функцию filter_input, введенную в PHP 5.2.0 if(!($data["email"] = filter_input(INPUT_POST,"email",FILTER_VALIDATE_EMAIL))) { $errors["email"] = "Пожалуйста, введите правильный Email."; } if(!($data["url"] = filter_input(INPUT_POST,"url",FILTER_VALIDATE_URL))) { // Если в поле URL был введн неправильный URL, // действуем так, как будто URL не был введен: $url = ""; } // Используем фильтр с возвратной функцией: if(!($data["body"] = filter_input(INPUT_POST,"body",FILTER_CALLBACK,array("options"=>"Comment::validate_text")))) { $errors["body"] = "Пожалуйста, введите текст комментария."; } if(!($data["name"] = filter_input(INPUT_POST,"name",FILTER_CALLBACK,array("options"=>"Comment::validate_text")))) { $errors["name"] = "Пожалуйста, введите имя."; } if(!empty($errors)){ // Если есть ошибки, копируем массив $errors в $arr: $arr = $errors; return false; } // Если данные введены правильно, подчищаем данные и копируем их в $arr: foreach($data as $k=>$v){ $arr[$k] = mysql_real_escape_string($v); } // email дожен быть в нижнем регистре: $arr["email"] = strtolower(trim($arr["email"])); return true; }

Метод validate() (также часть класса) определен как static . Это означает, что его можно вызвать непосредственно с помощью конструкции Comment::validate() , без создания объекта класса. Данный метод проверяет данные, которые передаются через AJAX.

Метод использует новую функцию фильтра, которая стала доступна в PHP 5.2.0 . Таким образом мы можен легко проверить и отфильтровать данные, которые передаются скрипту. Например, filter_input(INPUT_POST,’url’,FILTER_VALIDATE_URL) означает, что мы проверяем, является ли $_POST["url"] правильным адресом URL. Если это так, то функция возвращает значение переменной, в другом случае она возвращает значение false .

До использования такой функции нужно было использовать регулярные выражения для проверки данных (с задействованием серии конструкций if ). Дополнительным преимуществом является то, что мы получаем данные до проведения каких-либо специфических преобразований.

Также возможно задать функцию, которая будет проводить дополнительные модификации данных.

comment.class.php - Часть 3

private static function validate_text($str) { /* / Данный метод используется как FILTER_CALLBACK */ if(mb_strlen($str,"utf8")<1) return false; // Кодируем все специальные символы html (<, >, ", & .. etc) и преобразуем // символ новой строки в тег
: $str = nl2br(htmlspecialchars($str)); // Удаляем все оставщиеся символы новой строки $str = str_replace(array(chr(10),chr(13)),"",$str); return $str; }

Последний метод validate_text передаётся в качестве возвратной функции в два вызова filter_input . Он преобразует все специальные символы HTML, что эффективно блокирует атаки XSS. Также он заменяет символы новой строки тегами
.

submit.php

/* / Данный массив будет наполняться либо данными, / которые передаются в скрипт, / либо сообщениями об ошибке. /*/ $arr = array(); $validates = Comment::validate($arr); if($validates) { /* Все в порядке, вставляем данные в базу: */ mysql_query(" INSERT INTO comments(name,url,email,body) VALUES ("".$arr["name"]."", "".$arr["url"]."", "".$arr["email"]."", "".$arr["body"]."")"); $arr["dt"] = date("r",time()); $arr["id"] = mysql_insert_id(); /* / Данные в $arr подготовлены для запроса mysql, / но нам нужно делать вывод на экран, поэтому / готовим все элементы в массиве: /*/ $arr = array_map("stripslashes",$arr); $insertedComment = new Comment($arr); /* Вывод разметки только-что вставленного комментария: */ echo json_encode(array("status"=>1,"html"=>$insertedComment->markup())); } else { /* Вывод сообщений об ошибке */ echo "{"status":0,"errors":".json_encode($arr)."}"; }

submit.php получает комментарий из данных через запрос AJAX. Проверяет его и выводит объект JSON, в котором содержится либо разметка XHTML с вставленным комментарием, либо список ошибок. jQuery использует свойство status для определения того, что нужно выводить - либо сообщение об ошибках, либо добавлять разметку комментария к странице.

Ниже приводятся два примера.

Успешный ответ

{ "status": 1, "html": "Html Code Of The Comment Comes Here..." }

Свойство html содержит код комментария.

Ответ об ошибке

{ "status": 0, "errors": { "email": "Please enter a valid Email.", "body": "Please enter a comment body.", "name": "Please enter a name." } }

При наличии ошибки jQuery проходит циклом по объекту ошибок и выводит сообщения рядом с полями, в которых есть ошибки.

Шаг 3 - CSS

Теперь, когда разметка правильно генерируется и отображается на странице, мы можем перейти к заданию стилей.

styles.css - Часть 1

.comment, #addCommentContainer{ /* Стиль для комментариев */ padding:12px; width:400px; position:relative; background-color:#fcfcfc; border:1px solid white; color:#888; margin-bottom:25px; /* Скругленные углы и тени CSS3 */ -moz-border-radius:10px; -webkit-border-radius:10px; border-radius:10px; -moz-box-shadow:2px 2px 0 #c2c2c2; -webkit-box-shadow:2px 2px 0 #c2c2c2; box-shadow:2px 2px 0 #c2c2c2; } .comment .avatar{ /* / Аватар позиционируется абсолютно. / Внешнее смещение для div комментария /*/ height:50px; left:-70px; position:absolute; width:50px; background:url("img/default_avatar.gif") no-repeat #fcfcfc; /* Центрируем вертикально: */ margin-top:-25px; top:50%; -moz-box-shadow:1px 1px 0 #c2c2c2; -webkit-box-shadow:1px 1px 0 #c2c2c2; box-shadow:1px 1px 0 #c2c2c2; }

div .comment и #addCommentContainer имеют одинаковый стиль. Используется несколько правил CSS3 для скругления углов и отражения теней.

styles.css - Часть 2

.comment .avatar img{ display:block; } .comment .name{ font-size:20px; padding-bottom:10px; color:#ccc; } .comment .date{ font-size:10px; padding:6px 0; position:absolute; right:15px; top:10px; color:#bbb; } .comment p, #addCommentContainer p{ font-size:18px; line-height:1.5; overflow-x:hidden; } #addCommentContainer input, #addCommentContainer textarea{ /* Стиль для ввода */ display:block; border:1px solid #ccc; margin:5px 0 5px; padding:3px; font-size:12px; color:#555; font-family:Arial, Helvetica, sans-serif; } #addCommentContainer textarea{ width:300px; } label{ font-size:10px; } label span.error{ color:red; position:relative; right:-10px; } #submit{ /* Кнопка "Отправить" */ background-color:#58B9EB; border:1px solid #40A2D4; color:#FFFFFF; cursor:pointer; font-family:"Myriad Pro",Arial,Helvetica,sans-serif; font-size:14px; font-weight:bold; padding:4px; margin-top:5px; -moz-border-radius:4px; -webkit-border-radius:4px; border-radius:4px; } #submit:hover{ background-color:#80cdf5; border-color:#52b1e2; }

Во второй части мы задаем стили для комментариев и элементов формы. Отметим селектор input, который выделяет элементы в зависимости от атрибута type .

Шаг 4 - jQuery

Теперь перейдем к jQuery.

script.js

$(document).ready(function(){ /* Следующий код выполняется только после загрузки DOM */ /* Данный флаг предотвращает отправку нескольких комментариев: */ var working = false; /* Ловим событие отправки формы: */ $("#addCommentForm").submit(function(e){ e.preventDefault(); if(working) return false; working = true; $("#submit").val("Working.."); $("span.error").remove(); /* Отправляем поля формы в submit.php: */ $.post("submit.php",$(this).serialize(),function(msg){ working = false; $("#submit").val("Submit"); if(msg.status){ /* / Если вставка была успешной, добавляем комментарий / ниже последнего на странице с эффектом slideDown /*/ $(msg.html).hide().insertBefore("#addCommentContainer").slideDown(); $("#body").val(""); } else { /* / Если есть ошибки, проходим циклом по объекту / msg.errors и выводим их на страницу /*/ $.each(msg.errors,function(k,v){ $("label").append(""+v+""); }); } },"json"); }); });

Мы используем вызов функции $(document).ready() , которая привязывает функцию к событию . Переменная working действует как флаг, который сигнализирует о том, что запрос AJAX находится в работе (таким образом предотвращается дублирование одного и того же комментария).

В возвратной функции для запроса POST AJAX мы проверяем свойство status , чтобы определить, был ли успешно вставлен комментарий. Если да, мы добавляем полученную разметку на страницу после последнего комментария с анимацией slideDown .

Если были проблемы, то мы выводим сообщения об ошибках, добавляя span error к соответствующему элементу label (атрибут элемента label содержит id ввода, который имеет ошибку).

Готово!

Заключение

Чтобы запустить скрипт на вашем сервере нужно создать таблицу comments в вашей базе данных MySQL. Вы можете сделать это с помощью кода SQL из файла table.sql , который надо ввести на закладке SQL в phpMyAdmin. Затем нужно установить параметры соединения с базой данных MySQL в файле connect.php .

Похожие статьи

  • Как удалить антивирус с компьютера полностью точный способ Можно ли удалить антивирус

    Многие владельцы компьютеров или ноутбуков устанавливая пробные версии антивирусов впоследствии желают их удалить и как назло им это не удаться (не получается).Для этого есть причины. Создатели делают все возможное чтобы их антивирусные...

  • Россельхозбанк ошибка 2913 что делать

    И нажмите кнопку «Далее» . И нажмите кнопку «Установить» . После запуска выберите из списка город, в котором открыты Ваши счета, установите отметку напротив пункта «Установка/переустановка системы» и нажмите кнопку «Далее» ....

  • Как можно тремя способами установить Windows на Mac

    Издавна специалисты в области компьютерных технологий отмечают приоритет именно компании Apple в области разработок персональных компьютеров. Начиная с середины 70-х годов прошлого столетия до сегодняшних дней, Apple уверенно конкурирует с...

  • Выделение, перенос, копирование

    §5 . Работа с фрагментами изображения Прежде чем что-либо делать с фрагментом изображения, его необходимо выделить.Выделение фрагмента Фрагмент изображения выделяется с помощью инструмента «Выделение» (фигурные или прямоугольные...

  • Как работает видеосвязь в имо

    Когда-то давно Imo.i, создал свой протокол. Потом преобразовал его из мессенджера в социальную сеть. Теперь мультипротокольный мессенджер перестал быть мультипротокольным. И мессенджером. Не работает Imo.im? Так и должно быть В...

  • Почему не открывается "Плей Маркет"?

    Большинство владельцев устройств на базе Андроид сталкивались с тем, что какое-то приложение не запускается. Они либо вовсе не хотят запускаться, либо работают не так, как нужно. Это вызывает вопрос: «Почему не работают приложения на...