Надеюсь, кто-то может дать мне некоторое представление здесь.
Когда вам нужно вставить сразу несколько строк в таблицу, я использовал sql, который выглядит примерно так:
INSERT INTO some_names (firstName, lastName) VALUES ('Joe', 'Smith'),('Fred','Sampson'),('Lisa','Pearce')
Как вы можете видеть, я вставляю три строки с одним утверждением. Причина, по которой я делаю это, – это то, что я считаю, что это более эффективно, чем выполнение трех разных операторов для вставки строк.
Поэтому мой вопрос заключается в следующем: как это сделать, если я хочу привязать свои значения к заявлению? К сожалению, я смотрел по всему Интернету, и я могу найти только пример одиночных заявлений в форме:
$stmt = $mysqli->prepare("INSERT INTO some_names (firstName, lastName) VALUES (?, ?)"); $stmt->bind_param('ss', $firstName, $lastName); $firstName = "Joe"; $lastName = "Smith"; $stmt->execute(); $firstName = "Fred"; $lastName = "Sampson"; $stmt->execute();
Похоже, что это будет эквивалентно выполнению отдельных инструкций INSERT и, как представляется, менее эффективно.
Поэтому мой вопрос: есть ли способ привязки в инструкции multi-insert? Пожалуйста, просветите меня здесь! благодаря
Просто:
$stmt = $mysqli->prepare("INSERT INTO some_names (firstName, lastName) VALUES (?, ?),(?,?),(?,?)") $stmt->bind_param('ssssss', 'Joe', 'Smith','Fred','Sampson','Lisa','Pearce');
Похоже, что это будет эквивалентно выполнению отдельных инструкций INSERT и, как представляется, менее эффективно.
Нет, это не менее эффективно – потому что оператор готов только один раз (чтобы выяснить, что он должен делать), и после этого только после этого данные отправляются в базу данных.
Вы смотрите на это неправильно.
Вы почти никогда не будете делать то, что вы показали выше, это почти всегда будет сделано в цикле. И даже если вы динамически построили (?, ?), (?, ?), (?, ?)
Вам все равно придется зацикливать, чтобы построить строку запроса и привязать данные (что еще более усложнилось бы из-за смехотворного сопротивления MySQLi на привязках by-ref), поэтому он не принесет вам ничего с точки зрения работы, которую должен выполнить PHP – вы только что переместили цикл – и это потеряло бы многого с точки зрения удобочитаемости.
У этого есть выигрыш в круглых поездках в базу данных (при условии, что вы всегда вставляете более одной строки), но это только имело бы значимую разницу при вставке сотен или тысяч или строк, и в этом случае вы, скорее всего, выполняете какие-то в этом случае лишние пары секунд, вероятно, не имеют значения (это не будет, например, замедлять загрузку страницы).