1

我一直在做很多查询,但突然发现一个它不起作用。这是我的代码:

$q = 'SELECT title FROM blog LIMIT :paging,:perpage';
$v = array(
    ':paging'=>(($page-1)*$perpage),
    ':perpage'=>$perpage
);
$sql = $conn->prepare($q);
$sql->execute($v);
if ($sql){
    foreach($sql as $rs){
        $title = $rs['title'];
        echo '<article>'.$title.'</article>';
    };
};

我没有收到任何错误,但是它也没有显示任何内容。当我取出 $v 并将值放入查询中时,如下所示:

$q = 'SELECT title FROM blog LIMIT '.(($page-1)*$perpage).','.$perpage.' ';

这完美地工作并输出字段。

我过去对许多其他查询都做过同样的数组技巧,从来没有遇到过任何问题。不知道我在这里做错了什么,需要一双新的眼睛。

还有 $page = 1 和 $perpage = 2

4

3 回答 3

4

这是因为当您使用数组执行时,它默认为PDO::PARAM_STR,所以它认为它是一个字符串......这显然不能很好地与LIMIT

而是使用bindValue, 这样您就可以明确声明PDO::PARAM_INT

 $q = 'SELECT title FROM blog LIMIT :paging,:perpage';
 $sql = $conn->prepare($q);

 $sql->bindValue(':paging',(($page-1)*$perpage), PDO::PARAM_INT);
 $sql->bindValue(':perpage',$perpage, PDO::PARAM_INT);
 $sql->execute();
于 2013-06-26T22:26:44.843 回答
3

您需要使用 bindValues 将值绑定到使用不带参数执行的查询!

http://php.net/manual/en/pdostatement.bindvalue.php

于 2013-06-26T22:26:10.233 回答
-1

您没有收到任何 PHP 错误,但您根本没有检查 SQL 错误。您需要显式检查 SQL 错误。

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
} 
于 2013-06-26T22:26:57.170 回答