我目前在MySQL中有一个名为Admin_Emails
的存储过程,它接受三个参数:siteID VARCHAR(20)
categoryID INT
approved INT
siteID
始终采用以下格式:s-xxx(x)-xxxxxx
。
在此过程中,我使用以下方法将siteID
添加到查询中:
IF(siteID IS NOT NULL)
THEN
SET @query = CONCAT(@query, " AND e.site_id = ", siteID);
END IF;
如果我运行该过程(例如CALL Admin_Emails('s-osp-123ABC', 2, 1)
然后我收到以下错误:
#1054 - Unknown column 's' in 'where clause'
s
来自siteID
字符串。我尝试将我的CONCAT
语句修改为以下内容:
SET @query = CONCAT(@query, " AND e.site_id = ", "'" + siteID + "'");
这不会产生错误,但会给我与输入不匹配的siteID's
结果。我故意通过在查询中排除AND
来产生错误,它显示了siteID
应该在何处的0
:
#1064 - You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near 'e.site_id = 0 AND e.category_id = 2 AND e.is_approved != 0' at line 20
我不知所措。我尝试搜索与存储过程中VARCHAR
字符串相关的问题,但找不到类似的情况。有人知道我在这里做错了什么吗?
我不想让整个过程超负荷,所以我希望我在这里提供的东西已经足够了,但如果不是,我可以生产更多的程序。
为什么不呢
CONCAT(@query, " AND e.site_id = ", "'", siteID,"'");
当 concat() 支持字符串 concat 的 n 个值时尝试+
似乎很奇怪......
我认为++正在尝试进行数学运算,这导致了错误。
或者,您在查询结束时有一个or
限制,并添加了 and....如果 OR 没有正确的 (),则可能会导致意外结果的问题。
请注意,如果传入的 SiteID 未正确清理,您现在可以进行 SQL 注入。