@ukoHka
Всего понемногу

Как сконструировать запрос на вставку нескольких строк в mysqli statement?

Структура таблицы: id (ключевое), user_id, service_id, sdate, svalue
Для каждого user_id по каждому service_id может быть несколько значений (записей), которые различаются по date, но теоретически могут и в один день добавлены.
При этом надо различать, есть уже подобная запись для user_id и service_id или нет и при вставке её соответственно обновлять или добавлять.
$sql = "INSERT INTO customers VALUES ";
/*
Тут я теоретически могу расставить где надо "id", где не надо - "NULL" и сформировать строки в виде: 
$sql .= "(?,?,?,?,?),";
или
$sql .= "(NULL,?,?,?,?),";
*/
$sql .= "ON DUPLICATE KEY UPDATE sdate=VALUES(sdate), svalue=VALUES(svalue)";
$query = $mysqli -> prepare($sql);
/* а дальше начинается проблема с формированием списка переменных в bind_param*/
$query -> bind_param("",$variables);
$query -> execute();
$query -> close();

Правильно ли будет выполнять INSERT несколько раз (Около 50 service_id и от 0 до бесконечности(в среднем 1, но теоретиечски до 10) строк для каждого) с одним подготовленным выражением?
  • Вопрос задан
  • 476 просмотров
Решения вопроса 1
finnish
@finnish
Да, можно использовать один и тот же запрос с разными значениями, но при большом количестве строк производительность Вас может огорчить.

А что если Вы создадите массив, куда будете писать все значения? Заполнять его будете одновременным с формированием строки запроса. Например, так:
$sql   = 'INSERT INTO `customers` (`id`, `name`, `email`) VALUES ';
$binds = [];
$index = 0;
$count = count($customers);
foreach($customers as $customer) {
    if ($customer->id) {
        $sql .= '(?, ?, ?)';
        $binds[] = $customer->id;
    } else {
        $sql .= '(NULL, ?, ?)';
    }
    if (++$index != $count) {
        $sql .= ', ';
    }
    $binds[] = $customer->name;
    $binds[] = $customer->email;
}
$sql .= ' ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `email` = VALUES(`email`)';
$query = $mysqli->prepare($sql);
foreach($binds as $bind) {
    $query->bind_param("s", $bind);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы