#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:
Инструкции 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. Не уверен, что вы под этим подразумеваете, я только что изменил вставляемую им переменную $.