php - mysqli работает, но pdo нет - PullRequest
1 голос
/ 10 февраля 2012

Я пытаюсь переключиться на pdo и добился успеха с ним, но моя последняя функция не будет работать. Однако когда я возвращаюсь к mysqli, это нормально. Я уверен, что что-то упустил, но что ??

не работает PDO:

$db = db_pdo();
$query = $db->prepare("select * from locks_for_sale where type_3=':search'");
$query->bindParam(":search", $sub_items[3]);
$query->execute();

if (!$result=$query->fetch()) {
    $print .= "<tr><td>&nbsp;</td><td><h3>No products currently available.</h3></td></tr>\n";
}

else {
    other code

Обратите внимание:
функция db_pdo включена.
$ sub_items [3] является строкой.

рабочий mysqli:

$db = db_conn();
$sql = "select * from locks_for_sale where type_3='".$sub_items[3]."'";
$query = $db->query($sql);

if (!$query->fetch_assoc()) {
    $print .= "<tr><td>&nbsp;</td><td><h3>No products currently available.</h3></td></tr>\n";
}

else {
    other code

Снова включается db_conn.

Я знаю, что результат этого запроса возвращает 2 элемента, но версия pdo показывает! $ Result.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

Удалите кавычки из параметра :search:

$query = $db->prepare("select * from locks_for_sale where type_3=:search");
//--------------------------------------------------------------^^^^^^^^^^

Если кавычка, она будет восприниматься как буквальная строка ':search', и вы получите ошибку для привязки неверногочисло параметров.

Если вы новичок в подготовленных выражениях, постарайтесь не думать о них как о эквиваленте помещения переменных в строку SQL, как при конкатенации или интерполяции переменных.Вместо этого вы передаете значения параметров непосредственно в механизм базы данных, который, в свою очередь, поместит их соответственно в запрос.На СУБД возлагается ответственность за создание действительного утверждения с соответствующим цитированием.

0 голосов
/ 10 февраля 2012

try bindValue (http://www.php.net/manual/en/pdostatement.bindvalue.php)

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>

См. Также: В чем разница между bindParam и bindValue?

0 голосов
/ 10 февраля 2012

Учитывая ваш 00000 код ошибки, это фактически означает, что запрос выполнен успешно.Проблема в логике выборки:

if (!$query->fetch_assoc()) {
    ^--- remove

, если выборка завершится успешно, вызов вернет not-false, иначе trueЗатем вы инвертируете это с помощью ! и превращаете его в ложное, вызывая запуск other code.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...