2017-02-27 65 views
0

這是我的程序。如何處理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

假設名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注入失敗。 –

1

絕不將字符串直接連接到查詢中。這是非常糟糕的,你傳遞一個表名,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