MySQL Bulk Insert через PHP

В PHP я извлекаю большое количество данных JSON из URI, а затем сериализую его в ассоциативный массив PHP через встроенную функцию json_decode .

Затем я создаю массив:

 $inserts = array(); 

Я прохожу через ассоциативный массив JSON, добавляя новую пару ключ / значение в массив $inserts для каждого элемента массива JSON:

 foreach($JSON_data as $key => $value) { $inserts[] = "(".mysql_real_escape_string($value["prop1"])."," .mysql_real_escape_string($value["prop2"])."," .mysql_real_escape_string($value["prop3"]).")"; } . foreach($JSON_data as $key => $value) { $inserts[] = "(".mysql_real_escape_string($value["prop1"])."," .mysql_real_escape_string($value["prop2"])."," .mysql_real_escape_string($value["prop3"]).")"; } 

Затем я выполняю объемную вставку просто путем подрыва уже вставленных вставок:

 mysql_query("INSERT INTO `MyTable` (`col1`,`col2`,`col3`) VALUES ".implode(",",$inserts)); 

В любом случае, я обнаружил, что семейство mysql_* больше не предлагается использовать. Поэтому мне интересно, как этот тип шаблона предполагается выполнить с помощью подготовленных инструкций или без новых принятых конструкций? Мои проблемы состоят в том, чтобы устранить SQL-инъекцию, а также как можно быстрее обновить MySQL с менее чем 10 одновременными открытыми соединениями (предпочтительно 1). Кроме того, чтобы все было как можно проще и быстрее.

Или, если есть новый шаблон или предпочтительный метод для выполнения такой массовой транзакции.

Solutions Collecting From Web of "MySQL Bulk Insert через PHP"

Если вы используете подготовленный оператор, вы можете $JSON_data массив $JSON_data с циклом foreach и запустить INSERT с этим фрагментом данных.

Использование подготовленных операторов уменьшит накладные расходы на построение запроса, просто посылая новые данные в базу данных на каждой итерации цикла.

 $query = mysqli_prepare("INSERT INTO `MyTable` (`col1`,`col2`,`col3`) VALUES(?,?,?)"); foreach($JSON_data as $key => $value) { $query->bind_param('sss',$value["prop1"],$value["prop2"],$value["prop3"]; $query->execute(); } 

Обратите внимание, что первый аргумент bind_param() сообщает ему, сколько значений вы будете привязывать, а также тип для каждого значения.
s соответствует строковым данным, i соответствует целочисленным данным, d соответствует двойной (с плавающей запятой), а b соответствует двоичным данным.

Еще одно предостережение, НЕ цитируйте строковые данные, так как тип данных s подсказывает mysql ожидать строку. Если вы процитируете ? в подготовленном заявлении он скажет вам, что число параметров неверно. Если вы укажете строки, это будет указано в mysql.

РЕДАКТИРОВАТЬ:

Если вы хотите использовать ту же парадигму (вставляя несколько строк с одним запросом), есть способы сделать это. Один из способов – создать класс, который будет агрегировать вызовы bind_param и сделать один bind_param при выполнении запроса. Код для этого здесь .

Использовать Mysqli или PDO

Вот как вы могли бы использовать подготовленные заявления с Mysqli

 <?php //Basic layout to using parametized queries in PHP to prevent Bobby-tables $VARIABLE = "Some Data"; $mysqli = new mysqli("SERVER","USER","PASSWORD","DATABASE"); $query = $mysqli->prepare("SELECT COLUMN_LIST FROM TABLE WHERE COLUMN = ?"); $query->bind_param('s',$VARIABLE); //'s' for string, use i for int d for double $query->execute(); //Get results $query->bind_result($VARIABLE_NAMES_MATCHING_COLUMN_NAMES_GO_HERE); $query->fetch(); echo $VARIABLE_LIST_MATCHING_COLUMN_LIST; ?>