【问题标题】:PHP + PDO Pagination while Searching in multiple columns在多列中搜索时 PHP + PDO 分页
【发布时间】:2016-04-02 11:44:46
【问题描述】:

尝试在数据库搜索中进行 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' 附近使用正确的语法 在 C:\xampp\htdocs\aDatabase2\class.user.php:312 中的第 1 行 跟踪:#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} 抛出 C:\xampp\htdocs\aDatabase2\class.user.php 在第 312 行

【问题讨论】:

  • 回显$sql$sql1 并将结果粘贴到问题中。
  • 在第 2 行尝试$limit = 5;
  • 限制可以是0,5

标签: php mysql pdo pagination


【解决方案1】:

实际上,我永远无法通过 PDO 绑定“限制”语句来传递它们。您可以通过连接查询来传递它们,例如:

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

【讨论】:

  • 这不会给我一个“混合命名和位置参数”的致命错误吗?
  • 好吧,在你把这些参数串联起来之后,你必须删除以下几行: $stmt->bindValue($index + 1, $limit, PDO::PARAM_INT); $stmt->bindValue($index + 2, $start, PDO::PARAM_INT);
  • 我仍然会在一个查询中混合命名参数和位置参数
【解决方案2】:

像这样修复它,在@Inurosen 评论的帮助下,将“''”从 $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);

【讨论】:

  • /[\s]+ = /\s+/
猜你喜欢
  • 2019-06-30
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2017-10-25
  • 2013-07-25
相关资源
最近更新 更多