我正在用纯PHP+PDO-Mysql驱动程序构建CRUD。
我有一个页面列出了DB表中包含的数据,我想实现一些过滤器,但我一直坚持用动态查询将参数绑定到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服务器版本对应的手册,了解在第64行中C:''examplep''htdocs''celldb''manage.php的第1行"20"OFFSET"0"附近使用的正确语法
如果我在PhpMyadmin上模拟查询,它运行良好,如果我删除if(!empty($_GET["op"])
的情况并使用$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
传递$limit
和$offset
,它也运行良好
如果仔细查看错误消息,它会给出答案:
靠近"20"偏移"0"
这两个参数都是字符串,其中需要整数。正如PDOState::execute的文档所解释的那样:
所有值都被视为PDO::PARAM_STR。
这就是为什么您必须用显式地将它们定义为整数
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);