在PHP中,我从URI中提取大量JSON数据,然后通过内置的json_decode
函数将其序列化为关联的PHP数组。
然后,我创建一个数组:
$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"]).")";
}
然后,我只是通过插入我已经准备好的插入来执行批量插入:
mysql_query("INSERT INTO `MyTable` (`col1`,`col2`,`col3`) VALUES ".implode(",",$inserts));
无论如何,我发现不再建议使用mysql_*
系列。所以我想知道如何使用预先准备好的语句或者新接受的结构来完成这种类型的模式?我担心的是消除SQL注入,并且尽可能快地更新MySQL,只需少于10个并发的开放连接(最好是1)。此外,尽可能保持简单快捷。
或者,如果有新模式或首选方法来执行此类批量交易。
答案 0 :(得分:5)
如果您使用预准备语句,则可以使用foreach循环遍历$JSON_data
数组,并使用该数据块运行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
对应于double(浮点),b
对应于二进制数据。
还有一点需要注意, NOT 引用任何字符串数据,因为s
数据类型告诉mysql需要一个字符串。如果你在准备好的声明中引用?
,它会告诉你params的数量是错误的。如果你引用字符串,它将在mysql中引用。
修改强>
如果你想使用相同的范例(用一个查询插入多行),有办法做到这一点。一种方法是创建一个将聚合bind_param
调用的类,并在执行查询时执行一个bind_param。代码为here。
答案 1 :(得分:1)
以下是如何使用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;
?>