【问题标题】:Writing a PDO search query from a PHP array从 PHP 数组编写 PDO 搜索查询
【发布时间】:2017-03-24 09:15:36
【问题描述】:

我正在使用 PHP 7 和一个到 MySQL 数据库的 PDO 连接构建一个应用程序。

应用程序的一部分包含一个搜索表单,允许用户通过 3 个不同的字段搜索培训课程:课程类别、课程名称和日期。

表单上的元素类型有:

  1. 课程类别 - 下拉列表,带有数字 (int) ID。
  2. 课程名称 - 文本输入
  3. 日期 - 日期选择器(使用 HTML 5 type="date" 参数在浏览器中获取日历)。

这些字段可以结合使用,也可以单独使用。这意味着用户可以搜索,例如,仅按 (1)、或 (2 & 3) 或全部 (1 & 2 & 3)。

我已经编写了 PHP 来获取 POST 数据,它现在在一个数组中 - 例如:

$search_data = [
    'category' => 3,
    'name' => 'Hazard training',
    'date' => ''
]

我想在 PDO 查询中使用它,但我不知道编写它的最佳方式是什么,因为 (1) 和 (3) 将是 = 查询条件,而 (2) 是 @ 987654324@。我的解决方案是遍历搜索词,然后尝试构建查询,例如

$sql = ' WHERE ';
foreach ($search_data as $key => $value) {
    if ($key == 'category') {
        $sql .= ' category = ' . $value;
    }
    if ($key == 'course_name') {
        $sql .= ' course_name LIKE % ' . $value ' % ';
    }
    if ($key == 'date') {
        $sql .= ' date = ' . $value;
    }
}

这样做的问题是它不起作用,因为必须在 PDO 中绑定参数。它也不起作用,因为我找不到在每个查询之间获取AND 的方法(如果有前面的语句)。

我现在迷失了,不确定写这个的最佳方式是什么。

任何帮助将不胜感激。

编辑:我意识到硬编码名称,例如($key == 'course_name') 并不理想,但这只是因为查询条件不同(LIKE=)。我假设可以使$search_data 多维来说明它是哪种类型的查询,但这超出了我最初的问题,可能是另一篇文章。

【问题讨论】:

    标签: php mysql arrays pdo


    【解决方案1】:

    这里有一个简单的解决方案:

    $sql = 'SELECT ..... FROM ... WHERE 1 ';
    $where = '';
    $pdoData = [];
    
    foreach ($search_data as $key => $value) {
        if(!$value) continue; // skip empty values
    
        if ($key === 'category') {
            $pdoData[':category'] = $value;
            $where .= ' AND category = :category ';
        }
        if ($key === 'course_name') {
            $pdoData[':course_name'] = '%'.$value.'%';
            $where .= ' AND course_name LIKE (:course_name) ';
        }
        if ($key === 'date') {
            $pdoData[':date'] = $value;
            $where .= ' AND date = :date ';
        }
    }
    
    $sql = $sql.$where;
    
    $stmt = $this->ci->db->prepare($sql);
    $stmt->execute($pdoData);
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    

    你有 $pdoDate 数组保存绑定的数据。

    【讨论】:

    • 我喜欢WHERE 1,让构建更容易。
    • 我会将course_name 部分更改为:$pdoData[':course_name'] = '%' . $value . '%'; 我认为LIKE % :course_name % 不会按预期工作...
    • 使用不为空 if ($key === 'category' && !empty($value))
    • 我几乎没有改进
    • 您还需要转义输入中的任何%,否则,这将改变搜索(您将无法搜索该字符,而是得到一个奇怪的搜索结果,因为任何额外的% 都将被计入搜索模式)。
    猜你喜欢
    • 2014-11-07
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多