2011-03-22 53 views
1

這就是我通常做存儲標籤在數據庫中:沒有好幾趟數據庫中存儲的標籤

foreach ($tags as $tag) 
    { 
     if (mysqli_query($link, "INSERT INTO tag (name) VALUES ('$tag')") === false) 
     { 
     $queries_ok[] = false; # I'm using this because I have autocommit set to false, i.e. mysqli_autocommit($link, FALSE); 
     }  
    } 

然而,這涉及到連接到數據庫幾次,所以如果你有10個標籤,它涉及連接10次,是否有另外一種更簡單,更快捷的方式呢?

+0

「Another」:是的。請參閱Marc B,mfonda等。「更簡單」:可能不會。 「更快」:可能,但速度可能微乎其微。 – 2011-03-22 19:35:52

回答

2

MySQL有一個「擴展插入」語法,它看起來像這樣:

INSERT INTO table (a,b,c) VALUES (1,2,3), (4,5,6), (7,8,9), etc... 

唯一的缺點是,這種格式是不受預準備語句支持,因此您必須自己構建查詢,這意味着要採取常規步驟來避免SQL注入問題。

+1

我不是PHP專家,但是不可能用'len(tags)*'(?)''動態構建SQL語句並以安全的方式添加參數?手動消毒輸入似乎對我來說是有風險的業務... – 2011-03-22 19:30:48

+0

@JørnSchou-Rode:這個總體想法是一個很好的方式:)。在PHP中,你需要使用'str_repeat'函數。 – mfonda 2011-03-22 19:34:38

+0

佔位符是一個單值類型的東西。所有重複的字段集都會試圖擠入插入查詢的字段部分中指定的第一個表字段,使b/c留空。把它們想象成一個美化的'printf()'類型的格式字符串。 – 2011-03-22 19:43:24

1

可以插入一個插入語句多行:

INSERT INTO tag (name) VALUES ('tag1'), ('tag2'), ('tag3'), ... 
+0

說我不知道​​數組中有多少個標籤?那麼你會怎麼做? – 2011-03-22 19:27:17

+0

使用代碼構建此查詢,對於「VALUES」之後的內容使用'foreach'類型循環。請參閱Marc B的答案,即:SQL注入。 – 2011-03-22 19:32:41

+0

使用'implode()'或一個循環來構建字符串。更好的做法是用''''構建一個字符串,然後使用準備好的語句來執行使用標籤數組。 – mfonda 2011-03-22 19:33:06

0

我發現選擇/工會alternatieve是相當通用的,已經用了很多次了對systmes在伸出的插入不可用:

東西(我有這臺主機上沒有數據庫..)像這個:

INSERT INTO TABLE (a,b,c) 
SELECT 1, 2, 3 
union 
SELECT 4, 5, 6 
union 
SELECT 7, 8, 9 
2

我會推薦使用預準備語句。僞代碼,因爲我不記得PHP的確切功能:

$st = $db->prepare('INSERT INTO tag(name) VALUES (?)'); 
$st->bindParam(1, $tag); 
foreach ($tags as $tag) 
    $st->exec(); 

當你還在曾觸及每調用數據庫,查詢本身沒有解析每個exec(),你會得到安全的參數檢查的好處。

+0

已準備好的陳述以及任何有助於防止SQL注入攻擊的內容。 – 2011-03-22 19:33:57

0

除了什麼mfonda說你可以做一個

INSERT INTO table (a,b,c) 
SELECT 1,2,3 
UNION 
SELECT 4,5,6 
UNION 
SELECT 7,8,9; 

這是老派的方式,預SQL-92標準。這就是我被所有舊時代教授的方式。

相關問題