2011-01-07 18 views
14

オンライン登録の際、顧客は登録するいくつかのプログラムを選択できます。これらのプログラムは3桁の整数であり、配列に格納されます。例えば1つのMySQLに配列を挿入するにはPHPとPDOを使用したPreparedステートメント

:それは時間が来ると

$data = array(); 

$data[] = 155; 

$data[] = 165; 

$data[] = 175; 

$data[] = 185; 

私はプログラムID 155、165、175に入学したい

、および185

私の配列は、のように簡単に設定されていますこの情報を関連するテーブルに挿入するには、登録の他の部分の追加要素も含めてください:

例えば、私がSINGLEプログラムを実行していた場合次のようにRT文は、それがになります。私は

for($j = 0; $j < (count($data)-1); $j++) { 
    $stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()"); 
    $stmt->execute(array($memberid, $data[$j])); 
} 

$stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()"); 
$stmt->execute(array($memberid, 155)); 

を私は通常、SQL文の複数のインスタンスを呼び出し、そのように実行することになる上に配列するための単純なループを作成します上記のコードが無効であることを認識しますが($ data [$ j])、呼び出しを行う正しい方法を探しています。

私は、ビルドする前に、1つの動的SQL文が上記のような複数の呼び出しよりも全体的に優れていると言われました。私の最初のパスは次のようなものになるだろう:

$sql = array(); 
foreach($data as $row) { 
    $sql[] = '("'.$memberid.'", "'.$row[$j].'", NOW()")'; 
} 
mysql_real_query('INSERT INTO table (memberid, programid) VALUES '.implode(',', $sql)); 

が、PDOで、私は特にプレースホルダで、これがどのように動作するか非常にわかりません(?)。

提案がありますか?あなたがプログラム的にクエリを構築することができ

+2

は何度も準備多くを実行しないでください。 1つは準備されているので、別の値で複数回実行できます。提案のおかげで – Powerlord

答えて

25

...:あなたが探しているものを

$sql = 'INSERT INTO table (memberID, programID) VALUES '; 
$insertQuery = array(); 
$insertData = array(); 
foreach ($data as $row) { 
    $insertQuery[] = '(?, ?)'; 
    $insertData[] = $memberid; 
    $insertData[] = $row; 
} 

if (!empty($insertQuery)) { 
    $sql .= implode(', ', $insertQuery); 
    $stmt = $db->prepare($sql); 
    $stmt->execute($insertData); 
} 
+0

ありがとうございました。私は今、それをどうぞよろしくしています。爆発はエラーを投げていますが、私はあなたに何が起こったのかを知らせます。 – JM4

+0

@ JM4:それは私の小さな誤りでした。私はそれを上に固定した... – ircmaxell

+0

素晴らしい。助けてくれてありがとう!上記の例のdate_addedを考えてみると、新しい$ insertdata [] = NOW()要素を作成すると正しく挿入されません(PDOはこれをvarchar入力として扱い、そのままmysqlの日付形式の代わりに扱います)。通常、私は単純にクエリを生成します:date_added = NOW()しかし、上記の値で、これを行うことができますか?私は単にPHPの日付(Y-m-d H:i:s)を実行するだけで、NOW()が可能かどうかを知りたいと思っています。 – JM4

0

が一括挿入を行う方法で、これはPDO自体よりも、関連する多くのSQLです。

* _queryの場合とまったく同じことを行うだけで、一括挿入クエリとパラメータ配列を並べて作成する必要があります。

$placeholder = array(); 
$values = "?, ?, ?, ..."; 
$args = array(); 
foreach ($arrays as $array) { 
    $placeholder[] = $value; 
    $args[] = $array['col1']; 
    $args[] = $array['col2']; 
    $args[] = $array['col3']; 
    ... 
}  
$sql = "INSERT INTO table (col1, col2, ...) VALUES (" 
    . implode('), (', $placeholder) 
    . ")"; 
$stmt = $db->prepare($sql); 
$db->execute($sql, $args); 

これは醜いが動作するアルゴリズムだと思います。

9

2ソリューション

// multiple queries 
$stmt = $pdo->prepare('INSERT INTO table SET memberID=:memberID, programID=:programID, date_added=NOW()'); 
$data = array(155, 165, 175, 185); 
foreach($data as $d) { 
    $stmt->execute(array(':memberID' => $memberid, ':programID' => $d)); 
} 

そして

// one query 
$data = array(155, 165, 175, 185); 
$values = array(); 
foreach($data as $d) { 
    $values[] = sprintf('(%d, %d, NOW())', $d, $memberid); 
} 
$sql = sprintf('INSERT INTO table (memberID, programID, date_added) VALUES %s', implode (', ', $values)); 
$pdo->exec($sql); 
+0

あなたのポストに感謝しますが、複数のクエリを作成し、後者よりもデータベースに課税する上記の最初の答えではありませんか? (ほとんどの人が私にそのように使用しないように言った)。おそらく私のニーズに合っていると思われるので、私は後者をテストします。注:私は複数のクエリを実行してゼロの問題を抱えている、それは 'より遅い'(最大8レコード、1秒は私に何も意味しない)と言われている。 – JM4

+0

複数のクエリは約10ミリ秒ほど遅くなりますが、より読みやすく、デバッグが容易です。 –

関連する問題