2016-09-19 110 views
0

我有一個準備好的語句應該更新一個字段。MySQL準備語句nvarchar

CREATE PROCEDURE `update_table` (in id INT, in col nvarchar(11), in val nvarchar(10)) 
BEGIN 
SET @sql = concat('UPDATE table SET ', col, ' = ', val , ' WHERE id = ', id); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
END 

如果我請與含有連字符的字符串的過程(例如A-B)

CALL update_table(1, 'REG', 'A-B');

我得到

錯誤1054:未知列 'A' 在 '字段列表'

能否請您協助解決這個問題?

編輯:我只是想出了連字符不是錯誤的原因。如果我嘗試用'AB'更新,則會出現相同的錯誤。 要更新的字段也是nvarchar以及相同的字段長度。

+0

什麼表,並給該過程的實際調用是什麼樣子? – Flint

回答

4

基本上,您很容易受到sql injection attacks的影響。你的存儲過程生成此SQL:

UPDATE ... WHERE reg = A-B 

注意周圍缺乏A-B報價。您不在reg字段中存儲字符串A-B。你正在做數學減法:reg = A minus BAB都不存在於你的表中。

在最低限度你需要:

SET @sql = concat('UPDATE table SET ', col, ' = "', val , '" WHERE id = ', id); 
               ^----------^ 

所以你產生

UPDATE ... reg = "A-B" 
+0

非常感謝您的promt輸入。我知道的SQL注入問題,並試圖避免它通過使用'mysqli_real_escape_string'和'strip_tags',以避免SQL注入的小php腳本 – Otto

+0

此外,這實際上不是你應該如何使用準備好的語句。 –