我正在使用PHP 7和与MySQL数据库的PDO连接构建应用程序。
该应用程序的一部分包含一个搜索表单,允许用户通过3个不同的字段搜索培训课程:课程类别,课程名称和日期。
表单上的元素类型是:
type="date"
参数在浏览器中获取日历)。这些字段可以单独使用,也可以单独使用。这意味着用户可以仅搜索(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
多维来说明它是哪种类型的查询,但这超出了我的初始问题,可能是另一个帖子。
答案 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
数组来保存绑定数据。