我目前在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
来产生错误,并且显示0
应该是siteID
:
#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
字符串相关的问题,但找不到类似的情况。是否有人知道我在这里做错了什么?
我不想在整个程序中重载,所以我希望我在这里提供的内容已经足够了,但如果没有,我可以生成更多的程序。
答案 0 :(得分:2)
为什么不
CONCAT(@query, " AND e.site_id = ", "'", siteID,"'");
当concat()支持字符串concat的n值时,看起来很奇怪和+
...
我认为++正在尝试进行导致错误的数学运算。
或者你在查询结束时有一个or
限制,并添加了....如果或没有正确的(),它可能会导致意外结果的问题。
如果传入的SiteID未正确清理,则会收到警告,您现在可以使用SQL注入。