PHP+;在多列中搜索时的PDO分页
我在数据库搜索中尝试进行php分页时遇到语法错误。 我做错了什么 功能:PHP+;在多列中搜索时的PDO分页,php,mysql,pdo,pagination,Php,Mysql,Pdo,Pagination,我在数据库搜索中尝试进行php分页时遇到语法错误。 我做错了什么 功能: public function searchItem1($search, $page) { $limit = '5'; $start = ($page * $limit)-5; echo $start; $where = array(); $words = preg_split('/[\s]+/', $search); ar
public function searchItem1($search, $page) {
$limit = '5';
$start = ($page * $limit)-5;
echo $start;
$where = array();
$words = preg_split('/[\s]+/', $search);
array_unshift($words, '');
unset($words[0]);
$sqlstring = implode(" OR ", array_fill(0, count($words), "itemname LIKE ?"));
$sql = "SELECT * FROM item WHERE $sqlstring LIMIT ? OFFSET ?";
echo $sql;
$stmt = $this->db->prepare($sql);
foreach ($words AS $index => $word) {
$stmt->bindValue($index, "%" . $word . "%", PDO::PARAM_STR);
}
$stmt->bindValue($index + 1, $limit, PDO::PARAM_INT);
$stmt->bindValue($index + 2, $start, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
错误:
public function searchItem1($search, $page) {
$limit = '5';
$start = ($page * $limit)-5;
echo $start;
$where = array();
$words = preg_split('/[\s]+/', $search);
array_unshift($words, '');
unset($words[0]);
$sqlstring = implode(" OR ", array_fill(0, count($words), "itemname LIKE ?"));
$sql = "SELECT * FROM item WHERE $sqlstring LIMIT ? OFFSET ?";
echo $sql;
$stmt = $this->db->prepare($sql);
foreach ($words AS $index => $word) {
$stmt->bindValue($index, "%" . $word . "%", PDO::PARAM_STR);
}
$stmt->bindValue($index + 1, $limit, PDO::PARAM_INT);
$stmt->bindValue($index + 2, $start, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
致命错误:未捕获的异常“PDOException”带有消息
'SQLSTATE[42000]:语法错误或访问冲突:1064您有
SQL语法错误;检查与您的产品相对应的手册
在“5”偏移量0附近使用的正确语法的MariaDB服务器版本
在C:\xampp\htdocs\aDatabase2\class.user.php:312堆栈的第1行
跟踪:#0 C:\xampp\htdocs\aDatabase2\class.user.php(312):
PDOStatement->execute()#1c:\xampp\htdocs\aDatabase2\test.php(59):
用户->抛出searchItem1('dois','1')#2{main}
第312行的C:\xampp\htdocs\aDatabase2\class.user.php
事实上,我永远无法通过PDO绑定“limit”语句来传递它们。您可以通过在查询上进行关联来传递它们,如:
$sql1 = "SELECT * FROM item WHERE itemname LIKE ? OR description LIKE ? LIMIT $limit OFFSET $start";
[编辑]
这样做之后,我忘了说您必须删除带有“bindings”的行
像这样修复了它,在@Inurosen comment的帮助下,将“''”从$limit(每页)中去掉 另外,添加了
$stmt->bindValue($index+1,“%”,$word.“%”,PDO::PARAM_STR)
这样我可以同时在两列中搜索每个单词(在标题和描述中)
工作完美(据我所知)如下:
public function searchItem1($search, $page) {
$limit = 5;
$start = ($page * $limit)-$limit;
$where = array();
$words = preg_split('/[\s]+/', $search);
array_unshift($words, '');
unset($words[0]);
$sqlstring = implode(" OR ", array_fill(0, count($words), "itemname LIKE ? OR description LIKE ?"));
$sql = "SELECT * FROM item WHERE $sqlstring LIMIT ? OFFSET ?";
$stmt = $this->db->prepare($sql);
foreach ($words AS $index => $word) {
$stmt->bindValue($index, "%" . $word . "%", PDO::PARAM_STR);
}
$stmt->bindValue($index + 1, "%" . $word . "%", PDO::PARAM_STR);
$stmt->bindValue($index + 2, $limit, PDO::PARAM_INT);
$stmt->bindValue($index + 3, $start, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
回显
$sql
和$sql1
并将结果粘贴到问题中代码>第2行限制可以是0,5,这不会给我一个“混合命名和位置参数”致命错误吗?好吧,在通过串联放置这些参数后,必须删除以下行:$stmt->bindValue($index+1,$limit,PDO::PARAM_INT)$stmt->bindValue($index+2,$start,PDO::PARAM_INT);我仍然会在一个查询中混合命名参数和位置参数