1 回答
TA贡献1788条经验 获得超4个赞
这将是我已经在我的网站上教授的几种技术的有趣组合,即
动态创建 WHERE 子句
为 IN 子句创建准备好的语句
白名单以防止SQL 注入
最后会变成这样
$allowed = ["Firstname", "Lastname"];
$conditions = [];
$parameters = [];
foreach ($filter as $key => $values) {
if (array_search($key, $allowed, true) === false) {
throw new InvalidArgumentException("invalid field name!");
}
$conditions[] = "`$key` in (".str_repeat('?,', count($values) - 1) . '?'.")";
$parameters = array_merge($parameters, $values);
}
$sql = "SELECT * FROM table_name ";
if ($conditions)
{
$sql .= " WHERE ".implode(" AND ", $conditions);
}
将生成您正在寻找的查询,
SELECT * FROM table_name WHERE WHERE `Firstname` in (?,?) AND `Lastname` in (?)
以及要在 中使用的值数组PDO::execute(),制作防弹解决方案,其中值通过参数保护,文件名通过白名单过滤保护不受保护
我唯一的怀疑是问题中出现的案例可能过于简单化了。一旦您不仅需要精确匹配,还需要部分匹配或更大/更小的比较,代码的复杂性就会飙升。
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报