В 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). Кроме того, чтобы все было как можно проще и быстрее.
Или, если есть новый шаблон или предпочтительный метод для выполнения такой массовой транзакции.
Если вы используете подготовленный оператор, вы можете $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; ?>