PDO bindParam() с подготовленным оператором не работает

Хорошо, это проблема:

Это работает:

$STH = $DBH->prepare("SELECT * FROM juegos WHERE id = 1");
$STH->execute();

Это не означает:

$STH = $DBH->prepare("SELECT * FROM juegos WHERE id = :id");
$STH->bindParam(':id', '1', PDO::PARAM_STR);
$STH->execute();

Что в мире я делаю неправильно? Это даже не исключение.

Спасибо всем!

Кроме того, это весь код

<?php
    try {
        $DBH = new PDO("everything is", "ok", "here");

        $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

        $STH = $DBH->prepare("SELECT * FROM juegos WHERE id = :id");
        $STH->bindParam(':id', '1', PDO::PARAM_STR);
        $STH->execute();

        $STH->setFetchMode(PDO::FETCH_ASSOC);

        while($row = $STH->fetch()) {
            echo $row['nombre']."<br/>";
        }

        $DBH = null;

        echo "Todo salió bien";

    } catch (PDOException $e) {
        echo "Error";
    }

?>

Ответ 1

Используя bindParam() переменная связывается как ссылка.

Строка не может быть передана по ссылке.

Следующие вещи могут быть переданы по ссылке:

Переменные, т.е. foo ($ a)

Новые операторы, т.е. foo (новый foobar())

Ссылки, возвращаемые из функций

Попробуйте использовать bindValue()

$STH->bindValue(':id', '1', PDO::PARAM_STR);

Ответ 2

Значение параметра :tabla будет автоматически процитировано и экранировано PDO. Выполненный запрос будет выглядеть следующим образом:

SELECT * FROM 'juegos'

который недействителен SQL.

Ответ 3

PHP BinParam() Привязывает переменную PHP к соответствующему заполнителю имени или вопроса в выражении SQL, который использовался для подготовки оператора.

Правильный способ использования bindParam:

$id = 1;
$sth = $DBH->prepare("SELECT * FROM juegos WHERE id = :id");
$sth->bindParam(':id', $id, PDO::PARAM_INT);// use bindParam to bind the variable

:id //represents the variable
$id //is the variable being represented by ':id',
PDO::PARAM_INT //states that the value of the variable $id should be a string

PHP BindValue() Привязывает значение соответствующему заполнителю имени или вопроса в выражении SQL, который использовался для подготовки оператора.

$id=10;
$name=roadkill;
$sth = $dbh->prepare('SELECT *
    FROM juegos
    WHERE id < :id AND name = :name');
$sth->bindValue(':id', $id, PDO::PARAM_INT);// use bindValue to bind the variable value
$sth->bindValue(':name', $name, PDO::PARAM_STR);// use bindValue to bind the variable value

Ключевое различие между этими двумя методами заключается в том, что в отличие от PDOStatement::bindValue(), при bindParam() переменная привязана как ссылка и будет оцениваться только во время вызова PDOStatement::execute().

Ответ 4

не передавать значение непосредственно BindParam.

try {
       // $DBH = new PDO("everything is", "ok", "here");
        $DBH = new PDO("mysql:host=localhost;dbname=test", 'root', '');
        $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        $STH = $DBH->prepare("SELECT * FROM statstracker WHERE SrNo = :id");
        $id = 1; // here you should keep it as variable and pass it to param
        $STH->bindParam(':id', $id, PDO::PARAM_STR);
        $STH->execute();

        $STH->setFetchMode(PDO::FETCH_ASSOC);

        while($row = $STH->fetch()) {
            echo $row['SrNo']."<br/>";
        }

        $DBH = null;

        echo "Todo salió bien";

    } catch (PDOException $e) {
        echo "Error";
    }

Ответ 5

Для меня замена двойной кавычки одинарной кавычкой устранила проблему.

Предыдущая $ STH = $DBH-> prepare ("ВЫБЕРИТЕ * ИЗ СТРАСТКРАТОРА, ГДЕ SrNo =: id");

Решение: $ STH = $DBH-> prepare ('SELECT * FROM statstracker WHERE SrNo =: id');

И это работает, хотя не уверен, почему.

Надеюсь, поможет!