一.安装pymysql以及操作数据库模板

pymysql是Python中操作mysql的模块,(使用方法几乎和MySQLdb相同,但是在Python3中,mysqldb这个库已经不能继续使用了)

安装:

方法1:在cmd中输入下面的命令即可:

pip3 install pymysql

方法2:在pycharm集成开发环境中进行安装模块(比较简单就不再说明了)

使用步骤:

连接数据库—>创建游标—>执行SQL—>fetch获得数据,进行业务处理—>关闭游标—>commit—>关闭数据库连接

二.基本使用

import pymysql
user=input('用户名: ').strip()
pwd=input('密码: ').strip()

#链接
conn=pymysql.connect(host='localhost',user='root',password='****',database='db2',charset='utf8')       #与数据库的服务端建立连接,databases是我们要查询的表所在的数据库
#游标
cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
#配置结果集为字典形式
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)

#执行sql语句
sql='select * from user where username="%s" and password="%s"' %(user,pwd) #注意%s需要加引号,就是一条基本的sql语句,事先要在user表中插入数据,这样查询才会有结果
print(sql)
res=cursor.execute(sql) #执行sql语句,返回sql查询成功的记录数目,我只在表中插入一条记录,查询成功最多所以也就一条记录数
print(res)

cursor.close()
conn.close()
if res:
    print('登录成功')
else:
    print('登录失败')
这里为了我们以后更方便的使用我们可以对其进行封装:

我们先将登陆参数写到json文件中:

{"host":"127.0.0.1","user":"root","password":"*****","database":"test","port":3306,"charset":"utf8"}

再直接调用:

import json
import pymysql

class BaseDao():
    def __init__(self,configfile="mysql.json"):
        self.config=json.load(open(configfile))
        self.connection = None
        self.cursor = None
        pass
    def getConnection(self):
        if self.connection!=None:
            return self.connection
        try:
            self.connection=pymysql.connect(**self.config)
        except Exception as e:
            print(e)
            print("数据库连接失败,请检查配置参数")
        print("数据库连接成功")
        return  self.connection
    def execute(self,sql,params=None):
        result = 0
        try:
            self.cursor = self.getConnection().cursor()
            if params:
                result = self.cursor.execute(sql,params)
                pass
            else:
                result = self.cursor.execute(sql)
        except Exception as e:
            pass
        return result
        pass

    def fetch(self):
        if self.cursor:
            return self.cursor.fetchall()
            pass
        pass

    def commit(self):
        if self.connection:
            self.connection.commit()
        pass

    def rollback(self):
        if self.connection:
            self.connection.rollback()
        pass

    def close(self):
        if self.connection:
            self.connection.close()
            pass
        pass
    pass

当我们要使用时直接继承就可以了。下面举个例子:

from (封装文件名) import BaseDao

class BookDao(BaseDao):

    def createBook(self, params=[]):
        sql = "select * from (表名)"
        result = self.execute(sql, params)
        return result
        pass

当我们使用时直接修改sql语句即可,这样就不用每次都重复编写使用步骤。

三.sql注入问题

首先明确一点:–是sql语句的注释,他会注释掉–sql后面的语句,语法为:–sql语句
根本原理:就根据程序的字符串的拼接,user=’%s’,我们输入一个xxx’ – haha,用我们输入的xxx加’在程序中拼接成一个判断条件name=‘xxx’ – haha’
from testtwo import BaseDao

class UserDao(BaseDao):

    def login(self, userName, userPwd):
        # 直接拼接SQL语句,会导致SQL注入
        sql = "select * from t_user where username='" + userName + "' and userpwd='" + userPwd + "'"
        print(sql)
        self.execute(sql)
        resultSet = self.fetch()
        return resultSet
        pass
1、sql注入之:用户名存在,绕过密码
xingxing' -- 任意字符

2、sql注入之:用户不存在,绕过用户名与密码
xxx' or 1=1 -- 任意字符
解决方法:
# 参数化
    def loginParams(self, params=[]):
        sql = "select * from t_user where username=%s and userpwd=%s" # %s是占位符
        self.execute(sql, params)
        resultSet = self.fetch()
        return resultSet
        pass