如何为RedBeanPHP 4动态构建参数化查询?

时间:2015-02-27 21:56:25

标签: php redbean

所以我从一个带有大量复选框的表单中通过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注入是否安全? 谢谢!

1 个答案:

答案 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));