我在尝试在数据库搜索中进行php分页时遇到语法错误。 我做错了什么?
功能:
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语法错误;查看与您的手册相对应的手册 MariaDB服务器版本,用于在'' 5'附近使用正确的语法OFFSET 0' 在第1行'在C:\ xampp \ htdocs \ aDatabase2 \ class.user.php中:312 Stack trace:#0 C:\ xampp \ htdocs \ aDatabase2 \ class.user.php(312): PDOStatement-> execute()#1 C:\ xampp \ htdocs \ aDatabase2 \ test.php(59): USER-> searchItem1(' dois',' 1')#2 {main}引入 第312行的C:\ xampp \ htdocs \ aDatabase2 \ class.user.php
答案 0 :(得分:1)
实际上,我永远无法通过"限制"通过PDO绑定它们的语句。您可以通过查询来传递它们,如:
$sql1 = "SELECT * FROM item WHERE itemname LIKE ? OR description LIKE ? LIMIT $limit OFFSET $start";
[编辑] 在这样做之后,我忘了说你必须删除带有"绑定的行#34;
$stmt->bindValue($index + 1, $limit, PDO::PARAM_INT);
$stmt->bindValue($index + 2, $start, PDO::PARAM_INT);
答案 1 :(得分:1)
修正了这个问题,在@Inurosen评论的帮助下,采取了" ' ' "超出$ limit(perpage)。
另外,添加了$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);