2009-08-20 20 views
19

これは正当なものですか?複数のmysql INSERT文を1つのクエリでPHP

$string1= "INSERT INTO....;"; 
$string1 .= "INSERT INTO....;"; 
$string1 .= "INSERT INTO....;"; 
mysql_query($string1) or die(mysql_error()); 
+0

私はこのmysqliのメソッドを使用して、私のPHPプロジェクトで複数のクエリを実行し、私の問題を解決し、[mysqliのマルチクエリー](http://us2.php.net/manual/en/mysqli.multi-query.php) –

答えて

42

を、そしてあなたが 同じテーブルに同じデータを挿入している場合に応じて、it's much better to insert multiple values with the one insert 例えば一般的に

INSERT INTO a VALUES (1,23),(2,34),(4,33); 
INSERT INTO a VALUES (8,26),(6,29); 
+2

「速度の挿入」ページを参照していただきありがとうございます。 – SarathChandra

0

いいえ。別個のクエリであり、そのように呼び出す必要があります。

33

いいえ、mysql_query()は一度に1つのクエリしか許可しません。

あなたはこのような複数の行を挿入することができます:それは価値がある何のため

INSERT INTO table (col1, col2) 
VALUES (1, 2), (3, 4), (5, 6) 
+0

これは、データをダンプするフィールド名を指定することが重要です! – itsricky

2

、それぞれの文はセミコロンで終わるので、それが有効なSQLですが、PHPは、あなたが利用する可能性があるSQLインジェクション攻撃から保護するために、一度に複数のクエリを送信することはできません。よく書かれていないスクリプト。

あなたはまだのような構文を使用することができます:MySQLのdevのサポートから

INSERT INTO foo VALUES ('a1', 'b1'), ('a2', 'b2'); 
10

だから、挿入MySQL dev forum

INSERT INTO table (artist, album, track, length) 
VALUES 
("$artist", "$album", "$track1", "$length1"), 
("$artist", "$album", "$track2", "$length2"), 
("$artist", "$album", "$track3", "$length3"), 
("$artist", "$album", "$track4", "$length4"), 
("$artist", "$album", "$track5", "$length5"); 

は通常いつものようになります:最初のテーブル名を命名

  • 新しい行を挿入する場所、
  • fol VALUESキー名が続き
  • 、その後、丸括弧であなたは新しい行のために挿入したい値がくる:(あなたがALL列を挿入したい場合に必要なわけではありません)丸括弧内の列名を命名することにより、lowed上記の表で、
  • COMMA 続い
  • 上記テーブルに新しい行の新しい値を丸括弧の、別の一対これは限り、あなたは挿入するデータがN回を繰り返します。

ONEの挿入ステートメントで複数の値を挿入すると便利です。 :)機能やループ内

2

コピー/ペーストの例は、($ idを想定することは配列です)

public function duplicateItem($ids) 
{ 
    if (isset($ids[0])){ //at least one item 

     $sqlQuery = "INSERT INTO items (item_id, content) VALUES "; 

     for($i=0; $i<count($ids); $i++) { 

       if ($i == count($ids)-1){ 
        $sqlQuery .= "(".$ids[$i][0].", '".$ids[$i][1]."');"; 
       }else{ 
        $sqlQuery .= "(".$ids[$i][0].", '".$ids[$i][1]."'),"; 
       } 

     } 

     mysql_query($sqlQuery) or die('Error, insert query failed: '.mysql_error()); 

    } 
} 
+0

連結を避ける方が良いです。 'implode()'を使ってください。詳細は、この[answer](http://stackoverflow.com/a/780046/4040525)を参照してください。 –

+1

なぜimplode()を使用するのがこの場合に有益でしょうか?上記の質問には、通常のSQL文があります。答えでは、大量のテキスト(大文字の1000個の挿入など)について話します。その場合、連結を避けるのがよいでしょう。 –

+0

私は知っています。そのOKをここで連結して使用してください。昨日、私は両方の答えに気付き、経験則として 'implode()'を使うほうが良いと考えました。 –

-1
INSERT INTO table (a,b) VALUES (1,2), (2,3), (3,4); 
関連する問題