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

时间:2015-12-28 15:58:42

标签: 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);

        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

2 个答案:

答案 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);