PHP Вставить массив в базу данных MySQL получить данные из флажка

#php #mysql #arrays

Вопрос:

Ввод HTML

 <input type="checkbox" value="1" name="que[10][1]">
<input type="checkbox" value="2" name="que[10][2]">
<input type="checkbox" value="3" name="que[10][3]">
...
<input type="checkbox" value="40" name="que[10][40]">
 

PHP отправить

 $submit = $_POST["que"];
 

У меня есть следующий массив, который я хочу сохранить в своей базе данных :

 Array
(
    [10] => Array
        (
            [0] => 26
            [1] => 27
            [2] => 28
            [3] => 29
            [4] => 30
            [5] => 31
        )

)
 

Как я могу преобразовать в вывод инструкции insert, как показано ниже :

 INSERT INTO `tb_answers` (`question_id`, `answer`) VALUES(10,26),(10,27),(10,28),(10,29),(10,30);
 

Вот мой код :

 $submit = $_POST['que'];

$all_values = [];

$sql_submit_form = "INSERT INTO `tb_answers` (`question_id`, `answer`) VALUES";

foreach ($submit as $question_id => $choise) {
   
    $row_values = [];
    foreach ($choise as $choise_data => $s_value) { 
        $row_values[] = "'" . $question_id . "'"; // question_id
        $row_values[] = "'" . $s_value . "'"; // answer

    }
    $all_values[] = '(' . implode(',', $row_values) . ')';
}
$sql_submit_form .= implode(',', $all_values);

echo $sql_submit_form;
 

Выход :

 INSERT INTO `tb_answers` (`question_id`, `answer`) VALUES('10','27','10','28','10','29','10','30','10','31','10','32')
 

Комментарии:

1. Что вы пробовали до сих пор? Где ты застрял?

2. Какой у вас вопрос по поводу данного кода? Похоже, вы неправильно строите запрос. Кроме того, имейте в виду, что данный способ построения запроса широко открыт для SQL-инъекций

Ответ №1:

Вам нужно только очистить то, что у вас уже есть. Также нет необходимости вводить необработанные данные в ваш SQL-код, что только усложняет обслуживание кода (помимо небезопасности).:

 $params = $clauses = [];
foreach ($submit as $question_id => $choices) {
    foreach ($choices as $choice_id) {
        $clauses[] = '(?, ?)';
        $params[] = $question_id;
        $params[] = $choice_id;
    }
}
$sql = 'INSERT INTO `tb_answers` (`question_id`, `answer`) VALUES ' . implode(', ', $clauses);
 

Затем перейдите $params к подготовленному заявлению, и все будет готово.

Комментарии:

1. Огромное спасибо. Я попробовал этот код, вот вывод : $sql=ВСТАВИТЬ В tb_answers ( question_id , answer ) ЗНАЧЕНИЯ (10, 29), (10, 30), (10, 31)

Ответ №2:

Как уже упоминалось, вы неправильно строите свой SQL — запрос. SQL-инъекция-это вещь, вам нужно использовать заполнители»?», если вы планируете использовать это в производственных средах. Ваш желаемый результат может быть сгенерирован таким образом:

 $row_values = [];
foreach ($submit as $question_id => $choise) {
    foreach ($choise as $choise_data => $s_value) {
        $row_values[] = "(". $question_id .",".$s_value . ")";
    }
}
$sql_submit_form .= implode(',', $row_values);