如何为 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));