zoukankan      html  css  js  c++  java
  • python习题:操作mysql数据库,传入可变参数,防止sql注入的写法

    def op_mysql(sql,*data, # *data是可变参数的意思
    host=setting.MYSQL_HOST,
    user=setting.MYSQL_USER,
    password=setting.MYSQL_PASSWORD,
    db =setting.MYSQL_DB,
    port = setting.MYSQL_PORT,
    charset = setting.MYSQL_CHARSET):

    conn = pymysql.connect(
    host=host,
    user=user,
    password=password,
    db =db,
    port = port,
    charset = charset)

    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
    '''sql语句:select 不需要commit,但是需要用fetcheall或fetcheone,返回数据
    update,insert,delect等是没有返回结果的,但是需要commit一下,所以需要进行判断'''

    # cur.execute(sql)

    cur.executemany(sql,data)
    '''# 要求传入的参数是一个sql语句,还一个data数组,数组最多为二维数组;
    如果是查询sql的话,调用函数的时候,写成op_mysql(sql,数组)
    其他sql语句,调用的时候写成 op_mysql(sql,*数组)'''

    sql_start =sql[:6].upper()#取sql语句字符串前六位

    if sql_start=='SELECT':
    # res_list = cur.fetchall() # 返回的是一个 list格式的 字典
    # res = json.dumps(res_list,ensure_ascii=False) # 把list转换成json串的方式返回,#所以后面如果要判断res结果用非空即真的话就没发判断了,因为如果返回结果是一个[]的时候,字符串格式的res= '[]' 不是一个空
            res =cur.fetchall() # 返回的是一个 list格式的 字典

    else:
    conn.commit()
    res = 'ok'
    cur.close()
    conn.close()
    return res
    if __name__ == '__main__': # 意思是,别人导入这个python文件的时候,下面的代码不会被执行,一般调试的时候用

    name = 'admin'
    money = 10000
    sql = "select * from user WHERE username = %s AND money = %s;" #注意 %s不要加引号,加了引号,容易被人sql注入
    data = [name, money]
    res = op_mysql(sql, data)
    print(res)
    sql1 = 'insert into seq (blue,red,date) values (%s,%s,%s)'
    all_res = [
    ['16', '01,02,03,05,09,06', '2018-01-28'],
    ['15', '01,02,03,05,09,06', '2018-01-28'],
    ['14', '01,02,03,05,09,06', '2018-01-28'],
    ['13', '01,02,03,05,09,06', '2018-01-28'],
    ['13', '01,02,03,05,09,06', '2018-01-28'],
    ['13', '01,02,03,05,09,06', '2018-01-28'],
    ['13', '01,02,03,05,09,06', '2018-01-28'],
    ['13', '01,02,03,05,09,06', '2018-01-28'],
    ['13', '01,02,03,05,09,06', '2018-01-28'],
    ['13', '01,02,03,05,09,06', '2018-01-28'],
    ['13', '01,02,03,05,09,06', '2018-01-28'],
    ['13', '01,02,03,05,09,06', '2018-01-28'],
    ]
    res = op_mysql(sql1, *all_res) # 如果不加 * 调用函数的时候,因为函数里写的是 *data data本身是一个元组,不加*传进去后,打印出来的data是一个三维的([[]],[[]],[[]])
    # 加了 * 之后是把参数一个个的传进去,所以调用函数的时候,data变成了二维数组
    print(res)
  • 相关阅读:
    POJ 1149 PIGS(Dinic最大流)
    HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)
    [kuangbin带你飞]专题十一 网络流个人题解(L题留坑)
    BZOJ 3931 网络吞吐量(最短路+拆点最大流)
    学习RMQ-ST表
    `这个符号在mysql中的作用
    用一条mysql语句插入多条数据
    Leetcode 257 Binary Tree Paths 二叉树 DFS
    Leetcode 203 Remove Linked List Elements 链表
    Leetcode 38 Count and Say 传说中的递推
  • 原文地址:https://www.cnblogs.com/blackbird0423/p/8370820.html
Copyright © 2011-2022 走看看