从PHP数组编写PDO搜索查询
我正在使用PHP7和到MySQL数据库的PDO连接构建一个应用程序 应用程序的一部分包含一个搜索表单,允许用户通过3个不同的字段搜索培训课程:课程类别、课程名称和日期 表单上的元素类型为:从PHP数组编写PDO搜索查询,php,mysql,arrays,pdo,Php,Mysql,Arrays,Pdo,我正在使用PHP7和到MySQL数据库的PDO连接构建一个应用程序 应用程序的一部分包含一个搜索表单,允许用户通过3个不同的字段搜索培训课程:课程类别、课程名称和日期 表单上的元素类型为: 课程类别-下拉列表,带有数字(整数)ID 课程名称-文本输入 日期-日期选择器(使用HTML5type=“Date”参数在浏览器中获取日历) 这些字段可以结合使用,也可以单独使用。这意味着用户可以搜索,例如,仅通过(1)、或(2&3)或全部(1&2&3)进行搜索 我编写了PHP来获取POST数据,现在它位于一
type=“Date”
参数在浏览器中获取日历)$search_data = [
'category' => 3,
'name' => 'Hazard training',
'date' => ''
]
我想在PDO查询中使用它,但我不知道编写它的最佳方式是什么,因为(1)和(3)将是一个=
查询条件,而(2)是一个类似的。我的解决方案是循环搜索词,然后尝试构造一个查询,例如
$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中绑定参数。它也不起作用,因为我找不到一种方法来获取每个查询之间的和
(如果有前面的语句)
我现在很迷茫,不确定写这篇文章的最佳方式是什么
任何帮助都将不胜感激
编辑:我意识到对名称进行硬编码,例如,($key=='course\u name')
并不理想,但这只是因为不同的查询条件(如与=
)。我假设人们可以将$search\u data
多维化,以确定它是哪种类型的查询,但这超出了我最初的问题,可能也超出了另一篇文章的范围。这里有一个简单的解决方案:
$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
数组。这里有一个简单的解决方案:
$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
数组来保存绑定的数据。我喜欢其中的1
,这使得构造更容易。我会将课程名称部分更改为:$pdoData[':课程名称]='%$值“%”
我认为LIKE%:course_name%
不会按预期工作…如果($key==='category'&&&&!empty($value))我做了一些改进,您还需要在输入中转义任何%
,否则,这将更改搜索(您将无法搜索该字符,但会得到一个奇怪的搜索结果,因为任何额外的%
都将被视为搜索模式的一部分)。我喜欢中的1
,这使得构造更容易。我会将课程名称
部分更改为:$pdoData[':课程名称']='%'.$value.'%';
我不认为像%:course_name%
会像预期的那样工作…如果($key=='category'&&!empty($value)),请使用not empty如果($key==='category'&!empty($value)),我没有什么改进,您还需要在输入中转义任何%
,否则,这将改变搜索(您将无法搜索该字符,而是会得到一个奇怪的搜索结果,因为任何额外的%
都将被视为搜索模式的一部分)。