pymysql模块
一 链接、执行sql、关闭
import pymysql
user = input('please input your account:')
pwd = input('please input your password:')
# 链接
conn = pymysql.connect(host='127.0.0.1', user='root', password='wanjiang', database='db10')
#游标
cursor = conn.cursor() # 执行完毕返回的结果集默认以元组显示
# 执行sql语句
sql = 'select * from useinfo where account="%s" and pwd="%s"' % (user, pwd)
print(sql)
res = cursor.execute(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='127.0.0.1', user='root', password='wanjiang', database='db10')
cursor = conn.cursor()
# 执行sql语句
#part1
sql = 'insert into useinfo values("egon","123");'
res = cursor.execute(sql)
print(res)
conn.commit() # 提交才能成功插入记录
cursor.close()
conn.close()
# part2
sql = 'insert into useinfo value (%s,%s);'
res = cursor.execute(sql, ('root', '456'))
# 执行sql语句,返回sql影响成功的行数
print(res)
conn.commit()
cursor.close()
conn.close()
# part3
sql = 'insert into useinfo values(%s,%s);'
res = cursor.executemany(sql, [('lxw', '890'), ('tank', '333'), ('justin', '2222')])
print(res)
conn.commit()
cursor.close()
conn.close()
四 查:fetchone,fetchmany,fetchall
import pymysql
conn = pymysql.connect(host='127.0.0.1', user='root', password='wanjiang', database='db10')
cursor = conn.cursor()
# 执行sql语句
sql = 'select * from useinfo;'
rows = cursor.execute(sql)
print(rows)
cursor.scroll(3, mode='absolute')
# 游标移到第三行开始读(读不到第三行)
cursor.scroll(1, mode='relative')
# 相对当前位置移动一行(照着上面来则是从第四行开始读,读不到第四行)
res1 = cursor.fetchone()
res2 = cursor.fetchone()
res3 = cursor.fetchone()
res4 = cursor.fetchmany(2)
res5 = cursor.fetchall()
#cursor可当做一个迭代器,当数据取不到后则返回空
print(res1)
print(res2)
print(res3)
print(res4)
print(res5)
conn.commit()
cursor.close()
conn.close()