带有预准备语句的 PDO bindParam() 不起作用

2022-08-30 19:53:30

好的,这就是问题所在:

这有效:

$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(new foobar())

从函数返回的引用

尝试使用 bindValue()

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

答案 2

PHP 将 PHP 变量绑定到用于准备语句的 SQL 语句中相应的命名占位符或问号占位符。bindParam()

正确的使用方法是: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
                          // ^ PDO::PARAM_INT - the value of the variable $id should be an int
                     // ^ $id - the variable being represented by ':id',
              // ^ :id - represents the variable
              // $id - the variable being represented by ':id',

PHP 将值绑定到用于准备语句的 SQL 语句中相应的命名占位符或问号占位符。bindValue()

$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()


推荐