从PHP数组编写PDO搜索查询

时间:2016-11-10 11:01:41

标签: php mysql arrays pdo

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

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

表单上的元素类型是:

  1. 课程类别 - 下拉列表,带有数字(int)ID。
  2. 课程名称 - 文字输入
  3. 日期 - 日期选择器(使用HTML 5 type="date"参数在浏览器中获取日历)。
  4. 这些字段可以单独使用,也可以单独使用。这意味着用户可以仅搜索(1),或(2& 3)或全部(1& 2& 3)。

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

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

    我想在PDO查询中使用它,但我不知道写它的最佳方法是因为(1)和(3)是=查询条件,而(2)是一个LIKE。我的解决方案是循环搜索术语,然后尝试构建一个查询,例如

    $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多维来说明它是哪种类型的查询,但这超出了我的初始问题,可能是另一个帖子。

1 个答案:

答案 0 :(得分:3)

这是解决问题的简单方法:

$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数组来保存绑定数据。