3

PHPでは、URIから大量のJSONデータを取得し、組み込みjson_decode関数を介してそれを連想PHP配列にシリアル化します。

次に、配列を作成します。

$inserts = array();

$insertsJSON連想配列をループして、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対応、double (浮動小数点) にb対応、バイナリ データに対応します。

注意すべきもう 1 つの言葉は、データ型が mysql に文字列を期待するように指示するため、文字列データを引用しないことです。s準備されたステートメントでを引用すると、パラメーター?の数が間違っていることがわかります。文字列を引用すると、mysql で引用されます。

編集:

同じパラダイム (1 つのクエリで複数の行を挿入する) を使用したい場合は、それを行う方法があります。1 つの方法は、呼び出しを集約するクラスを作成しbind_param、クエリの実行時に bind_param を 1 つ実行することです。そのためのコードはhereです。

于 2012-10-18T17:47:48.457 に答える
1

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;

?>
于 2012-10-18T17:48:08.310 に答える