如何防止?构建参数
新增功能5:根据商品名字查询商品信息
这里如果不使用 防止sql 注入,就会有可能被用户查询出所有的商品信息,这里我们使用构建参数(防sql注入)来实现这一功能
from pymysql import connect
class JD(object):
def __init__(self):
# 创建连接
self.conn = connect(host='localhost', port=3306, user='root', database='jingdong', charset='utf8')
# 获得cursor 对象
self.cursor = self.conn.cursor()
def __del__(self):
# 关闭cursor 对象
self.cursor.close()
self.conn.close()
def execute_sql(self, sql):
self.cursor.execute(sql)
for temp in self.cursor.fetchall():
print(temp)
def show_all_goods(self):
'''显示所有的商品'''
sql = 'select * from goods'
self.execute_sql(sql)
def show_good_cates(self):
'''显示所有商品分类'''
sql = 'select name from good_cates'
self.execute_sql(sql)
def show_brand_cates(self):
'''显示所有商品品牌分类'''
sql = 'select name from goods_brands'
self.execute_sql(sql)
def add_brand(self):
'''增加商品品牌'''
new_brand = input('请输入新的品牌名字:')
sql = '''insert into goods_brands (name) values('%s')'''% new_brand #引号里面嵌套引号的时候,可以用这种形式区分开
self.cursor.execute(sql)
self.conn.commit()
def get_info_by_name(self):
find_name = input('请输入想要查询的商品名字:')
# sql = 'select * from goods where name = %s' % find_name 这是我们平常的写法
# 防止sql注入
sql = 'select * from goods where name=%s'
self.cursor.execute(sql,[find_name])
print(self.cursor.fetchall())
@staticmethod
def show_menus():
print('------京东商城------')
print('1: 查询所有商品')
print('2: 查询所有商品分类')
print('3: 查询所有的商品品牌分类')
print('4: 添加一个商品分类')
print('5: 根据名字查询商品信息')
return input('请输入您所要执行的功能对应的序号:')
def run(self):
while True:
num = self.show_menus()
if num == '1':
self.show_all_goods()
elif num == '2':
self.show_good_cates()
elif num == '3':
self.show_brand_cates()
elif num == '4':
self.add_brand()
elif num == '5':
self.get_info_by_name()
else:
print('输入有误,请重新输入:')
def main():
# 创建一个京东对象
jd = JD()
# 调用这个对象的run方法,让其运行
jd.run()
if __name__ == '__main__':
main()