2013-10-22 11 views
5

どのように私はmysqliのと、このクエリを挿入していますか?...のMysqli複数行挿入、簡単なマルチINSERTクエリMySQLで通常

INSERT INTO table (field1, field2, field3) VALUES ('value', 'value', 'value'), ('value', 'value', 'value'), ('value', 'value', 'value'); 

は、このクエリはまっすぐ進むと3行を挿入します、私はこれをどのように行うのですか準備されたステートメントを使わずに、あるいはあまりに複雑になることなく、準備されたステートメントを使用することなくmysqliで実行できます。 PHPで余分なファンキーなことをすることなく、そのようなクエリを実行する方法があるかどうかを知りたいだけです。

本質的に、私は挿入物あたり約10行のデータを抽出しています(複数の行を持つことに加えて複数の挿入が必要です)。これが私にとって必要なものです。私は通常mysqlを使ってクエリを実行し、各行ごとに複数の挿入を追加しないので、クエリでこれを行うだけです。

+0

mysqliはmysqlでクエリを送信するための単なる一連の関数です。 –

+0

SQL文を変数に格納し、パラメータとしてmysqli_queryに渡します。 –

+0

残念ながら、サジュナはそうすることはできません。 Mysqliはmysqlと同じではありません。 – user1675155

答えて

-3

Mysqliは独自のデータベースではなく、古いmysqlでクエリを送信する一連の関数です。

したがって、mysqliを使用すると、任意のmysqlクエリを実行できます。あなたがプリペアドステートメントそのためを使用することになっているよう

しかし、動的に与えられた値の場合、あなたは「PHPで余分なファンキーなもの」を避けることはできません。残念なことに、raw mysqliはそれほど簡単ではありません。

ので、そのような挿入を実行するために、あなたがテーブルに最初のプレースホルダ

INSERT(フィールド1、フィールド2、フィールド3)VALUES(?、?、?)でクエリを作成する必要があります、(?、?、?) 、(α、β、γ)

call_user_func_array()
と最後にexecuteを使用してすべての値をバインドします。

+0

さて、私はそれを行うことができると思います。全体のクエリーは実際にはPHPで準備されていたので、長い単一のクエリーになりますが、mysqliに合うように変更する必要があります。ちょうど挿入のための余分なものをしたくないでしたが、私はmysqliに調整する必要がありますね。ありがとう!、すばらしい答え。 – user1675155

+0

あなたは彼の質問に答えなかった。どのように私はmysqliでこのクエリを挿入するのですか?... – karmafunk

+0

同様の質問が見つかりました:http://stackoverflow.com/questions/15575405/mysqli-and-binding-multiple-value-sets-during-insertしかし解決策はまだありません! !!! – user1675155

-4

すでにSQLクエリーを作成している場合は、プリペアドステートメントを使用する必要はありません。

$result = $mysqli->query($sql_query); 

while( $row = $result->fetch_array(MYSQLI_ASSOC)) 
    { 
     $rows[]=$row; 
    } 

あなたはSQLインジェクションのために気をつけていますが、あなたの文を用意しました場合、私はあなたがすでにそれを行っていると仮定していることを確認します。挿入のために

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)"; 
$mysqli->query($query); 

printf ("New Record has id %d.\n", $mysqli->insert_id); 
+0

あなたが気付かなかった場合、あなたのこれらの文章は相互排他的です。 –

+0

常に1つのエゴがあります – karmafunk

+1

「INSERT」ではありません! – user1675155

12

mysqliのクラスは、あなたの挿入、独自の利点を持つ各を達成するための、いくつかの異なる方法を提供します。確かに、そのうちの1つはあなたのニーズに合っているはずです。

以下の例では、指定されていない "抽出されたデータ"が$ bigArray [0 ... datasetsize] [0 ... 2]の配列に格納されていることを前提としています。

mysqliデータベースは$ dbと仮定します。

方法1 - オールドスクール

あなたは、単にあなたのクエリ文字列を構築し、それをデータベースに照会することによってに使用されているようにあなたがまっすぐにそれを行うことができます。あなたが指定したように、インサートは一度に10個ずつバンドルされています。次のコードはそのようなバンドルを示し、データセット全体(bigArray)まで拡張されています。 mysqli :: escape_stringを使ってデータをエスケープする必要があります(ここでは行いません)。

挿入するデータは、すべての例で整数とみなされます。

$sql = "INSERT INTO testTable (fieldA, fieldB, fieldC) VALUES "; 
for ($i = 0; $i < 10; ++$i) 
{ 
    if ($i > 0) $sql .= ", "; 
    $sql .= "({$bigArray[$i][0]}),({$bigArray[$i][1]}),({$bigArray[$i][2]})"; 
} 
$db->query($sql); 

方法2 -

できるだけ単純あなたが結合プリペアドステートメントおよびパラメータを使用したい場合は、最初の努力は、次のようになります。最適ではないが、この声明は一度だけ準備される。しかし、変数は各インサートにバインドされており、無駄です(しかし単純です)。インサートがバンドルされていないので、実施例は方法3
$statement = $db->prepare("INSERT INTO testTable (fieldA, fieldB, fieldC) VALUES (?,?,?)"); 
for ($i = 0; $i < 10; ++$i) 
{ 
    $statement->bind_param("iii",$bigArray[$i][0],$bigArray[$i][1],$bigArray[$i][2]); 
    $statement->execute(); 
} 

10上

ループ -

準備文と方法1の生挿入クエリとほぼ同一である性能を可能に組み合わされ、複数のインサートを最適化。実際の結果は設定によって異なりますが、ローカルデータベースとリモートデータベースの両方を使用したシステムのクイックテストでは、パフォーマンスが数パーセントのポイントでより速くで最適化された方法で、方法1のデータが逃げる。

以下はcall_user_func_arrayを使用していますが、毎回バンドルしたい数が分かっていて、bind_paramを直接呼び出すことを避けることができます。これにより、パフォーマンスがさらに向上します。

この例では、外側のループが含まれており、合計10k行(つまりbigArray [0..9999] [0..2])を想定しています。

$sql = "INSERT INTO testTable (fieldA,fieldB,fieldC) VALUES (?,?,?)".str_repeat(",(?,?,?)",9); 
$statement = $db->prepare($sql); 

// This is the type string used by statement::bind_param. 
// Example assumes all INTs. 
$types = (array)str_repeat("i",30); 

$values = array_fill(0,30,0); // A bit of unneeded variable init. 

// * See notes following code snippet on why the intermediate array is used. 
$intermediate = array(); 
for ($n = 0; $n < 30; ++$n) 
{ 
    $intermediate[$n] = &$values[$n]; 
} 

call_user_func_array(array(&$statement, "bind_param"), array_merge($types,$f)); 

for ($j = 0; $j < 1000; ++$j) 
{ 
    for ($i = 0; $i < 10; ++$i) 
    { 
     $values[$i*3] = $bigArray[$i][0]; 
     $values[$i*3+1] = $bigArray[$i][1]; 
     $values[$i*3+2] = $bigArray[$i][2]; 
    } 
    $statement->execute(); 
} 

// call_user_func_array with bind_param requires the values be 
// passed by reference which is evaluated only on the initial 
// call. Using $values[...] = &$bigArray[...] below won't work 
// and an intermediate array referencing $values is used. This 
// bit of "extra funky stuff" can be avoided at a very slight 
// performance penalty by setting $values[...] = $bigArray[...] 
// AND EVALUATING EACH TIME (move call_user_func_array 
// inside the outer loop, i.e. right above $statement->execute()). 
+1

これはまさに私が避けようとしていたことです、私が言ったように、私は質問を渡したかったのですが、 PHPでは、ファンキーなものの極端な例です。言い換えれば、できる限り多くのクエリを生の形式で渡したかったのです。 – user1675155

+0

@fyoしかし、Dataが_配列_に格納されていないのに_JSON_オブジェクトに格納されている場合、Method1またはMethod2をどう扱うでしょうか?数百または数千のJSONデータセットを10個に分割して一度に挿入する方法 – Peter

関連する問題