为什么我的存储过程无法识别我的varchar字符串?

时间:2017-05-17 14:33:05

标签: mysql stored-procedures

我目前在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字符串相关的问题,但找不到类似的情况。是否有人知道我在这里做错了什么?

我不想在整个程序中重载,所以我希望我在这里提供的内容已经足够了,但如果没有,我可以生成更多的程序。

1 个答案:

答案 0 :(得分:2)

为什么不

CONCAT(@query, " AND e.site_id = ", "'", siteID,"'");

当concat()支持字符串concat的n值时,看起来很奇怪和+ ...

我认为++正在尝试进行导致错误的数学运算。

或者你在查询结束时有一个or限制,并添加了....如果或没有正确的(),它可能会导致意外结果的问题。

如果传入的SiteID未正确清理,则会收到警告,您现在可以使用SQL注入。