Я конвертирую свой код MySQL в PDO, чтобы воспользоваться подготовленными операторами. Первоначально я получал фатальную ошибку, как описано в этом вопросе . Я решил эту проблему, но при попытке добавить параметры возникли проблемы.
Код, который я пытаюсь получить, – это:
include ("foo/bar.php"); try { $DBH = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); } catch(PDOException $e) { echo $e->getMessage(); } $mydate=date("Ymd",strtotime("-3 months")); $foo_query=$DBH->prepare("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = :postdate AND postdate > '$mydate' ORDER BY postdate DESC"); $foo_query->execute( array('postdate' => $_REQUEST['postdate']) ); $DBH=null;
На английском языке это предназначено для чтения « взять текущую дату и установить ее обратно 3 месяца, называя ее $ mydate, затем выберите все эти поля (также беря первые 20 слов тела и называя его« preview_text ») из моей таблицы где postdate равен параметру postdate и где postdate больше $ mydate ".
Затем я показываю результаты в следующем (обратите внимание, что это теперь сокращено):
$foo_query->setFetchMode(PDO::FETCH_ASSOC); while($r=$foo_query->fetch()) { echo $r["id"]; echo $r["title"]; echo date("dMY",strtotime($r["postdate"])); echo nl2br ($r["preview_text"]); }
Теперь, когда запрос SELECT написан как:
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate > '$mydate' ORDER BY postdate DESC")
… он отображает именно то, что мне нужно, но, конечно, пока он подготовлен, он не содержит параметров, поэтому достигается только 50% цели.
У меня сложилось впечатление, что способ подготовить заявление, которое я изложил изначально, было бы прекрасно в соответствии с учебными пособиями и советами, которые я уже дал.
Я попытался напечатать свою ошибку и не вызывает ошибок. Я вручную отправил запрос следующим образом и не получил никаких возвратов. Примечание. Я пробовал строки даты во всех возможных перестановках:
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = 20121001 AND postdate > 20120701 ORDER BY postdate DESC")
EDIT: указанное выше было указано как неправильное, но я сохраню его здесь для справки, поскольку этот раздел объясняется в комментариях ниже.
EDIT: ручная отправка запроса теперь отображается правильно при вводе:
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = '2012-09-30 08:38:23' ORDER BY postdate DESC")
Запрос не отображается вообще при вводе любого из следующего:
("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = :postdate ORDER BY postdate DESC") ("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = :postdate AND postdate > '$mydate' ORDER BY postdate DESC") ("SELECT id, postdate, title, SUBSTRING_INDEX(body,' ',20) as preview_text, body FROM BarTable WHERE postdate = '2012-09-30 08:38:23' AND postdate > '2012-07-01 00:01' ORDER BY postdate DESC")
Я думаю, что я должен каким-то образом связать параметр, но в учебниках, которые я прочитал, конкретно не говорится, что я должен их всегда связывать – я не уверен, как действовать.
EDIT: Я искал привязку заявления следующим образом без успеха. Запрос, по-видимому, игнорирует привязку, поэтому состояние запроса действует как все перечисленные выше перестановки без привязки:
$foo_query->bindParam ( ":postdate", strtotime ( $_REQUEST['postdate']), PDO::PARAM_INT); $foo_query->execute();
Что я делаю неправильно, чего не происходит, когда я не добавляю параметры? Должен ли я объявлять параметр postdate где-то иначе, чем в запросе SELECT?
В целях предотвращения внедрения SQL я хотел бы использовать именованные параметры, а также подготовить инструкцию, но если я не могу понять это, мне просто не нужно будет использовать именованные параметры.