一、寫法
cursor.execute('insert into user (name,password) value (?,?)',(name,password))
或者
cursor.execute('insert into user (name,password) value (%s,%s)',(name,password))
%s與?都可以作為sql語句的占位符,它們作為占位符的功能是沒有區別的,mysql.connector用 %s 作為占位符;pymysql用 ? 作為占位符。但是注意不要寫成
cursor.execute('insert into user (name,password) value (?,?)'%(name,password))
這種寫法是直接將參數拼接到sql語句中,這樣數據庫就容易被sql注入攻擊,比如
cursor.execute('select * from user where user=%s and password=%s'%(name,password))
要是name和password都等於'a or 1=1',那么這個語句會把整個user表都查詢出來
二、原理
python並不支持mysql預編譯語句,其實“參數化”是在MySQLdb中通過轉義字符串然后直接將它們插入到查詢中而不是使用MYSQL_STMT API來完成的。因此,unicode字符串必須經過兩個中間表示(編碼字符串,轉義編碼字符串)才能被數據庫接收。
也就是說,我們傳入的參數並不是直接拼接到sql語句中,而是經過了字符轉換,因此參數化查詢可以有效防止sql注入
