我使用纯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);
,它也会有效
答案 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);