2013-04-13 150 views
1

我這個代碼成功插入記錄:MySQL數據插入與foreach循環

foreach($R as $k=>$v) 
{ 
    $test_id = str_replace('rep_result_', '', $k); 
    if(strstr($k, 'rep_result_')) 
    {  
     $content = $v; 
     $SQL = "INSERT INTO report SET 
      rep_te_id = '$test_id', 
      rep_result = '$content', 
      record_id = '$R[payment_id]', 
      rep_date = '$dt'"; 

但現在我有我的表,remarknor兩個附加字段。所以,現在,對於將所有的數據我做了這個代碼:

foreach($R as $k=>$v) 
{ 
    $test_id = str_replace('rep_result_', '', $k); 
    if(strstr($k, 'rep_result_')) 
    { 
     $content = $v; 
     if(strstr($k, 'remark_')) 
    { 
     $remark=$v; 
     if(strstr($k, 'nor_')) 
     { 
      $nor=$v; 
     $SQL = "INSERT INTO report SET 
       rep_te_id = '$test_id', 
      rep_result = '$content', 
      record_id = '$R[payment_id]', 
      remark = '**$remark**', 
      nor = '**$nor**',      
      rep_date = '$dt'"; 

我沒有在數據庫中保存任何東西。這裏並不是一切都好。如果我只使用一個if條件,則數據將被插入,如(rep_result,remark,nor any one)

if(strstr($k, 'remark_')) 
    $remark=$v; 

但是,當我使用所有這三個條件時,什麼都不存儲。我知道我有if聲明或foreach循環問題。

+3

請- 學會使用MySQLi或帶準備好的語句的PDO - 如果您剛剛學習,學會使用良好實踐而不是錯誤 –

+2

還要學習SQL的語法,您將INSERT的結構與UPDATE的結構結合起來 –

+1

**您要離開你自己開放SQL注入攻擊**請學習如何使用參數化查詢,最好使用PDO模塊來保護您的Web應用程序。 http://bobby-tables.com/php有例子讓你開始。 –

回答

2

正如其他人所說,你的SQL語法基本上是不正確的(混合使用INSERT和UPDATE語法)。單行插入語句將有這樣的結構:

INSERT INTO report (rep_te_id, rep_result, record_id, rep_date) 
VALUES ('$test_id', '$content', '$R[payment_id]', '$dt') 

做準備的語句讀了,庫MySQLi和PDO更多地瞭解性能和高效利用的數據庫服務器。

而且,只是在一般意義上,從一個循環內發送大量獨立的SQL語句的數據庫是一個潛在的巨大性能問題。與這些調用中的每一個都有關聯的通信和連接開銷與您希望數據庫服務器執行的實際數據插入工作無關。

MySQL允許您使用相同的語句插入多行,因此您可以在循環中創建單個SQL語句,然後將一次調用中的所有插入操作發送到數據庫。

插入多行與一個語句如下語法:

INSERT INTO report (rep_te_id, rep_result, record_id, rep_date) 
VALUES ('1', 'Row 1 content', '1', '2013-04-15'), 
('2', 'Row 2 content', '2', '2013-04-15'), 
('3', 'Row 3 content', '3', '2013-04-15'), 
('4', 'Row 4 content', '4', '2013-04-15'); 

對於文檔和更多示例,請參閱:

http://dev.mysql.com/doc/refman/5.5/en/insert.html

https://stackoverflow.com/a/6889087/618649

https://stackoverflow.com/a/1307652/618649

0

試着爲你的每個if條件實現一個else,然後嘗試回顯他們的某些東西,因爲看起來像你的If條件沒有得到滿足。

我建議你只從所有三個回聲$ k,因爲你將能夠知道當前值$ k。

也指定其他號碼。在回聲中,所以你將能夠得到被調用的其他東西。

1

您的INSERT查詢語句有錯誤。 我無法測試你的代碼,但我認爲你的條件在這裏工作是一個mysqli連接和INSERT查詢的示例。

//opening connection 
    $mysqli = new mysqli($dbserver, $dblogin, $dbpassword, $dbname); 
    if (mysqli_connect_errno()) 
    { 
     printf("Connection failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 

    foreach($R as $k=>$v) 
    { 
     $test_id = str_replace('rep_result_', '', $k); 
     if(strstr($k, 'rep_result_')) 
     { 
      $content = $v; 
      if(strstr($k, 'remark_')) 
      { 
        $remark=$v; 
        if(strstr($k, 'nor_')) 
        { 
         $nor=$v; 

         $SQL = "INSERT INTO report (`rep_te_id`, `rep_result`, `record_id`, `remark`, `nor`, `rep_date`) VALUES ('".$test_id."', '".$content."', '".$R['payment_id']."', '".$remark."', '".$nor."', '".$dt."')"; 
         echo $SQL //let's see the query 
         $mysqli->query($SQL) or die($msqli->error.__LINE__); 
        } 
      } 
     } 
    } 

當你看到我放在一個echo$SQL聲明之後,看看你的條件相匹配。如果查詢將不會被印刷成宥有問題,所有這些if條件

1

嘿,夥計你的插入查詢語法錯誤的用戶正確和學習一些SQL查詢語法

INSERT INTO report (rep_te_id,rep_result,remark,nor,rep_date) VALUES ('$test_id','$content','$R[payment_id]','**$remark**','**$nor**','$dt'); 
+0

是正確的語法,+1 upvote:D –