Как изменить мой PHP-цикл foreach SQL-Insert в цикл SQL с подготовленным оператором? - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть зацикленный запрос для вставки в базу данных 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 голосов
/ 21 февраля 2019

связывает параметры вне цикла 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'.

0 голосов
/ 21 февраля 2019
foreach ($vracehistory as $kay => $value) {
    $stmtrace->bind_param("sss", $inserted_id, $value, $results[$kay]);
    $stmtrace->execute();
}
0 голосов
/ 21 февраля 2019

Вы должны поместить execute () в цикл.

...