【问题标题】:PHP PDO bindValue() don't workPHP PDO bindValue() 不起作用
【发布时间】:2011-02-11 22:19:29
【问题描述】:
<?php
try
{
    $db = new PDO("mysql:host=localhost;dbname=DBNAME", "USER", "PASSWD");

    $stmt = $db->prepare("SELECT id, name FROM testdb ORDER BY time DESC LIMIT :index, 10");
    $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
    $stmt->execute();

    while( $r = $stmt->fetch(PDO::FETCH_ASSOC) )
    {
        echo var_dump($r);                                      
    }

}
catch( PDOException $e )
{
    die("Exception");
}

问题出在这一行:$stmt-&gt;bindValue(":index", $_GET['index'], PDO::PARAM_INT);

而具体参数是第二个。

上面的代码不起作用,它不返回任何内容,因此不会执行 while 循环。如果我将 $_GET['index'] 替换为一个数字,比如 10,它就可以正常工作,它返回 10 行。回显 $_GET['index'] 会显示一个数字,因此它应该传递一个数字。我也试过bindParam,但结果是一样的。

为什么这不起作用?

编辑:

有趣...如果我替换 $_GET['index'] with (int)$_GET['index'] 它可以工作。

【问题讨论】:

    标签: php pdo bindvalue


    【解决方案1】:

    如果你检查 $stmt->errorInfo() 你会发现你的查询失败了。

    PDO::PARAM_INT 告诉 PDO 你给它一个整数。如果不给 PDO 一个整数,PDO 将引用 sql 字符串中的值。

    SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10
    

    $_GET 中的所有值都是数组或字符串。通过将 $_GET['index'] 强制为整数,然后将其绑定为值,您做了正确的事情。通过这样做,PDO 得到一个整数,期望 PDO::PARAM_INT 得到一个整数,因此不会引用 sql 字符串中的值。

    SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10
    

    【讨论】:

      【解决方案2】:

      $_GET 超级全局数组中的值是字符串:PHP 不会猜测查询字符串中传递了什么。


      如果您希望 $_GET 中的一个值被视为一个整数 - 这就是您想要的,在这里 - 您需要自己将其转换为整数。

      为此,您可以使用:

      • typecast : (int)$_GET['yourval']
      • intval() 函数,允许指定要使用的碱基

      【讨论】:

      【解决方案3】:

      听起来像 $_GET['index'] 不是你所期望的那样。使用 var_dump() 更仔细地检查值。注意 var_dump 报告的字符串长度,因为有些字符是肉眼无法察觉的,但字符串的长度会告诉隐藏的故事。

      【讨论】:

      • page.php?index=10 给出字符串(2)“10”。
      猜你喜欢
      • 2013-01-03
      • 2016-01-28
      • 1970-01-01
      • 2015-06-10
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      相关资源
      最近更新 更多