我有一个循环查询来插入到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
答案 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”。