Как сделать множественный 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 из прошлого века. Оно, во-первых, не нужно, а во-вторых, в современных версиях РНР всё равно не будет работать

→ Ссылка