2010-04-24 51 views
1
<?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);PHP PDO bindValue()不工作

和具体参数是第二个。

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

为什么不能正常工作?

编辑:

有趣的......如果我更换$_GET['index'] with (int)$_GET['index']它的工作原理。

回答

4

如果基检查$ 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 
0

听起来像$ _GET ['index']是不是你所期望的。使用var_dump()来检查更接近的值。请注意var_dump报告的字符串的长度,因为某些字符不可视,但字符串的长度会告诉隐藏的故事。

+0

page.php?index = 10给出字符串(2)“10”。 – TheMagician 2010-04-24 19:18:03

1

$_GET super-global数组中的值是字符串:PHP不会猜测查询字符串中传入的内容。


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

为了做到这一点,你可以使用:

  • 一个typecast(int)$_GET['yourval']
  • intval()功能,它允许一个特定的,这是可以使用
+1

$ _GET超全局数组中的值也可以是数组。 http://php.net/manual/faq.html.php#faq.html.arrays – erisco 2010-04-24 20:29:53