【发布时间】:2020-09-22 13:22:14
【问题描述】:
使用 PHP7+PDO+SQLite,我正在寻找一种方法来过滤表中的条目,该过滤器使用前端生成的数组形式的用户定义过滤器。为清楚起见,这是我正在寻找的示例:
示例:
数据库中的表:
ID Firstname Lastname Age
+--------------+--------------+--------------+-------------+
| 0 | John | Doe | 21 |
| 1 | John | Smith | 35 |
| 2 | Alice | Smith | 35 |
| 3 | Bob | Smith | 40 |
+--------------+--------------+--------------+-------------+
过滤器:
/*
Filters follow the structure:
[
"Table Column Name 1" => [Match1 OR Match2 OR ...],
AND
"TCN 2" ...
]
Any column name not provided should match any value.
*/
[
"Firstname" => ["John"]
]
// ^ fetchAll() returns rows with ID 0 and 1
[
"Firstname" => ["John", "Alice"],
"Lastname" => ["Smith"]
]
// ^ ID 1 and 2 (but not 3)
我需要找到一个可以将上面的数组转换为 SQL 查询的函数,以获取与过滤器匹配的所有行。出于性能原因,我想使用 SQL(我没有太多经验)而不是获取所有行并使用 PHP 过滤它们。
我知道我可以按照以下方式做一些事情:
// Untested - for illustration purposes only
$filter = [
"Firstname" => ["John", "Alice"],
"Lastname" => ["Smith"]
];
$sql = "SELECT * FROM table_name WHERE ";
foreach ($filter as $column => $matching_values) {
foreach ($matching_values as $match) {
$sql .= $column . " == " . $match . " OR ";
}
// Ugly way of removing trailing ` OR `
$sql = substr($sql, 0, -4);
$sql .= " AND ";
}
// Ugly way of removing trailing ` AND `
$sql = substr($sql, 0, -5);
echo $sql;
但这会引入大量 SQL 注入安全漏洞。我想知道是否有一种简单而有效且安全的方法来实现这一目标。如果需要,还可以更改过滤器的格式,例如更改为 RegEx(如果有人可以将上面示例中最里面的数组替换为 RegEx,则可以加分)。
另外(或另外),以可搜索的方式描述我的问题的简单方法可能会有所帮助,因为我无法对此进行太多研究,因为我不能很好地用词。
【问题讨论】:
-
您在使用 PDO 和准备好的语句方面的功课如何?请在帖子中添加您尝试过的内容、使用 PDO 以及问题所在。至于你数组中的数据,这里没有高端功能,只是基本的数组操作。
-
您可能会发现使用
WHERE ... IN而不是为每列的可能值拼出一百个 OR 会很方便。如WHERE Firstname IN ('John', 'Alice')等sqlitetutorial.net/sqlite-in -
@MarkusAO 其实,这不是一个作业,而是一个项目。这是链接:github.com/TR-SLimey/wraith。专门针对 indev 分支。我相信你把我误认为是你的一个学生? :)