<?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循环。如果我用一个数字(例如10)替换$ _get ['索引'],则效果很好,它将返回10行。 echoing $ _get ['index']显示一个数字,因此它应该传递一个数字。我也尝试了bindparam,但结果是相同的。

为什么这不起作用?

编辑:

有趣...如果我更换 $_GET['index'] with (int)$_GET['index'] 有用。

有帮助吗?

解决方案

如果您检查$ stmt-> errorInfo(),您实际上会发现您的查询失败。

PDO :: param_int告诉PDO您正在给它一个整数。如果您不给PDO一个整数,则PDO会在SQL字符串中引用该值。

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

$ _GET中的所有值是数组或字符串。您可以通过将$ _get ['索引']胁迫到整数来完成正确的操作,然后再将其绑定为值。通过这样做,PDO获得了一个整数,期望来自PDO :: param_int的整数,因此不会在SQL字符串中引用该值。

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

其他提示

$_GET 超级全球阵列是字符串:PHP不猜测Querystring的内容。


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

为此,您可以使用:

  • 一种 typecast : (int)$_GET['yourval']
  • intval() 功能,允许一个人使用的基础

听起来像$ _get ['index']并不是您期望的。使用var_dump()仔细检查值。请注意var_dump报告的字符串的长度,因为某些字符在视觉上无法检测到,但是字符串的长度会讲述隐藏的故事。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top