PHP PDO bindValue()不起作用

时间:2010-04-24 18:04:01

标签: php pdo bindvalue

<?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->bindValue(":index", $_GET['index'], PDO::PARAM_INT);

具体参数是第二个。

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

为什么这不起作用?

编辑:

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

3 个答案:

答案 0 :(得分:4)

如果您检查$ stmt-&gt; 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

答案 1 :(得分:1)

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


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

为此,您可以使用:

  • typecast(int)$_GET['yourval']
  • intval()函数,允许用户特定要使用的基础

答案 2 :(得分:0)

听起来像$ _GET ['index']并不是你所期望的那样。使用var_dump()来更仔细地检查值。注意var_dump报告的字符串的长度,因为某些字符在视觉上是不可检测的,但字符串的长度将告诉隐藏的故事。