//если выбрано поле "комментарии" выходим и ничего не делаем в разделе "ответы"
if (isset($_POST['category']) and $_POST['category'] == 'say') {
}
/* иначе формируем запрос к базе */ elseif (isset($_POST['action']) and $_POST['action'] == 'search' or !isset($_POST['action'])) {
include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';
// Базовое выражение SELECT.
$select = 'SELECT reply.userid, reply.replytext,reply.replyid, reply.replydate ';
$from = ' FROM reply INNER JOIN users ON reply.userid = users.id ';
$where = ' WHERE TRUE';
$order = ' ORDER BY reply.replyid';
$sequencer = array();
if (isset($_POST['author']) and $_POST['author'] != '') { // Автор выбран
$where .= " AND userid = :userid";
$sequencer[':userid'] = $_POST['author'];
}
if (isset($_POST['text']) and $_POST['text'] != '') { // Была указана какая-то искомая строка
$where .= " AND replytext LIKE :replytext";
$sequencer[':replytext'] = '%' . $_POST['text'] . '%';
}
try {
$sql = $select . $from . $where . $order;
$s = $dsn->prepare($sql);
$s->execute($sequencer);
} catch (PDOException $e) {
echo $e->getMessage();
echo $e->getLine();
exit('Ошибка при извлечении ответов на комментарии');
}
foreach ($s as $row) {
$replys[] = array('replyid' => $row['replyid'], 'userid' => $row['userid'], 'replytext' => $row['replytext'], 'replydate' => $row['replydate']);
}
}
include_once $_SERVER['DOCUMENT_ROOT'] . '/chat/admin/comment.html.php';
Вывод информации производится в соответствии с условиями заданными в форме поиска: по имени пользователя, по разделу, по искомому тексту.
В начале скрипта делаем выборку из БД всех пользователей. Затем получаем из БД логин пользователя, для которого выполняется поиск.
Создаем запрос SELECT, зависящий от указанных в форме условий. Сначала определим строки, объединение которых формирует запрос SELECT в том случае, если не выбран ни один критерий, строки находятся в переменных:
$select, $from и $where.
Если кнопка «Искать» не нажималась, то $_POST['action'] будет отсутствовать и будут, отображены все комментарии и ответы них.
Т.к. базовое выражение SELECT собирается из тех критериев, что выбраны в форме, то в запросе будут операторы FROM и WHERE. Если критерии не заданы (то есть нужно получить все данные из БД), WHERE будет ненужной. Добавлять выражения к несуществующему оператору проблематично, поэтому подставляем такую команду, которая никак не повлияет на результат, если ее опустить. Здесь подойдет выражение WHERE TRUE, которое всегда истинно.
Для добавления новой строки к существующей используется оператор конкатенации (.=). В этом скрипте к оператору WHERE добавляется условие, по которому содержимое поля userid из таблицы say должно совпадать со значением псевдопеременной :userid. Вначале скрипта с помощью метода bindValue установить требуемое общее значение $_POST['author'] нельзя т.к. еще не подготовлен объект параметризированного запроса, из которого этот метод вызывается. Вследствие этого запрос разбросан по вышеперечисленным строкам ($select, $from и $where).
Инициализируем массив $sequence для сохранения параметризированных переменных, используя их имена в качестве индексов. В массиве будет храниться id пользователя и текст поискового запроса. Содержимое массива:
$sequence (
:userid => "$_POST['author']",
:saytext => "'%'.$_POST['text'].'%'"
);
где "$_POST['author']" = $user['id'].
Чтобы получить значение параметризированной переменной для оператора LIKE, содержимое $_POST['text'] размещено между двумя знаками процента (%). LIKE воспринимает этот знак как групповой символ, поэтому при поиске строки $_POST['text'] в поле text формы search.html.php в расчет будут приниматься также строки, где до и после этого значения находится другой текст.
Запускаем. Если все сделано без ошибок, то при запущенном на «Open Server» тестовом сайте при переходе по адресу: news/chat/admin/comment.php видим страницу статистики комментариев (см. рис. 15)
Рис. 18. Вид страницы статистики комментариев
На этом этапе необходимо заняться контроллером 2 и кнопками авторизации, так как опробовать работу страницы в деле пока нельзя в связи с отсутствием комментариев и ответов на них.