2016-09-19 130 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

此外,这实际上不是你应该如何使用准备好的语句。 –