MySQL каждый раз ВСТАВЛЯЕТ, когда у меня есть массив из флажков.

#php #mysql #insert

#php #mysql #вставить

Вопрос:

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

 <input name="my_array[]" value="<?php echo $data['ID'] ?>" type="checkbox">
<?php echo $data['name'] ?><?php echo "br/>";
  

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

    $strFoo=$_POST['my_array'];

    $strBar = "";


    foreach ($strFoo as $strFooName) {

    $strBar .= $strFooName . ", ";
    }
    $strBar = substr($strBar, 0, -2);
  

Повторяя, я получаю свой список идентификаторов, выбранных следующим образом 1, 2, 3, 4

Мой приведенный ниже foreach, к сожалению, вставляет только первый идентификатор массива..

 foreach ($strFoo as $strFooName) {

        $strSql="INSERT INTO table (ID) 
                 VALUES ('$strBar')";
    }
  

Как я могу вставить каждый идентификатор в свою таблицу?

Ответ №1:

Это должно быть:

 INSERT INTO table (ID) VALUES (1), (2), (3), (4)
  

итак, ваш этап обработки должен быть

 $values = array();
foreach ($strFoo as $strFooName) {
     $values[] = '(' . intval($strFooName) . ')';
}

$strBar = implode(',', $values);
  

Обратите внимание на добавление intval — это гарантирует, что в инструкцию SQL будут вставлены только допустимые числа. Ваша версия была уязвима для атак с использованием SQL-инъекций.

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

1. Каким был бы оператор INSERT с помощью (1), (2) и т.д.?

2. Это «расширенный» синтаксис вставки mysql. каждая (#) становится новой записью в таблице, в которую вы вставляете.

3. Я понимаю, что вы говорите, но разве это не будет вставлять только первые 4 выбранных INT?

4. Цикл должен генерировать (#) наборы для каждого флажка, выбранного в форме, поскольку он зацикливается на strFoo, и это просто копия $ _POST[‘my_array’]. Он будет вставлять столько флажков, сколько установлено. Однако, если флажки не установлены, он прервется.

Ответ №2:

$strSql="INSERT INTO table (ID) VALUES ('$strBar')";

должно быть

$strSql="INSERT INTO table (ID) VALUES ('$strFooName')";

Ответ №3:

Вы выполняете цикл в массиве с помощью $strFooName но вы вставляете $strBar , который обновляется только один раз выше.. Возможно, это проблема

Ответ №4:

Из 12.2.5. СИНТАКСИС ВСТАВКИ

Инструкции INSERT, использующие синтаксис VALUES, могут вставлять несколько строк. Для этого включите несколько списков значений столбцов, каждое из которых заключено в круглые скобки и разделено запятыми. Пример:

ВСТАВИТЬ В tbl_name (a, b, c) ЗНАЧЕНИЯ(1,2,3),(4,5,6),(7,8,9);

Тем не менее, это сказано. Похоже, вы пытаетесь просто выполнить цикл прямо через свой массив post с помощью этого фрагмента кода

 foreach ($strFoo as $strFooName) {
        $strSql="INSERT INTO table (ID) VALUES ('$strBar')";
}
  

$strBar в этом примере не был создан. Вы могли бы попробовать

 foreach ($strFoo as $strFooName) {
        $strSql="INSERT INTO table (ID) VALUES ('$strFooName')";
}
  

Хотя вам также следует подумать о предотвращении SQL-инъекции, если вы собираетесь это сделать.

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

1. Является ли код в вашем вопросе двумя разными попытками, или первый блок кода влияет на второй?

2. Не уверен, что вы под этим подразумеваете, я только что изменил вставляемую им переменную $.