如何将我的PHP foreach循环SQL插入更改为准备语句SQL循环?

时间:2019-02-21 09:15:02

标签: php mysqli foreach prepared-statement sql-insert

我有一个循环查询来插入到MySQL数据库中,它完美地完成了我需要做的事情,因为它将所有用户输入都放入数组中,然后将它们循环并分别输入到数据库中自己的行中

$sql_insert_race_history = "INSERT INTO inf_race_history 
                                    (`inf_id`,`race_history`, `results`) 
                            VALUES ";

if ($vracehistory != '') {
    foreach ($vracehistory as $kay => $value) {
        // $sql .= '' | $sql = $sql . '';
        $sql_insert_race_history .= "('$inserted_id','{$value}','{$results[$kay]}'),";
    }
} else {
    $vracehistory = '';
}
// remove last `,` into query;
$sql_insert_race_history = rtrim($sql_insert_race_history, ',');
$countRow = count($_POST['racehist']);
//INSERT INTO THE DATABASE VIA QUERY
$results_racehistory = mysqli_query($vconn, $sql_insert_race_history);

此代码可以正常工作并根据需要插入所有内容,但是有人告诉我它很容易受到SQL注入攻击的侵害,因此我一直在尝试通过使用准备好的语句来防止这种情况,直到目前为止,我尝试的每个版本都循环不起作用并且只会上传数组中的最后一项

$stmtrace = $conn->prepare("INSERT INTO inf_race_history 
                                   (`inf_id`,`race_history`, `results`) 
                            VALUES (?,?,?)");
if ($vracehistory != '') {
    foreach ($vracehistory as $kay => $value) {
        $stmtrace->bind_param("sss", $inserted_id,$value,$results[$kay]);
    }
} else {
    $vracehistory = '';
}
// remove last `,` into query;
$sql_insert_race_history = rtrim($stmtrace, ',');
$countRow = count($_POST['racehist']);
//INSERT INTO THE DATABASE VIA QUERY
$stmtrace->execute();

我认为这可能与将其从foreach循环中的.=更改为->bind_param有关,因为这可能会剥夺循环的机会吗?我不太确定,我也将如何回声我尝试回声$stmtrace,它说method _tostring is not implemented

3 个答案:

答案 0 :(得分:3)

foreach ($vracehistory as $kay => $value) {
    $stmtrace->bind_param("sss", $inserted_id, $value, $results[$kay]);
    $stmtrace->execute();
}

答案 1 :(得分:0)

您应该将execute()放入循环内。

答案 2 :(得分:0)

在foreach循环外绑定参数,并在foreach循环内分配变量时分配并执行查询。例如

$stmtrace->bind_param("sss", $insertId, $insertValue, $insertKey);
foreach ($vracehistory as $kay => $value) {
    $insertId = inserted_id;
    $insertValue = $value;
    $insertKey = $kay;
    $stmtrace->execute();
}

另一个说明,如果您绑定整数,bind_param方法的值应为“ i”。