написать запрос на добавление массива в бд одним запросом
Мне нужно правильно написать запрос на добавление массива из инпутов одним запросом. В текущем запросе ошибка.
<?php
require_once '../vendor/connect.php';
for ($i = 0; $i < count($name); ++$i) {
$name = $name[$i];
$price = $price[$i];
$quantity = $quantity[$i];
$q = "INSERT INTO `zakaz` (`name`, `price`, `quantity`) VALUES ('$name', '$price', '$quantity')";
var_dump($_POST);
mysqli_query($connect, $q);
}
?>
<input type="hidden" name="name[]" value="${name}">
<input class="js-cart-input-quantity" type="hidden" name="quantity[]" value="${quantity}">
<input class="js-cart-input-price" type="hidden" name="price[]" value="${price * quantity}">
CREATE TABLE `zakaz` (
`name` varchar(255) DEFAULT NULL,
`price` varchar(255) DEFAULT NULL,
`quantity` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
COMMIT;
Ответы (1 шт):
Работать всегда лучше с подготовленными данными. Если технические ограничения не позволяют получить данные в удобном виде, то лучше пересобрать их до того как начинать манипуляции с ними.
Сейчас у вас есть три массива $names, $prices, $quantities, но нужен один $orders ($zakazes, если так удобнее :-).
$orders = array_map(
fn($name, $price, $quantity) => ['name' => $name, 'price' => $price, 'quantity' => $quantity],
$names,
$prices,
$quantities
);
var_dump($orders); // посмотрите что получилось
Теперь можно заняться запросом в бд. Insert может принимать несколько пачек значений и вставлять несколько строк. Сперва надо написать общую часть запроса.
$sql = 'insert into `zakaz` (`name`, `price`, `quantity`) values ';
Остаётся только для каждого $order из $orders добавить к запросу ($order['name'], $order['price'], $order['quantity']). Это просто. Но прежде чем написать код, вам стоит узнать про SQL-инъекции. Чтообы предотвратить инъекции, вы можете использовать экранирование с помощью mysqli_real_escape_string (обратите внимание на предостережение насчёт кодировки) или подготовленные запросы. Второй вариант сложнее, я не буду разбирать его тут, но обязательно изучите эту тему самостоятельно.
$sqlValues = [];
foreach ($orders as $order) {
$sqlValues[] = '('
. implode(', ', array_map(fn($val) => "'" . mysqli_real_escape_string($connect, $val) . "'", $order))
. ')';
}
$sql .= implode(', ', $sqlValues);
var_dump($sql); // посмотрите что получилось
Теперь можно выполнить получившийся запрос.
Этот пример только демонстрирует общую идею. Не копируйте его в свой код. Он должен быть отправной точкой для ваших самостоятельных изысканий. Например, тут я не валидирую входящие данные, рассматриваю цену и количество как строки, не обрабатываю возможные ошибки.