pymysql模块

一 安装

         pip3 install pymysql

二 操作(连接,游标,执行,注入的bug)       

import pymysql

# 先要创建用户
# grant all on *.* to "root"@"localhost" identified by "123"; #  创建账户加授权
# flush privileges;  # 刷新

user = input("Username:").strip()
password = input("Password:").strip()

# 建立链接
conn = pymysql.connect(
    host="localhost",
    user="root",
    password="123",
    database="user",
    charset="utf8"
)

# 游标
cursor = conn.cursor()  # 以元组显示结果
# cursor = conn.cursor(pymysql.cursor.DictCursor)  # 以字典形式显示

# 执行
sql = 'select * from userinfo where name="%s" and password="%s"' % (user, password)  # 注意%s需要加引号
print(sql)
res = cursor.execute(sql)  # 执行sql语句,返回sql查询成功的记录数目
print(res)
cursor.close()  # 关闭游标
conn.close()  # 关闭链接

  Note:在注入execute来执行时存在bug。

       根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'          # -- 在mysql表示注释,后面的不会被执行。

#1、sql注入之:用户存在,绕过密码
egon' -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符

解决方法:

       不再自己拼接字符串,让pymysql的内置模块来实现。

sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

 三 增,删,改

sql='insert into userinfo(name,password) values("root","123456");'
res=cursor.execute(sql)
print(res)

sql = 'insert into userinfo(name,password) values(%s,%s);'
res = cursor.execute(sql, ("root", "123456"))
print(res)

sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")])  # 可插入多条记录
print(res)

conn.commit()  # 提交后才发现表中插入记录成功

四 查
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)

五 关于自增id的查看

sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
print(cursor.lastrowid) #在插入语句后查看

 查看的是插入或删除前的最近id号。

你可能感兴趣的:(mysql)