我有一个循环的查询要做,插入到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注入攻击,所以我一直试图通过使用准备好的语句来防止这种情况--我尝试的每个版本都是循环attacks,它只上传数组中的最后一项。
$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();我认为这可能与将它从前端循环中的.=更改为->bind_param有关,因为这可能会剥夺循环它的机会吗?我不太确定,也不知道我该如何回应,我试着回音$stmtrace,method _tostring is not implemented说
发布于 2019-02-21 09:34:41
foreach ($vracehistory as $kay => $value) {
$stmtrace->bind_param("sss", $inserted_id, $value, $results[$kay]);
$stmtrace->execute();
}发布于 2019-02-21 09:22:55
应该将execute()放在循环中。
发布于 2019-02-21 09:28:04
将params绑定到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‘。
https://stackoverflow.com/questions/54803271
复制相似问题