PDO参数绑定的问题

时间:2016-04-13 15:12:12

标签: php mysql pdo

我使用纯PHP + PDO Mysql驱动程序构建CRUD。

我有一个页面列出了数据库表格中包含的数据,我想实现一些过滤器,但我仍然坚持用动态查询将参数绑定到PDO。

例如,使用和不使用$_GET["op"]时,此代码可以正常工作。

$params = [];
$pag_query = "SELECT COUNT(*) FROM cells WHERE 1 ";

if(!empty($_GET["op"])){
    $pag_query .= "AND op=:op ";
    $params["op"] = $_GET["op"];
}

$stmt = db()->prepare($pag_query);
$stmt->execute($params);

$n_rows = $stmt->fetchColumn();

但是我无法使这个查询起作用。

<?php

//some logic here to get $limit and $offset

$params["limit"] = $limit;
$params["offset"] = $offset;
$tbl_query = "SELECT * FROM cells WHERE 1 ";

if(!empty($_GET["op"])){
    $tbl_query .= "AND op=:op ";
    $params["op"] = $_GET["op"];
}

$tbl_query .= "ORDER BY cid LIMIT :limit OFFSET :offset";

//Prepare the query
$stmt = db()->prepare($tbl_query);
$stmt->execute($params);

$table = $stmt->fetchAll();

它给了我这个错误信息。

  

警告:PDOStatement :: execute():SQLSTATE [42000]:语法错误或访问冲突:1064您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以获得在&#39;&#39; 20&#39;附近使用的正确语法。 OFFSET&#39; 0&#39;&#39;在第64行的C:\ xampp \ htdocs \ celldb \ manage.php第1行

如果我在PhpMyadmin上模拟查询,则效果很好,如果我删除if(!empty($_GET["op"])案例并使用$limit

传递$offset$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);,它也会有效

1 个答案:

答案 0 :(得分:2)

如果仔细查看错误消息,它会给出答案:

  <'>'20'OFFSET'0''附近

参数都是字符串,其中需要整数。正如documentation for PDOStatement::execute所解释的那样:

  

所有值都被视为PDO :: PARAM_STR。

这就是为什么你必须明确地将它们定义为:

$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);