2019-03-15

1、整理今天所学的知识点

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

1.存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译(效率比较高),用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象(针对SQL编程而言)。

存储过程操作

创建过程

基本语法

Create procedure 过程名字([参数列表])

Begin

过程体

End

结束符

如果过程体中只有一条指令,那么可以省略begin和end


过程基本上也可以完成函数对应的所有功能


查看过程

查看过程与查看函数完全一样:除了关键字

查看全部存储过程:show procedure status [like ‘pattern’];


查看过程创建语句:show create procedure 过程名字;


调用过程

过程:没有返回值,select不可能调用

调用过程有专门的语法:call 过程名([实参列表]);



、删除过程

基本语法:drop procedure 过程名字;


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

2.触发器

触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。

触发器:trigger,是一种非常接近于js中的事件的知识。提前给某张表的所有记录(行)绑定一段代码,如果改行的操作满足条件(触发),这段提前准备好的代码就会自动执行。

作用

1、可在写入数据表前,强制检验或转换数据。(保证数据安全)

2、触发器发生错误时,异动的结果会被撤销。(如果触发器执行错误,那么前面用户已经执行成功的操作也会被撤销:事务安全)

3、部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。

4、可依照特定的情况,替换异动的指令 (INSTEAD OF)。(mysql不支持)

触发器优缺点

优点

1、 触发器可通过数据库中的相关表实现级联更改。(如果某张表的数据改变,可以利用触发器来实现其他表的无痕操作[用户不知道])

2、 保证数据安全:进行安全校验

缺点

1、 对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

2、 造成数据在程序层面不可控。(PHP层)

触发器基本语法

创建触发器

基本语法

Create trigger 触发器名字 触发时机 触发事件 on 表 for each row

Begin

End

触发对象:on 表 for each row,触发器绑定实质是表中的所有行,因此当每一行发生指定的改变的时候,就会触发触发器。

触发时机

触发时机:每张表中对应的行都会有不同的状态,当SQL指令发生的时候,都会令行中数据发生改变,每一行总会有两种状态:数据操作前和操作后

Before:在表中数据发生改变前的状态

After:在表中数据已经发生改变后的状态

触发事件

触发事件:mysql中触发器针对的目标是数据发生改变,对应的操作只有写操作(增删改)

Insert:插入操作

Update:更新操作

Delete:删除操作

注意事项

一张表中,每一个触发时机绑定的触发事件对应的触发器类型只能有一个:一张表中只能有一个对应after insert触发器

因此,一张表中最多的触发器只能有6个:before insert,before update,before delete,after insert,after update,after delete

需求:有两张表,一张是商品表,一张是订单表(保留商品ID),每次订单生成,商品表中对应的库存就应该发生变化。

1、 创建两张表:商品表和订单表


2、 创建触发器:如果订单表发生数据插入,对应的商品就应该减少库存

Create trigger 名字  after insert on my_orders for each row


查看触发器

1、 查看全部触发器

Show triggers;


2、 查看触发器的创建语句

Show create trigger 触发器名字;


触发触发器

想办法让触发器执行:让触发器指定的表中,对应的时机发生对应的操作即可。

1、 表为my_orders

2、 在插入之后

3、 插入操作


删除触发器

基本语法:drop trigger 触发器名字;


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

3.uwsig的安装与使用

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

2、独立再次实现 第7天的作业 小型超市系统,包括各种验证,比如添加商品信息非空验证,日期验证等等

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

import pymysql

import hashlib

from datetime import datetime

from MysqlHelper import MysqlHelper

helper = MysqlHelper(host='192.168.0.138', user='root', password='root', database='mydb')

def login():

        while True:

            name = input('请输入用户名')

            ret = judge_name(name)

            if ret == 1:

                print('用户名不能为空,请重新输入。')

            elif ret == 0:

                print('用户名不存在,请重新输入。')

            else:

                break

        while True:

            pwd = input('请输入密码')

            ret = judge_pwd(pwd)

            if ret == 1:

                print('密码不能为空,请重新输入。')

            elif ret == 2:

                print('密码长度必须是6到16位')

            else:

                break

        ret = helper.select_one('select count(*) from s_user where name = %s and pwd=%s', [name,encryption(pwd)])

        print(ret)

        if ret[0]== 0:

            print('登录失败')

        else:

            print('登录成功')

            return True

def register():

    while True:

        name = input('姓名:')

        ret = judge_name(name)

        if ret == 1:

            print('用户名不能为空,请重新输入。')

        elif ret == 2:

            print('用户名已存在,请重新输入。')

        else:

            break

    while True:

        pwd = input('密码:')

        ret = judge_pwd(pwd)

        if ret == 1:

            print('密码不能为空,请重新输入。')

        elif ret == 2:

            print('密码长度必须是6到16位')

        else:break

    ret = helper.insert('insert into s_user(name,pwd) values(%s,%s)',[name,encryption(pwd)])

    if ret!=0:

        print('注册成功')

    else:

        print('注册失败')

def judge_name(name):

    if name.strip() == '':

        return 1

    # 1、获取数据库连接对象

    ret = helper.select_one('select count(*) from s_user where name = %s',[name])

    # 7、判断

    if ret[0] == 0:

        return 0

    else:

        return 2

def judge_name_merc(name):

    if name.strip() == '':

        return 1

    # 1、获取数据库连接对象

    ret = helper.select_one('select count(*) from merc where name = %s',[name])

    # 7、判断

    if ret[0] == 0:

        return 0

    else:

        return 2

def encryption(pwd):

    my_md5 = hashlib.md5()

    my_md5.update(pwd.encode('utf-8'))

    ret = my_md5.hexdigest()

    return ret

def judge_pwd(pwd):

    if pwd.strip() == '':

        return 1

    elif len(pwd.strip())<6 or len(pwd.strip())>10:

        return 2

    else:

        return 0

def judge_date(stock_date):

    if stock_date.strip() == '':

        return 1

    # 判断格式

    try:

        datetime.strptime(stock_date,"%Y-%m-%d")

    except ValueError:

        return 2

    else:

        return 0

def insert():

    while True:

        name = input('请输入你要添加的商品名称')

        ret = judge_name_merc(name)

        if ret == 1:

            print('用商品名不能为空,请重新输入。')

        elif ret == 2:

            print('商品名已存在,请重新输入。')

        else:

            break

    price = input('请输入你要添加的商品价格')

    number = input('请输入你要添加的商品数量')

    while True:

        stock_date = input('请输入你要添加的商品进货日期')

        ret = judge_date(stock_date)

        if ret == 1:

            print('日期不能为空,请重新输入。')

        elif ret == 2:

            print('日期格式不正确,必须是yyyy-mm-dd。')

        else:

            break

    helper.insert('insert into merc(name,price,number,stock_date) values(%s,%s,%s,%s)', [name,price,number,stock_date])

    print('添加成功')

def select_all_goods():

    ret = helper.select_all('select * from merc')

    for row in ret:

        print(row)

def select_name_goods_like():

    name = input('请输入商品的名字')

    name = '%'+name+'%'

    row = helper.select_one('select * from merc where name like %s',[name])

    if not row:

        print('无此商品')

def  select_price_goods():

    low = input('请输入最低价')

    high = input('请输入最高价')

    row = helper.select_all('select * from merc where price between %s and %s', [low,high])

    for ret in row:

        print(ret)

    if not row:

        print('无该商品')

def update_goods():

    old_name = input('请输入要修改的商品名')

    goods = select_goods_by_name(old_name)

    if goods:

        name = input('请输入新的商品名称')

        price = input('请输入新的商品价格')

        number = input('请输入新的商品数量')

        stock_date = input('请输入新的商品进货日期')

        ret = helper.update('update merc set name=%s,price=%s,number=%s,stock_date=%s where name = %s',

                            [name,price,number,stock_date,old_name])

        if ret !=0:

            print('添加成功')

        else:

            print('添加失败')

    else:

        print('无该商品')

def select_goods_by_name(name):

    row = helper.select_one('select * from merc where name = %s',[name])

    return row

def delete_goods():

    name = input('请输入要删除的商品名称')

    goods = select_goods_by_name(name)

    if goods:

        ret = helper.update('delete from merc where name = %s',

                            [name])

        if ret != 0:

            print('删除成功')

        else:

            print('删除失败')

    else:

        print('无该商品')

def main():

    while True:

        choice = input('请输入你的数字:1登录,2注册,3退出')

        if choice =='1':

            if login():

                show()

        elif choice =='2':

            register()

        elif choice == '3':

            break

        else:

            print('输入错误,请重新输入')

def show():

    while True:

        res = input('请输入你要执行的操作1:添加商品2:查询所有商品3:根据商品名模糊查询4:根据商品价格区间模糊查询5:修改商品6:删除商品7:退出')

        if res == '1':

            insert()

        elif res == '2':

            select_all_goods()

        elif res =='3':

            select_name_goods_like()

        elif res == '4':

            select_price_goods()

        elif res == '5':

            update_goods()

        elif res == '6':

            delete_goods()

        elif res == '7':

            break

if __name__ == '__main__':

    main()

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

3、使用TCP协议实现网络编程

4、写出HTTP常见的请求头的含义



5、写出HTTP常见的响应头的含义

Location:这个头配合302状态码使用,告诉用户端找谁。

Server:服务器通过这个头,告诉浏览器服务器的类型

Content-Encoding:服务器通过这个头,告诉浏览器数据采用的压缩格式。

Content-Length:服务器通过这个头,告诉浏览器回送数据的长度。

Content-Language:服务器通过这个头,告诉服务器的语言环境。

Content-Type:服务器通过这个头,回送数据的类型

Last-Modified:服务器通过这个头,告诉浏览器当前资源的缓存时间。

Refresh:服务器通过这个头,告诉浏览器隔多长时间刷新一次。

Content-Disposition:服务器通过这个头,告诉浏览器以下载的方式打开数据。

Transfer-Encoding:服务器通过这个头,告诉浏览器数据的传送格式。

ETag:与缓存相关的头。

Expires:服务器通过这个头,告诉浏览器把回送的数据缓存多长时间。-1或0不缓存。

Cache-Control和Pragma:服务器通过这个头,也可以控制浏览器不缓存数据。

Connection:服务器通过这个头,响应完是保持链接还是关闭链接。

Date:告诉客户机,返回响应的时间。

6、写出HTTP常见的响应码的含义

HTTP响应状态码有很多,但是实际经常使用的大概只有14个。

2XX Success

200 OK 表示从客户端发来的请求在服务器端被正常处理了。

204 No Content 该状态码表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新。

206 Partial Content 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求。

3XX Redirection

301 Moved Permanently 永久性重定向。该状态码表示请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。 像下方给出的请求URI,当指定的资源路径的最后忘记添加斜杠"/",就会产生301状态码

http://example.com/sample

302 Found 临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。

303 See Other 该状态码表示由于请求对应的资源存在另外一个URI,应使用GET方法定向获取请求的资源。 303状态码和302状态码有着相同的功能,但303状态码明确表明客户端应当采用GET方法获取资源。 当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文的主体,之后请求会自动再次发送。 301,302标准是禁止将POST方法改变成GET方法的,但实际上使用时大家都会这么做。

304 Not Modified 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。

307 Temporary Redirect 临时重定向。该状态码与302 Found有着相同的含义。307会遵照浏览器标准,不会从POST变成GET。

4XX Client Error

400 Bad Request 该状态码表示请求报文中存在语法错误。当错误发生时,需要修改请求的内容后再次放松请求。

401 Unauthorized 该状态码表示发送的请求需要有通过HTTP认证的认证信息,另外若之前已进行过1此请求,则表示用户认证失败。

403 Forbidden 该状态码表明对请求资源的访问被服务器拒绝了。

404 Not Found 该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

5XX Server Error

500 Internal Server Error 该状态码表明服务器端在执行请求时发生了错误。

503 Service Unavailable 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

写在最后

状态码可能和实际发生的状况不一致。比如Web应用程序内部发生了错误,状态码依然返回200 OK。

你可能感兴趣的:(2019-03-15)