Как использовать подготовленные заявления в этом запросе? - PullRequest
1 голос
/ 22 декабря 2009

Я новичок в PHP и PDO, и я пытаюсь использовать подготовленные операторы здесь. После 1 часа попыток я сдаюсь. Или мой учебник был просто ужасно плох.

EDIT:

Это прекрасно работает без подготовленных утверждений:

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name="root"');
    //$prepared->bindParam('foo', 'root');

    $prepared->execute();

    foreach($prepared as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Но это не работает с готовым утверждением. Получая полностью пустую страницу при этом:

try {
    $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
    $prepared = $dbh->prepare('SELECT * from sys_navigation_point WHERE name=:foo');
    $prepared->bindParam('foo', 'root');

    $prepared->execute();

    foreach($prepared as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

foo следует заменить на root. Однако это не так.

Ответы [ 5 ]

5 голосов
/ 22 декабря 2009

Попробуйте использовать двоеточие в имени тоже при связывании:

$prepared->bindParam(':foo', 'root');

Как это сделано в документах: http://php.net/manual/en/pdostatement.bindparam.php

2 голосов
/ 22 декабря 2009

Ваш второй параметр bindParam имеет в качестве переменной, в противном случае вы получите фатальную ошибку. Итак,

$value='root';
$prepared->bindParam('foo', $value);

или

$prepared->bindValue('foo', 'root');


Легко понять, когда отображаются сообщения об ошибках:

if ($in_development) ERROR_REPORTING(E_ALL);
// ... code
1 голос
/ 22 декабря 2009

Нельзя использовать параметры для таких вещей, как имена таблиц и столбцов, они предназначены только для данных, а не для полностью динамических запросов

Это должно работать:

$prepared = $dbh->prepare('SELECT * from sy_navigation_point WHERE Foo=:whatever');
$prepared->bindParam('whatever', 'Bar');

РЕДАКТИРОВАНИЕ: Это должно быть реальным решением.

Из документации становится ясно, что шаблон должен быть:

$prepared = $dbh->prepare('SELECT * from sy_navigation_point WHERE Foo=:whatever');
$prepared->bindParam('whatever', $value);

Тогда вы делаете:

$value = 'Bar';
$prepared->execute();
1 голос
/ 22 декабря 2009

http://www.php.net/manual/en/pdo.prepare.php Там комментатор говорит, что он не работает должным образом для ключевых слов, имен таблиц, имен представлений и имен полей Так что вам нужно $prepared = $dbh->prepare('SELECT * from ' . $table);

Поскольку это действительно работает только для переменных столбцов.

0 голосов
/ 22 декабря 2009

Вы не можете связать таблицу в подготовленном операторе MySQL, вы можете только связать значения. С инструкция :

Однако они не разрешены для идентификаторов (таких как имена таблиц или столбцов), или указать оба операнда бинарного оператора, такого как знак равенства = *. 1006 *

...