当前位置: 首页 > 知识库问答 >
问题:

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

柴英锐
2023-03-14

我在数据库搜索中尝试进行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服务器版本对应的手册,了解在C:\xampp\htdocs\aDatabase2\class.user.php:312堆栈跟踪:#0 C:\xampp\htdocs\aDatabase2\class.user.php(312):PDO语句中第1行“5”偏移量0”附近使用的正确语法-

共有2个答案

江航
2023-03-14

像这样修复了它,在@Inurosen comment的帮助下,将“''”从$limit(每页)中去掉。

另外,添加了$stmt-

像这样完美地工作(据我所知):

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

马朝斑
2023-03-14

事实上,我永远无法通过PDO绑定“limit”语句来传递它们。您可以通过在查询上进行关联来传递它们,如:

$sql1 = "SELECT * FROM item WHERE itemname LIKE ? OR description LIKE ? LIMIT $limit OFFSET $start";

[编辑]完成后,我忘了说您必须删除带有“绑定”的行

    $stmt->bindValue($index + 1, $limit, PDO::PARAM_INT);
    $stmt->bindValue($index + 2, $start, PDO::PARAM_INT);
 类似资料:
  • 问题内容: 我正在尝试提供一种搜索功能,该功能将搜索多列以查找基于关键字的匹配项。该查询: 仅适用于搜索一列,我注意到用逗号分隔列名称会导致错误。那么可以在mysql中搜索多个列吗? 问题答案: 您可以使用AND或OR运算符,具体取决于要返回的搜索内容。 这两个子句必须匹配才能返回记录。或者: 如果任一子句匹配,则将返回记录。 有关使用MySQL SELECT查询可以执行的操作的更多信息,请尝试使

  • 问题内容: 我正在使用Spring Data进行分页和排序。但是,我想执行多列搜索。 现在,我在存储库界面中使用注释 @Query ,如下所示: 编辑: 此解决方案中的问题在于@Query注释的where子句,因为我们必须对要搜索的每一列重复完全相同的searchtext参数 (在Brandon Oakley的评论后澄清问题) 我想知道是否还有另一种方法,因为表中的列数可能很高。 谢谢你的帮助。

  • 我正在使用Spring数据进行分页和排序。但是,我想执行多列搜索。 现在,我在我的存储库接口中使用注释@Query,如下所示: 我想知道是否有另一种方法可以做到,因为表中的列数可能很高。 谢谢你的帮助。 edit(在Brandon Oakley的评论之后澄清问题):这个解决方案的问题在于@Query注释的where子句,因为我们必须为我们想要搜索的每一列重复完全相同的searchtext参数

  • 我有大量相同类型的实体,每个实体都有大量属性,并且我只有以下两种选择来存储它们: 将每个项存储在索引中并执行多索引搜索 将所有enties存储在单个索引中,并且只搜索1个索引。 一般而言,我想要一个时间复杂度之间的比较搜索“N”实体与“M”特征在上述每一种情况!

  • 将此添加到我的后,它在键入时会出现滞后。我猜问题是在列表中搜索(列表中有40到60个项目)。 我能做什么?

  • 问题内容: 我需要创建电话簿之类的东西。它包含名称和号码。现在,当我键入字母时,应该返回匹配列表。对于下面给出的示例,当我键入H时,应返回包含Harmer,Harris,Hawken,Hosler的列表。当输入Ha时,仅返回Harmer,Harris,Hawken的列表。 知道如何实现吗?提前致谢。 问题答案: 是的,为此,HashMap不是正确的数据结构。正如博佐所说,特里(Trie)是正确的选