Просмотр поста

.
AlkatraZ
╭∩╮ (`-`) ╭∩╮
В том же блоке кода, который мы дорабатывали выше, есть еще пара мелких запросов, давайте разберем их.

В строке 55 мы видим следующий запрос:
$req = mysql_query("SELECT `time` FROM `guest` WHERE `ip` = '$ip' AND `browser` = '" . mysql_real_escape_string($agn) . "' AND `time` > '" . (time() - 60) . "'");
Глядя на него я вижу, что там применяется всего одна переменная требующая экранировки, остальные числовые и безопасные. Посему стало лень писать подготовленный запрос и решил обойтись простой экранировкой с помощью метода ->quote() тем более на практике покажу его применение.
Для начала, мы заменяем все старые функции Mysql на их аналоги из PDO.
$req = $db->query("SELECT `time` FROM `guest` WHERE `ip` = '$ip' AND `browser` = '" . $db->quote($agn) . "' AND `time` > '" . (time() - 60) . "'");
Но если запустите скрипт, он вывалится с ошибкой, SQL Запрос не рабочий. Почему?
Да потому, что как я писал выше, ->quote не только экранирует строку, но и берет ее в кавычки.
А у нас то в запросе переменная уже была взята в кавычки, посему получается ошибка.
Следовательно из запроса надо убрать кавычки вокруг $db->quote($agn)
НЕ ЗАБЫВАЙТЕ ПРО ЭТО!
Рабочий вариант запроса выглядит так:
$req = $db->query("SELECT `time` FROM `guest` WHERE `ip` = '$ip' AND `browser` = " . $db->quote($agn) . " AND `time` > '" . (time() - 60) . "'");

---
Далее (строка 97), мы видим, что проверяется число возвращенных запросом строк mysql_num_rows().
if (mysql_num_rows($req)) {...}

В PDO для этого есть аналог ->rowCount() и переделанная строка будет смотреться так:
if ($req->rowCount()) {...}


Ну и наконец, получение результата запроса в виде ассоциативного массива (строка 98)
$res = mysql_fetch_assoc($req);
после переделки выглядит так:
$res = $req->fetch();