Как сделать множественный insert
Подскажите, как сделать множественный insert? Есть массив $userArrayIds = ['34','87','76'] массив большой.
Не ужели делать так
foreach( $userArrayIds as $uid ){
$sql = "INSERT INTO `message` (message,user_id)"."VALUES('Привет' , '$uid' );";
$query = mysqli_query($db,$sql) or die("Ошибка: " . mysqli_error($db));
}
Как то мне кажется что это не верный путь.
Ответы (1 шт):
Сначала надо подготовить массив, в котором будут все нужные для вставки данные. Каждая строка в нем должна представлять массив данных для одной строки в БД.
$array = [
['Привет', 22],
['Привет', 44],
['Привет', 55],
];
Остальное уже дело весьма несложной техники. Главное не забывать, что любые данные должны попадать в запрос только через подготовленные выражения.
Сначала готовим запрос вида INSERT INTO t (c1,c1,c3) VALUES (?,?,?),(?,?,?)..., в котором количество блоков (?,?,?) соответствует количеству строк в основном массиве, а количество знаков вопроса в одном блоке - количеству вставляемых в каждую строку значений. Это делается несложным кодом с помощью функции str_repeat().
$sql = "INSERT INTO `message` (message,user_id) VALUES ";
$chunk = "(?" . str_repeat(",?", count($array[0]) - 1) . ")"; // получаем (?,?)
$sql .= $chunk . str_repeat(",$chunk", count($array) - 1); // получаем (?,?),(?,?)...
После этого выполняем запрос, "схлопывая" исходный двумерный массив в одномерный. Выполнение будет зависеть от версии РНР. Начиная с 8.2 оно делается в одну строчку
$db->execute_query($sql, array_merge(...$array));
Если же версия более старая, то кода будет чуть больше
$stmt = $db->prepare($sql);
$types = str_repeat("s", count($array) * count($array[0]));
$stmt->bind_param($types, ...array_merge(...$array));
$stmt->execute();
Да, и важно забыть навсегда про все эти or die, "Ошибка: " и mysqli_error из прошлого века. Оно, во-первых, не нужно, а во-вторых, в современных версиях РНР всё равно не будет работать