PDO bindParam()与预处理语句不起作用

时间:2013-11-11 08:42:37

标签: php mysql pdo

好的,这就是问题所在:

这有效:

$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";
    }

?>

5 个答案:

答案 0 :(得分:17)

使用bindParam()变量为bound as a reference

字符串can't be passed by reference

以下内容可以通过引用传递:

  

变量,即foo($ a)

     

新陈述,即foo(new foobar())

     

从函数返回的引用

尝试使用bindValue()

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

答案 1 :(得分:2)

:tabla参数的值将由PDO自动引用和转义。执行的查询将变为:

SELECT * FROM 'juegos'

这是无效的SQL。

答案 2 :(得分:2)

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's value
$sth->bindValue(':name', $name, PDO::PARAM_STR);// use bindValue to bind the variable's value

这两种方法的主要区别在于,与PDOStatement::bindValue()不同,bindParam()将变量绑定为引用,并且仅在调用PDOStatement::execute()时进行评估。 / p>

答案 3 :(得分:0)

不要将值直接传递给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";
    }

答案 4 :(得分:0)

对我来说,用单引号代替双引号可以解决此问题。

上一个 $ STH = $ DBH-> prepare(“ SELECT * FROM statstracker WHERE SrNo =:id”);

解决方案: $ STH = $ DBH-> prepare('SELECT * FROM statstracker WHERE SrNo =:id');

它可以工作,尽管不确定为什么。

希望有帮助!