python代碼連接mysql資料庫 有bug(sql註入的問題): #pip3 install pymysql import pymysql user=input('user>>: ').strip() pwd=input('password>>: ').strip() # 建立鏈接 conn=p ...
python代碼連接mysql資料庫
有bug(sql註入的問題):
#pip3 install pymysql import pymysql user=input('user>>: ').strip() pwd=input('password>>: ').strip() # 建立鏈接 conn=pymysql.connect( host='192.168.10.15', port=3306, user='root', password='123', db='db9', charset='utf8' ) # 拿到游標 cursor=conn.cursor() # 執行sql語句 sql='select * from userinfo where user = "%s" and pwd="%s"' %(user,pwd) rows=cursor.execute(sql) cursor.close() conn.close() # 進行判斷 if rows: print('登錄成功') else: print('登錄失敗')
在sql語句中 --空格 就表示後面的被註釋了,所以密碼pwd就不驗證了,只要賬戶名對了就行了,這樣跳過了密碼認證就是sql註入
這樣的連用戶名都不用知道都可以進入,所以在註冊賬戶名時好多特殊字元都不讓使用,就怕這個.
改進版(防止sql註入):
#pip3 install pymysql import pymysql user=input('user>>: ').strip() pwd=input('password>>: ').strip() # 建立鏈接 conn=pymysql.connect( host='192.168.10.15', port=3306, user='root', password='123', db='db9', charset='utf8' ) # 拿到游標 cursor=conn.cursor() # 原來的執行sql語句 # sql='select * from userinfo where user = "%s" and pwd="%s"' %(user,pwd) # print(sql) # 現在的 sql='select * from userinfo where user = %s and pwd=%s' rows=cursor.execute(sql,(user,pwd)) #原來是在sql中拼接,現在是讓execute去做拼接user和pwd cursor.close() conn.close() # 進行判斷 if rows: print('登錄成功') else: print('登錄失敗')
增刪改:先安裝pymysql模塊(pip install pymysql)
#1、增刪改 import pymysql # 建立鏈接 conn=pymysql.connect( host='127.0.0.1',#本地連接時就用127.0.0.1,如果遠程連接時就查一下對方ip再寫進來 port=3306, user='root', password='123', db='db9', charset='utf8' ) # 拿游標 cursor=conn.cursor() # 執行sql # 增、刪、改 sql='insert into user(user,pwd) values(%s,%s)'#增刪改就自己寫sql語句即可,insert,update,drop #插入一條 # rows=cursor.execute(sql,('wxx','123')) # print(rows) #插入多條 # rows=cursor.executemany(sql,[('yxx','123'),('egon1','111'),('egon2','2222')]) # print(rows) rows=cursor.executemany(sql,[('egon3','123'),('egon4','111'),('egon5','2222')]) print(cursor.lastrowid)#查看你當前id走到了多少,如果是7,那麼你再插入數據時,id就從7開始 conn.commit()#必須加這個才能保存,否則增刪改不保存 # 關閉 cursor.close() conn.close()
查詢:
# 2、查詢 import pymysql # 建立鏈接 conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', db='db9', charset='utf8' ) # 拿游標 # pymysql.cursors.DictCursor寫這個當你拿到查詢數據時會以字典形式顯示,\ # 欄位名是鍵,欄位內容是值,如果不寫只寫conn.cursor(),\ # 你拿到的就是一個大元組,都是欄位的內容,沒有欄位的名,你不知道是什麼數據 cursor=conn.cursor(pymysql.cursors.DictCursor) # 執行sql # 查詢 # 實際上就是你cursor已經將sql查詢的內容已經寫到固定地方了,\ # 每次你都是你那裡拿數據,拿一次游標走一次,跟讀文件很類似 rows=cursor.execute('select * from user;') print(rows)#只顯示受影響行數,而沒有其他內容 #取法一,fetchone只拿一條 print(cursor.fetchone())#拿到第一條內容 print(cursor.fetchone())#拿到第二條內容,一次只取一條內容 print(cursor.fetchone())#取空了,再取就會顯示None #取法二,fetchmany拿多條 print(cursor.fetchmany(2))#指定取幾條數據 #取法三:fetchall全部拿出 print(cursor.fetchall())#拿出所有內容 print(cursor.fetchall())#再拿就顯示[]而不是None #移動游標,再取 # 現在你可以移動游標,讓你取完內容後可以再取一遍 cursor.scroll(3,mode='absolute') # 相對絕對位置移動, # 相當於從頭開始,游標移動到從頭數第三行記錄的末尾,你再取就從id=4開始取 print(cursor.fetchone()) cursor.scroll(2,mode='relative') # 相對當前位置移動 # 向後跳,如果你當前id=1,你執行後再取就會變成id=4,把2和3兩行跳過了 print(cursor.fetchone()) # 關閉 cursor.close() conn.close()