pymysql模块
安装
pip install pymysql
一 链接、执行,关闭(游标)
import pymysql
# 链接
conn = pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
password='123123',
db='day36',
charset='utf8',)
# 游标
# cursor = conn.cursor() #执行完毕返回的结果默认以元组显示
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# cursor=pymysql.cursors.DictCursor 将查询出来的结果制作成字典的形式返回
# 执行sql语句
sql = "select * from teacher"
res = cursor.execute(sql) # 执行sql语句,返回sql查询成功的记录数目
# print(cursor.fetchone()) # 只获取查询结果中的一条数据
# print(cursor.fetchmany(2)) #指定获取几条数据,如果数字超了也不会报错
# print(cursor.fetchall()) #获取查询结果的所有数据
#相对移动
# cursor.scroll(2,'relative') #基于指针所在的位置,往后偏移
# print(cursor.fetchall())
#绝对移动
cursor.scroll(1,'absolute')
print(cursor.fetchall())
cursor.close()
conn.close()
二 excute() 注入
SQL注入是一种注入攻击,可以执行恶意SQL语句
注意:符号 --
会注释掉它之后的sql,正确的语法: --
后至少有一个任意字符
根本原理:就根据程序的字符串拼接 name = '%s',我么输入一个xxx - - haha,用我们输入的xxx加'在程序中拼接成一个判断条件name = 'xxx' - -haha
1、sql注入之:用户存在,绕过密码
leti' -– 任意字符2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -– 任意字符
import pymysql
# 链接
conn = pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
password='123123',
db='day36',
charset='utf8',)
# 游标
# cursor = conn.cursor() #执行完毕返回的结果默认以元组显示
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# cursor=pymysql.cursors.DictCursor 将查询出来的结果制作成字典的形式返回
username = input("username>>>:").strip()
password = input("password>>>:").strip()
# 执行sql语句
sql = "select * from userinfo where name='%s' and password='%s'"%(username,password)
print(sql)
# cursor.execute(sql,(username,password))
cursor.execute(sql,)
res = cursor.fetchall()
if res:
print(res)
else:
print('username or password error!')
cursor.close()
conn.close()
解决方法:
# 原来是我们对sql进行字符串拼接
# sql = "select * from userinfo where name='%s' and password='%s'"(username,password)
# print(sql)
# res=cursor.execute(sql)
#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql = "select * from userinfo where name=%s and password='%s" #
!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
cursor.execute(sql,(username,password)) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。
三 增、删、改:conn.commit()
autocommit = True #自动提交
# 链接
conn = pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
password='123123',
db='day36',
charset='utf8',
autocommit=True)
#增
sql = "insert into userinfo(name,password) values('so','123456');"
res = cursor.execute(sql)
#删
sql = 'delete from userinfo where name="so"'
res = cursor.execute(sql)
#改
sql = 'update userinfo set name="666" where password="123456"'
res = cursor.execute(sql)
针对增 删 改操作 执行重要程度偏高
conn.commit()