2010-07-27 39 views
0

我正在使用以下代碼段來分解字符串數組,然後將它們插入到數據庫中。對多個MySQL插入使用foreach循環

//split tags into individual words 
     $tag_array = explode(',', $tags); 

     foreach($tag_array as $tag){ 
      addslashes($tag); 
      echo $tag." "; 
      $addTagsQuery = "INSERT INTO `my_blog`.`tags` (`id`, `name`) VALUES 
      ('".$id."', '".$tag."');"; 
      $tagsResult = $db->query($addTagsQuery); 
      if($tagsResult){ 
       echo "tag added <br />"; 
      } 
      else { 
       echo "tag was not added <br />"; 
      } 

     } 

我的問題在於提交多個標記(字符串)的情況。不幸的是,只有數組中的第一個字符串被插入。任何有關爲什麼只有數組中的第一個字符串插入到MySQL數據庫的深入瞭解。

+1

那是哪裏'$ id'來自哪裏? – MvanGeest 2010-07-27 17:20:43

+0

nope,但它的編碼方式,你可能會廣泛開放SQL注入攻擊 – DRapp 2010-07-27 17:21:32

+0

你需要在你的代碼中添加一些調試。回聲儘可能多的信息 - 每個變量,查詢結果等。我敢打賭,你甚至沒有一個想法,什麼是$標籤變量內容是。 – 2010-07-27 17:22:50

回答

4

$ id沒有在循環中增加。機會是你得到一個重複的錯誤,但無論出於何種原因它不會告訴你(糟糕的錯誤處理?)。

$addTagsQuery = "INSERT INTO `my_blog`.`tags` (`name`) VALUES 
      ('".$tag."');";

如果ID被auto_incrementing,只是省略,它會處理,對於你。

+0

我關掉了auto_incrementing和主鍵。我想擁有一個可能有多個標籤的博客ID(即:博客ID = 1)。 – 2010-07-27 17:28:16

+0

@ smafu_1:那麼列名「id」有點讓人誤解,因爲它不是該行的標識。也許它可以被稱爲blog_id。 – 2010-07-27 17:42:31

0

$ id是標籤提交的博客條目的ID?你可能把ID變成了主鍵還是唯一的?這可能會導致問題。

+0

正確。這是博客條目的ID。這是主鍵,我爲此改變了它,以便我可以插入多個具有相同編號的條目。 – 2010-07-27 17:27:30

+0

hm。下面是我要做的:試着打印出sql命令,並將它們輸入命令行。看看你是否有錯誤功能。 – Nicolas78 2010-07-27 17:44:42

4
  • 您應該使用自動遞增的ID,而不是手動設置ID。
  • 您不需要運行多個插入語句。你可以這樣做在一個聲明:

    INSERT INTO my_blog.tags (name) VALUES ('tag1'), ('tag2') 
    
  • 功能addslashes不修改這樣的方式,您使用的是它不會有任何效果的字符串。

  • 您應該使用綁定參數而不是轉義字符串。
+0

+1 - 像這樣使用組合插入也更加有效。 – 2010-07-27 17:36:03

0

試試這樣說:

$tag_array = explode(',', $tags); 
$stmt = $db->prepare("INSERT INTO my_blog.tags (id, name) VALUES (?,?)"); 
foreach($tag_array as $tag){ 
    if ($stmt->execute(Array($id, $tag))){ 
     echo "tag added <br />"; 
    } 
    else{ 
     echo "tag was not added <br />"; 
    } 
    $stmt->closeCursor(); 
}