如何为 RedBeanPHP 4 动态构建参数化查询?
How can I dynamically build a parameterized query for RedBeanPHP 4?
所以我有一些数据通过 POST 从一个带有大量复选框的表单中传入,我试图在数据库中查找与选中的选项相匹配的记录。有四组复选框,每组都作为数组发送。每组复选框代表数据库中的一列,复选框中的值存储为逗号分隔的字符串。我正在搜索的值不一定是连续的,而不是单个 LIKE %value% 我认为我必须将其分解为一系列用 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 注入安全吗?
谢谢!
只要您使用参数化查询(就像您一样),就应该不会受到 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));
所以我有一些数据通过 POST 从一个带有大量复选框的表单中传入,我试图在数据库中查找与选中的选项相匹配的记录。有四组复选框,每组都作为数组发送。每组复选框代表数据库中的一列,复选框中的值存储为逗号分隔的字符串。我正在搜索的值不一定是连续的,而不是单个 LIKE %value% 我认为我必须将其分解为一系列用 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 注入安全吗? 谢谢!
只要您使用参数化查询(就像您一样),就应该不会受到 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));