PHP+;在多列中搜索时的PDO分页

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

我在数据库搜索中尝试进行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);
错误:

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);我仍然会在一个查询中混合命名参数和位置参数