3

在 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 注入,并在少于 10 个并发开放连接(最好是 1 个)的情况下尽快更新MySQL。此外,为了使事情尽可能简单和快速。

或者,如果有执行此类批量事务的新模式或首选方法。

4

2 回答 2

5

如果您使用准备好的语句,则可以$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。代码在这里

于 2012-10-18T17:47:48.457 回答
1

使用MysqliPDO

以下是您将如何在 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;

?>
于 2012-10-18T17:48:08.310 回答