安装pip3 install pymysql 使用方法(示例表为用户注册信息表):
import pymysqluser=input('username: ').strip()pwd=input('passwd: ').strip()链接conn=pymysql.connect(host='localhost',user='root',password='123',database='egon',charset='utf8')游标cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示。 把返回的结果集改成字典。#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)执行sql语句sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号print(sql)res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目print(res)cursor.close()conn.close()if res: print('登录成功')else: print('登录失败')
execute()之sql注入
注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符
根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'
最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='egon';则--之后的条件被注释掉了#1、sql注入之:用户存在,绕过密码egon' -- 任意字符 ★用户名不存在的情况下依旧有办法登录。如下:#2、sql注入之:用户不存在,绕过用户与密码xxx' or 1=1 -- 任意字符
解决方法:
不要自己对sql进行字符串拼接# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)# print(sql)# res=cursor.execute(sql)#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
增、删、改:conn.commit()
import pymysql#链接conn=pymysql.connect(host='localhost',user='root',password='123',database='exx')#游标cursor=conn.cursor()#执行sql语句#part1# sql='insert into userinfo(name,password) values("root","123456");'# res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数# print(res)#part2# sql='insert into userinfo(name,password) values(%s,%s);'# res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数# print(res)#part3sql='insert into userinfo(name,password) values(%s,%s);'res=cursor.executemany(sql,[("root","123456"),("qzz","12356"),("eee","156")]) #执行sql语句,返回sql影响成功的行数print(res)conn.commit() #提交后才发现表中插入记录成功cursor.close()conn.close()
查:fetchone,fetchmany,fetchall
import pymysql#链接conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')#游标cursor=conn.cursor()#执行sql语句sql='select * from userinfo;'rows=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询# cursor.scroll(3,mode='absolute') # 相对绝对位置移动# cursor.scroll(3,mode='relative') # 相对当前位置移动res1=cursor.fetchone()res2=cursor.fetchone()res3=cursor.fetchone()res4=cursor.fetchmany(2)res5=cursor.fetchall()print(res1)print(res2)print(res3)print(res4)print(res5)print('%s rows in set (0.00 sec)' %rows)conn.commit() #提交后才发现表中插入记录成功cursor.close()conn.close()'''(1, 'root', '123456')(2, 'root', '123456')(3, 'root', '123456')((4, 'root', '123456'), (5, 'root', '123456'))((6, 'root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156'))rows in set (0.00 sec)'''
获取插入的最后一条数据的自增ID
import pymysqlconn=pymysql.connect(host='localhost',user='root',password='123',database='egon')cursor=conn.cursor()sql='insert into userinfo(name,password) values("xxx","123");'rows=cursor.execute(sql)print(cursor.lastrowid) #在插入语句后查看conn.commit()cursor.close()conn.close()