所以我从一个带有大量复选框的表单中通过POST进入了一些数据,我试图在数据库中查找与选中的选项相匹配的记录。有四组复选框,每组都作为数组发送。每组复选框表示数据库中的单个列,复选框中的值存储为逗号分隔的字符串。我搜索的值不一定是连续的,而不是单个LIKE%值%我认为我必须将其分解为与AND连接的一系列LIKE语句。这就是我所拥有的:
$query = "";
$i = 1;
$vals = [];
foreach($_POST["category"] as $val){
$query .= "category LIKE :cat".$i." AND ";
$vals[":cat".$i] = "%".$val."%";
$i++;
}
$i = 1;
foreach($_POST["player"] as $val){
$query .= "player LIKE :plyr".$i." AND ";
$vals[":plyr".$i] = "%".$val."%";
$i++;
}
$i = 1;
foreach($_POST["instrument"] as $val){
$query .= "instrument LIKE :inst".$i." AND ";
$vals[":inst".$i] = "%".$val."%";
$i++;
}
$i = 1;
foreach($_POST["material"] as $val){
$query .= "material LIKE :mat".$i." AND ";
$vals[":mat".$i] = "%".$val."%";
$i++;
}
$query = rtrim($query, " AND ");
$tubas = R::convertToBeans("tuba", R::getAll("SELECT * FROM tuba WHERE ".$query, $vals));
这似乎在我的初步测试中起作用,但它是最好的方法吗? SQL注入是否安全? 谢谢!
答案 0 :(得分:1)
只要您使用参数化查询(就像您一样),您就可以安全地进行SQL注入。但是有一些优势,使用UTF-7 PDO很容易受到攻击(我认为redbean基于PDO)
我会将代码更改为类似的东西,最大限度地减少foreach的混乱。
$query = 'SELECT * FROM tuba';
$where = [];
$params = [];
$checkboxes = [
'category',
'player',
'instrument',
'material'
];
foreach ($checkboxes as $checkbox) {
if (!isset($_POST[$checkbox])) {
// no checkboxes of this type submitted, move on
continue;
}
foreach ($_POST[$checkbox] as $val) {
$where[] = $checkbox . ' LIKE ?';
$params[] = '%' . $val . '%';
}
}
$query .= ' WHERE ' . implode($where, ' AND ');
$tubas = R::convertToBeans('tuba', R::getAll($query, $params));