2009-08-20 46 views
19

Điều này có hợp pháp không?Nhiều câu lệnh INSERT mysql trong một truy vấn php

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

Tôi đã giải quyết vấn đề của tôi chạy nhiều truy vấn về dự án php của tôi sử dụng phương pháp mysqli này [mysqli .multi-query.] (http://us2.php.net/manual/en/mysqli.multi-query.php) –

Trả lời

0

Không. Đó là các truy vấn riêng biệt và phải được gọi như vậy.

33

Không, mysql_query() chỉ cho phép một truy vấn tại một thời điểm.

Bạn có thể chèn nhiều hàng như thế này:

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

Cái này tốt hơn - điều quan trọng là chỉ định tên trường mà bạn đang đổ dữ liệu vào ! – itsricky

2

Nói chung, đó là SQL hợp lệ vì mỗi câu lệnh kết thúc bằng dấu chấm phẩy, nhưng PHP không cho phép bạn gửi nhiều truy vấn cùng một lúc, để bảo vệ chống lại các cuộc tấn công SQL injection có thể khai thác kịch bản viết kém.

Bạn vẫn có thể sử dụng cú pháp như sau:

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

Từ hỗ trợ dev MySQL 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"); 

Vì vậy, chèn diễn ra như bình thường như mọi khi:

  • đặt tên đầu tiên tên bảng nơi chúng tôi muốn chèn hàng mới,
  • fol lowed bằng cách đặt tên tên cột trong ngoặc tròn (Lưu ý: Không cần thiết nếu bạn muốn chèn ALL cột),
  • Tiếp theo GIÁ TRỊ tên khóa và sau đó trong ngoặc tròn đến các giá trị mà bạn muốn chèn cho ROW mới trong bảng trên,
  • tiếp theo dấu phẩy và sau đó một cặp dấu ngoặc tròn với những giá trị mới cho hàng mới trong bảng nêu trên
  • và điều này lặp đi lặp lại N-lần chừng nào bạn có dữ liệu để chèn.

Chúc mừng chèn nhiều giá trị với câu lệnh ONE chèn. :)

2

Sao chép/dán ví dụ trong một hàm và một vòng lặp (giả sử $ id là một mảng)

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

Tốt hơn là tránh ghép nối. Sử dụng 'implode()'. xem [answer] (http://stackoverflow.com/a/780046/4040525) để biết chi tiết. –

+1

Tại sao sử dụng implode() có lợi trong trường hợp này? Trong câu hỏi trên, chúng ta có các câu lệnh SQL bình thường. Trong câu trả lời bạn chỉ ra rằng họ nói về số lượng lớn văn bản (chẳng hạn như 1000 đoạn văn bản lớn) và, vâng, trong trường hợp đó là tốt để tránh ghép nối. –

+0

Tôi biết.OK của nó để sử dụng nối ở đây. Hôm qua tôi nhận thấy cả hai câu trả lời và nghĩ tốt hơn nên sử dụng 'implode()' như một quy tắc của ngón tay cái. –

-1
INSERT INTO table (a,b) VALUES (1,2), (2,3), (3,4); 
Các vấn đề liên quan