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()).
mysqliはmysqlでクエリを送信するための単なる一連の関数です。 –
SQL文を変数に格納し、パラメータとしてmysqli_queryに渡します。 –
残念ながら、サジュナはそうすることはできません。 Mysqliはmysqlと同じではありません。 – user1675155