Pymysql模块的安装与使用&sql注入问题

一.下载

终端输入指令:pip3 install pymysql
在这里插入图片描述

二.开始使用

1.py文件中导入该模块

import pymysql

2.连接数据库服务器

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db8', charset='utf8')

# 参数解读:
# host: 服务器地址;
# port: 服务器端口号, 这里注意要是 int;
# user: 登录用户;
# password: 用户密码;
# db: 要连接的库的名字;
# charset: 编码格式;

3.创建游标对象(用来执行命令)

cursor = conn.cursor()

4.执行sql语句

sql = "select * from userinfo where username='%s' and pwd='%s'" %(user, pwd) # 自己拼接时,%s一定要引起来.
result=cursor.execute(sql)
print(result)  # 这里打印的是数据的个数,一般不需要.

# 注意: 这里会产生sql 注入的问题, 后面会写, 要着重注意这一点

4.1一次插入多个数据使用executemany

sql = 'insert into user_info(name, password) values(%s, %s)'
rows = cursor.executemany(sql, [('xxx', 123), ('000', 1233), ('yyy', 12345)])

4.2对目标表进行增、删、改操作涉及到对数据库的修改,必须进行二次确认

commit()方法:在数据库里增、删、改的时候必须要进行提交,否则插入的数据不生效。

  • 无论是哪个操作一定要进行conn.commit(),不然数据会丢失。
  • 或者在连接数据库时,加一个参数autocommit = True就可省略commit()
import pymysql

username = input('请输入用户名:')
pwd = input('请输入密码:')

conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8')
cursor = conn.cursor()


# 增:

# 插入一条数据:
# sql = "insert into userinfo(username,pwd) values (%s,%s)"
# effect_row = cursor.execute(sql,(username,pwd))

# 同时插入多条数据:
# cursor.executemany(sql,[('李四','110'),('王五','119')]) 


# 改:

# sql = "update userinfo set username = %s  where id = 2"
# effect_row = cursor.execute(sql,username)


# 删:

# sql = "delete from userinfo  where id = 2"
# effect_row = cursor.execute(sql)

#一定记得commit
conn.commit()

# 4.关闭游标
cursor.close()

# 5.关闭连接
conn.close()

5.关闭游标,断开连接。

cursor.close()
conn.close()

6.获取查询数据

  • 获取命令执行的查询结果
print(cursor.fetchone())  # 获取第一条数据
print(cursor.fetchall())  # 获取所有数据
print(cursor.fetchmany(n))  # 指定拿n条数据
# 读取数据类似文件光标的移动,取完一条数据下一个命令从下一个数据开始取
  • 相对移动:相对于光标所在位置向后移动n条数据
cursor.scroll(n, 'relative')
  • 绝对移动:从文件起始位置向后移动n条数据
cursor.scroll(n, 'absolute')

三.sql注入问题

1.sql注入介绍

      利用一些语法的特性,书写一些特定的语句实现固定的语法。
日常生活中很多软件注册时都不能含有特殊符号,因为怕你构造出特定的语句入侵数据库,不安全。
Mysql中利用的是Mysql的注释语法

  1. 假设用户不知道密码,用户输入jason’ - - jhsadk…
select * from user where name = 'jason' -- jhsadk... and password='';
# -- 后面被注释了
  1. 用户用户名和密码都不知道,用户输入 xxx’ or 1=1 - - jhsadk…
select * from user where name = 'xxx' or 1 = 1 -- jhsadk... and password='';
# 1 = 1 永真

2.sql注入解决方式

先用%s占位,之后将需要拼接的数据直接交给execute方法即可。

sql = "select * from user where name=%s and password=%s;"
# execute会自动识别sql中的%s,然后用元组替换
rews = cursor.execute(sql, (username, password))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Solost23

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值