【问题标题】:MySQL prepared statement nvarcharMySQL 准备好的语句 nvarchar
【发布时间】:2016-09-19 20:12:02
【问题描述】:

我有一个准备好的声明,应该更新一个字段。

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,字段长度相同。

【问题讨论】:

  • 表格和对过程的实际调用是什么样的?

标签: mysql sql mysql-error-1054


【解决方案1】:

基本上,你很容易受到sql injection attacks 的攻击。你的 sproc 生成了这个 sql:

UPDATE ... WHERE reg = A-B

注意A-B 周围没有引号。您没有将字符串 A-B 存储在 reg 字段中。你正在做数学减法:reg = A minus BAB 都不是你表中存在的字段。

至少你需要:

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

所以你正在生成

UPDATE ... reg = "A-B"

【讨论】:

  • 非常感谢您的提示输入。我知道 sql 注入问题并试图通过使用一个小的 php 脚本来避免它,该脚本使用 'mysqli_real_escape_string' 和 'strip_tags' 来避免 sql 注入
  • 另外,这实际上不是您应该使用准备好的语句的方式。
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多