import pymysql
# 连接
conn = pymysql.connect(
user='root',
password='',
host='127.0.0.1',
port=3306,
charset='utf8',
database='day36'
)
# 游标
# cursor = conn.cursor()
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 产生一个右游标对象
# cursor=pymysql.cursors.DictCursor 将查询出的结果制作成字典形式返回
sql = 'select * from user_info'
res = cursor.execute(sql) # 执行sql语句,返回sql查询成功的记录数目
# print(res)
# 查
# ret = cursor.fetchone() # 只获取查询结果中的一条数据
# ret = cursor.fetchall() # 获取查询结果的所有数据
# ret = cursor.fetchmany(2) # 指定获取几条数据,如果数字超过总数也不会报错
# print(ret)
print(cursor.fetchone())
print(cursor.fetchone())
# 相对移动
# cursor.scroll(1, 'relative') # 基于指针所在的位置 往后偏移
# 绝对移动
cursor.scroll(3, 'absolute') # 基于起始位置 往后偏移
print(cursor.fetchall())
sql注入问题
'''
利用特殊符号和注释语法,巧妙绕过真正的sql校验
关键性的数据,不要自己手动去拼接,而是交由execute做拼接
'''
# sql注入之:用户存在,绕过密码
若输入lzn' -- 任意字符 会显示用户信息
# sql注入之:用户不存在,绕过用户与密码
若输入xxx' or 1=1 -- 任意字符 会显示所有信息 or后面的1=1条件永远成立
import pymysql
conn = pymysql.connect(
user='root',
password='',
db='day36',
host='127.0.0.1',
port=3306,
charset='utf8'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 获取用户输入的用户名和密码,然后去数据库中校验
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# sql = "select * from user_info where name='%s' and password = '%s'"%(username, password)
# cursor.execute(sql)
sql = "select * from user_info where name=%s and password=%s"
cursor.execute(sql, [username, password])
res = cursor.fetchall()
if res:
print(res)
else:
print('username or password error!')
#解决方法
# sql = "select * from user_info where name='%s' and password='%s'"%(username,password)
# res = cursor.execute(sql)
#改写为(execute帮我们做字符凭借,我们无需切一定不能再为%s加引号,pymysql会自动加上)
# sql = "select * from user_info where name=%s and password=%s"
# res = cursor.excute(sql,[username, password])
数据的增删改
import pymysql
conn = pymysql.connect(
user='root',
password='',
db='day36',
host='127.0.0.1',
port=3306,
charset='utf8',
autocommit = True # 自动提交确认
)
cursor = conn.cursor(cursor=pymysql.cursor.DictCursor)
# 增
sql = "insert into user_info(name, password) values('lll','111')"
# 改
sql = "update user_info set name='zzz' where id = 5"
# 删除
sql = "delete from user_info where id = 1"
res = cursor.execute(sql)
# conn.commit() # 确认当前操作,真正同步到数据库 已设置autocommit
print(res)
'''
针对增、删、改操作,执行重要程度偏高,必须要有一步确认操作(commit)
'''