在PHP中,我从URI中提取大量JSON数据,然后通过内置json_decode函数将其序列化为关联的PHP数组.
然后,我创建一个数组:
$inserts = array();
Run Code Online (Sandbox Code Playgroud)
我遍历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"]).")";
}
Run Code Online (Sandbox Code Playgroud)
然后,我只是通过插入我已经准备好的插入来执行批量插入:
mysql_query("INSERT INTO `MyTable` (`col1`,`col2`,`col3`) VALUES ".implode(",",$inserts));
Run Code Online (Sandbox Code Playgroud)
无论如何,我发现mysql_*不再建议使用这个家庭.所以我想知道如何使用预先准备好的语句或者新接受的结构来完成这种类型的模式?我担心的是消除SQL注入,并且尽可能快地更新MySQL,只需少于10个并发的开放连接(最好是1).此外,尽可能简单快捷.
或者,如果有新模式或首选方法来执行此类批量事务.
如果使用预准备语句,则可以$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();
}
Run Code Online (Sandbox Code Playgroud)
请注意,第一个参数bind_param()告诉它将绑定多少个值,以及每个值的类型.
s对应于字符串数据,i对应于整数数据,d对应于double(浮点),并且b对应于二进制数据.
另一个值得注意的是,不要引用任何字符串数据,因为s数据类型告诉mysql期望一个字符串.如果你?在准备好的声明中引用它,它会告诉你params的数量是错误的.如果引用字符串,它将在mysql中引用.
编辑:
如果你想使用相同的范例(用一个查询插入多行),有办法做到这一点.一种方法是创建一个将聚合bind_param调用的类,并在执行查询时执行一个bind_param.代码就在这里.