問題:
python調用sqlite3數據庫需要使用like模糊查詢,一條普通的like查詢語法如下:
SELECT * FROM article WHERE content LIKE '%python%'
- 1
放在程序中,使用sqlite3的查詢語句大概變成下面這樣:
conn.execute("SELECT * FROM article WHERE content LIKE '%?%'",(value,))
- 1
然后執行會報以下的錯誤:
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 1 supplied.
- 1
意思是你沒使用statement,但卻提供了一個statement參數,這是因為statement占位符”?”處在雙引號和單引號的雙重包裹之中,檢測不出來是個占位符!
首先一點,sql語句拼接可以方便的解決這個問題,但是肯定留下一個注入點,十分不安全,是絕對不能使用的。
最終
解決方案
conn.execute("SELECT * FROM article WHERE content LIKE ?", ('%' + value + '%',))
- 1
巧妙的使用普通statement占位符”?”,傳入值時使用拼接的”%value%”形式,完美的解決了問題,其它類似問題也可以借鑒這個思想。