, как вы сделали это, во многих отношениях, худший вариант , Поэтому хорошая новость заключается в том, что любой другой способ сделать это, вероятно, будет лучше. Как бы то ни было, код может выйти из строя в зависимости от того, что находится в данных; рассмотрите:
$v="single ' quote";
$stmt = $db->exec("Insert into test(fruit) VALUES ('$v')");
Но, не зная, каковы ваши критерии для «наилучшего», его довольно сложно посоветовать. Использование параметризованного запроса с привязкой данных или, как они часто описываются, «подготовленные заявления» - одно из решений проблемы, описанной выше. Эквивалентное значение , прежде чем интерполировать строку, является другой (и как большинство реализаций реализации данных в PHP за кадром) является еще одним распространенным решением.
Оставляя в стороне вопрос о том, как вы получаете параметры в инструкции SQL, возникает вопрос о производительности. Каждая поездка в базу данных имеет стоимость, связанная с ней. И одновременное выполнение одной вставки также влияет на производительность. Для каждого запроса СУБД должен анализировать запрос, применять соответствующие элементы управления параллелизмом, выполнять запрос, применять записи в журнале, затем к таблицам данных и индексам, затем убирать, прежде чем он сможет вернуть поток выполнения обратно в PHP, чтобы построить следующий запрос.
Обертка нескольких запросов в транзакции (вы уже используете транзакции, но они неявны и применяются к каждому оператору) могут уменьшить некоторые из накладных расходов, которые я описал здесь, но могут вводить другие проблемы, характер которых зависит от которая использует модель параллелизма, используемую вашей СУБД.
Чтобы получить данные в базу данных как можно быстрее, и свести к минимуму фрагментации индекса, «лучший» решение для пакетной до нескольких вставок:
$q="INSERT INTO test (fruit) VALUES ";
while (count($array)) {
$s=$q;
$j='';
for ($x=0; $x<count($array) && $x<CHUNKSIZE; $x++) {
$s.=$j." ('" . mysqli_real_escape_string($db,
array_shift($array)) . "')";
$j=',';
}
mysqli_query($db,$s);
}
Это аналогично методу Barmar, но я думаю, проще понять, когда вы работаете с более сложными структурами записей, и он не будет разбиваться на очень большие входные наборы.
Ya, я знаю, подготовленно. Вы говорите это лучше, так как добавьте массив в цикле? – Pekus
Дело в том, чтобы сделать один запрос вместо многих запросов. – Barmar
Хорошо, спасибо, но у меня есть одна проблема. Почему он не работает? $ column = implode (',', array_keys ($ array)); $ val = implode (',', ''. Array_values ($ array. '')); $ sql = "INSERT INTO test ($ column) VALUES ('$ val')"; – Pekus