如何处理mysql程序中的where子句?

问题描述:

这是我的程序。如何处理mysql程序中的where子句?

DELIMITER // 
drop procedure if exists GetID; 
CREATE PROCEDURE GetID(IN tb VARCHAR(255), in name2 varchar(255)) 
BEGIN 

set @sel = concat('select id FROM ', tb, ' WHERE ename = ', name2); 
prepare stmt from @sel; 
execute stmt; 
deallocate prepare stmt; 
END // 
DELIMITER ; 

当我尝试使用GetID('city','ny')执行存储过程时。我WHERE子句中的错误

未知列“NY” ......

这里“城市”是表名。哪里不对?

假设名2是与通过表中的列ename进行比较围在SQL名2

戴上引号的字符串参数:

set @sel = concat('select id FROM ', tb, ' WHERE ename = ''', name2,''''); 

它通常建议不要使用字符串连接构建SQL查询。由于您正在对查询中的列名进行硬编码,因此提供“动态”表名是没有意义的。但是,如果必须,请使用QUOTE正确地转义并引用传入的字符串。

set @sel = concat('select id FROM ', tb, ' WHERE ename = ', quote(name2)); 
+0

它的工作原理!你能否解释为什么我应该在'ename ='后面加三个引号,最后是四个引号?非常感谢。 – dullboy

+0

我仍然无法弄清楚为什么我需要在'ename ='和最后四个引号之后使用三重引号。假设查询应该看起来像这样,'从tb where ename ='name2''中选择id。如果我们需要使用一个多引号来逃避单引号,它应该看起来像'从tb中选择id,其中ename =''name2'''。我错过了什么?非常感谢。 – dullboy

+0

Nooooooo。 SQL注入失败。 –

绝不将字符串直接连接到查询中。这是非常糟糕的,你传递一个表名,unsanitized。这需要固定,太多,但一个正确的解决方案,您的直接问题是:

set @sel = concat('select id FROM ', tb, ' WHERE ename = ', QUOTE(name2)); 

QUOTE()功能正确和安全的报价和逃逸的说法,并正确处理空值和...这里防止SQL注入漏洞。

请参阅https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_quote