ステートメントを作成してパラメータをバインドしようとしています。
ステートメントは、あらゆる種類のSQLインジェクションを無効にする可能性があるため、優れています。そして、それは文字列としてのみ見られるクエリの概念を取り除くことによってそれを行います。 SQLクエリは、パラメータリストと関連データをバインドされた変数として持つ文字列と見なされるため、クエリはテキストだけでなく、テキスト+データでもあります。
つまり:
この簡単なクエリ:
SELECT * FROM A WHERE val="$param"
クエリは文字列としてのみ表示されるため、安全ではありません。また、$ paramがチェックされていない場合、それはSQLiの穴です。
ただし、ステートメントを作成すると、クエリは次のようになります。
SELECT * FROM A WHERE val=:param
次に、bindparamを使用して値a:paramを指定します。つまり、値はクエリ文字列に追加されませんが、クエリはすでに解析され、データが提供されます。
あなたの場合、param:arrayに実装された配列をバインドします(「data1」、「data2」などを想定しています)。これは、値が文字列( "data1、data2、data3 ...")の1つのパラメーターのみであるため、複数の挿入ではなく、1つの挿入のみになります。
配列を処理するのに十分なパラメータを使用してクエリを生成することにより、ステートメントの生成を変更できます
$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";
次に、配列をループして、パラメーターごとにbindparamメソッドを呼び出します。
$count = 0;
foreach($values as $val)
{
$stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
$count++;
}
これでうまくいきます。
編集 :このソリューションは、1次元配列でどのように機能するかを示していますが、ステートメントクエリの生成を微調整し、bindparamループを変更することで、問題に簡単に拡張できます。
ステートメントは次のようになります:
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";
基本配列の要素数を数えるだけです。