php语法记录4
十三、PHP连接MySQL数据库
1. 七剑下天山
-
第一剑:连接数据库
- mysqli_connect() 连接并且选择数据库
- 参数1:连接数据库的地址
- 参数2:数据库的用户名
- 参数3:数据库的密码
- 参数4:可选参数 要操作ode默认数据库
- 返回值:成功返回数据库对象,失败返回false
- mysqli_connect() 连接并且选择数据库
-
第二剑:选择数据库
- mysqli_select_db() 选择数据库
- 参数1:由mysqli_connect连接数据库成功返回的对象标识
- 参数2:要操作后者要更改的数据库
- 返回值:成功返回true,失败返回false
- mysqli_select_db() 选择数据库
-
第三剑:设置字符集
- mysqli_set_charset() 设置字符集
- 参数1:由mysqli_connect连接数据库成功返回的对象标识
- 参数2:要设置的字符集
- 返回值:成功返回true,失败返回false
- mysqli_set_charset() 设置字符集
-
第四剑:准备操作的SQL语句 (INSERT、SELECT、UPDATE、DELETE)
-
第五剑:发送SQL语句
- mysqli_query()发送一条sql语句
- 参数1:由mysqli_connect连接数据库成功返回的对象标识;
- 参数2:要发送的sql语句
- 返回值:
- 做添加、删除、修改操作时,成功返回true,失败返回false
- 做查询操作时,成功返回一个结果集对象,失败返回false;
-
第六剑:需要判断并且处理结果
-
mysqli_affected_rows() 返回上一步mysql操作的影响行(增、删、改)
-
参数:(由mysqli_connect连接数据库成功返回的对象标识)
-
返回值:如果有影响行则返回影响行,如果没有返回0,操作错误返回-1
-
mysqli_num_rows() 返回查询结果集对象中的行数
-
参数1:由mysqli_query()执行查询语句成功返回的结果集对象。
-
返回值:返回该对象中查询到数据的供述
-
mysqli_fetch_assoc() 从查询成功反回的结果集对象中获取一行作为关联数组返回。
- 参数:由mysqli_query()执行查询语句成功返回的结果集对象。
- 返回值:从该对象中获取一行数据以关联数组的方式返回。
-
-
第七剑:万剑归宗,关闭数据库
- mysqli_close() 关闭数据库
- 参数:(由mysqli_connect连接数据库成功返回的对象标识)
- mysqli_close() 关闭数据库
-
mysqli_insert_id() 返回上一步添加操作所参数的唯一id
- 参数:(由mysqli_connect连接数据库成功返回的对象标识)
- 返回值:返回当前插入数据的ID;
十四、面向对象
1. 类和对象的声明及作用
1. 面向对象和面向过程的区别
- 认识面向对象
Xue Xi Object Oritened 面向对象 XXOO - 学习面向对象的主要内容
- 面向对象的语法学习(相对简单)
- 面向对象的编程思想的学习(稍微难一点)
- 面向过程(单身)
- 自己去做饭(调用自己做饭的功能)
- 自己去到水喝 (调用自己倒水的功能)
- 自己去洗衣服 (调用自己洗衣服的功能)
- 面向对象(有对象)
- 自己想吃饭,找媳妇做饭吃 (调用了媳妇的做饭功能)
- 自己想喝水,找媳妇倒水喝(调用了媳妇的倒水功能)
- 自己想洗衣服,找媳妇洗衣服 (调用了媳妇洗衣服的功能)
2. 了解几个跟面向对象相关的单词
oo--面向对象 object Oritened
OOA -- (Object Oritened Analysis) 面向对象的分析方法
OOD -- (Object Oritened Design) 面向对象的设计方法
OOI -- (Object Oritened implementation) 面向对象的实现方法
OOP -- (Object Oritened Programming)面向对象的程序设计 (OOA->OOD->OOI)
2. 面向对象中重要的2个概念
-
类
男人就是类
女人也是类
人也是类
概念手机- 所有描述事物的概念都是类
追女孩子也是一个类 (追女孩子有一个过程)
做蛋糕也是一个类 (做蛋糕的过程)
连接数据库也是一个类 (连接数据库的过程) - 所有事物的操作流程也是一个类
- 类是一种思想上得或者未实现的东西
- 所有描述事物的概念都是类
-
对象:
这个空调 (一个对象)
这个手机 (一个对象)
高洛峰老师这个男人 (一个对象)
某一个手机 (一个对象)- 所有事物的实体表现就是对象,不仅仅是概念上。
追了唐嫣这个妹子的过程 (一个对象)
做了一个巧克力蛋糕的过程 (一个对象)
连接了一次数据库 (一个对象)- 所有事物操作流程的实施过程就是一个对象
3. 类和对象的关系
-
类是对象的妈妈
- 对象是由类产生的一个实际的事物或者操作流程,这个过程叫做实例化。做出一个实际存在的例子或物体的过程
- 类是由多个对象的抽象或者说想象总结而得来的,这个抽象的总结的过程叫做抽象化。把实际的特征抽出来总结到一起,形参一个概念,就是抽象化。
- 把实际的特征抽出来总结到一起,形成一个概念,就是抽象化。而把概念付出实际做出来就是实例化
-
类和对象的组成成分
女朋友:- 特征:
身高
长相
年龄 - 功能:
会做饭
会洗衣服
会管钱
会学习 - 一种是用于对特征的描述 —- 成员属性
- 另一种是对其功能的描述 —- 成员方法
- 特征:
4. 类的声明
- 类文件的书写规则
- 函数的文件名xxx.func.php
- 类的文件名 xxx.class.php
- 类得驼峰命名法是每一个单词的首字母大写,那么就意味着类文件名的首字母也要大写
- 类的书写规则
- 类必须以class关键字开始,class关键字之后跟类名,类名通常和文件名相同。
- 类名之后直接跟{}即可。
- 成员属性的书写规则:
- 声明成员属性时必须使用关键字var或者public private等。
- 声明成员属性时,可以赋值也可以不赋值。
- 声明成员属性时,不能赋一个函数值。
- 了解:成员属性的最大作用就是为成员方法提供一个桥梁的作用。
- 成员方法的书写规则:
- 声明成员方法时,需要使用function关键字。
- 声明成员方法可以传入参数也可以不传入参数。
- 声明成员方法时,方法允许存在返回值。
- 记住:类中只能出现成员属性和成员方法,不允许出现其他的代码,否则会有语法错误。
5. 对象的生成和使用方法
-
对象的生成和使用方法
- 一般情况下,类是无法直接使用的,需要将类实例化对象之后才可以使用。
- 实例化对象的方法
- 格式1?:
对象变量 = new 类名; - 格式2:
对象变量 = new 类名();
- 格式1?:
-
使用对象中的成员属性
- 对象变量->成员属性名
-
使用对象中的成员方法
- 对象变量->成员方法名()
-
$this关键字
- 作用:在当前对象的成员方法中,调用当前对象中的成员属性。
- $this 表示当前的对象
- 如果代码中具有$this的出现,那么该类必须实例化才能使用。
2. 面向对象的魔术方法及特性
1. 构造方法及析构方法
-
魔术方法:
- 一种特殊的函数
- 构造方法:
- –construct()
- 触发时机:在对象实例化的时候自动触发
- 作用:初始化成员属性
- 参数:可以有,可以没有,取决于设定和逻辑
- 返回值:没有
- 注意:如果构造方法具有参数,且参数没有默认值,在实例化对象时,必须在类名后面的括号内添加实参
- 析构方法:
- –destruct()
- 触发时机:在销毁对象的时候自动触发(unset() 或者 页面执行完毕)
- 作用:回收对象使用过程中的资源
- 参数:没有
- 返回值:没有
- 面向对象的三大特征:
- 封装
- 继承
- 多态 是一种思想
2. 面向对象的封装特性
-
封装特性:在一个对象产生之后,对象的部分成员属性和成员方法逻辑上是不允许在对象外部调用或者使用的。着就是封装特性的由来
-
封装关键字:private 私有的
-
private的特征:
- 被private修饰的成员属性不能够在类的外部进行访问,可以在类的内部访问。
- 被private修饰的成员方法也不能够在类的外部进行访问, 可以在类的内部进行访问
- var和private只能选取一个(public 和 protected)
-
- 魔术方法 __get()
- 触发时机:访问私有成员属性的时候自动触发
- 功能:1.防止报错,2.为私有成员属性访问提供后门
- 参数:1个..访问的私有成员属性名称
- 返回值: 可以有,可以没有。
-
- 魔术方法 __set()
- 触发时机:对私有成员属性进行设置值得时候自动触发
- 功能:1.屏蔽错误,2.为私有成员属性设置值
- 参数:2个。1个私有成员属性名。2个要设置的新值。
- 返回值:无
-
- 魔术方法 __isset()
- 触发时机:对私有成员属性进行isset检查时自动触发
- 功能:代替对象外部的isset函数检查,返回结果
- 参数:1个,私有成员属性名
- 返回值:一般返回isset()检查的结果
-
- 魔术方法:__unset()
- 触发时机:在对象外部对私有成员属性进行unset操作时自动触发。
- 功能:代替对象外部的unset操作
- 参数:1个 私有成员属性名
- 返回值:无
-
3. 面向对象的继承特性
- 继承特性:
- 继承的格式:
clas 类名 extends 父类名{
– 书写子类独有的方法和书写
} - 概念:
父类: 被其它类继承的就是父类,也叫作基类。
子类: 继承其他类的类就是子类,也叫作派生类。
list-style – list-style-image list-style-position list-style-type - 特点:
- 子类继承父类既具备父类中所有的成员属性和方法(私有的除外)
- 子类继承父类之后可以具有子类独有的属性和方法
- 在继承时,子类中允许出现和父类同名的方法,这种情况不会冲突,而是子类的方法会覆盖父类的方法,这种方式叫做重载(从新加载)
- 魔术方法也可以被子类继承
- 如果父类具有构造方法,子类也需要构造方法进行构造成员属性,此时需要在子类中重载父类的构造方法,并且在构造方法中使用parent::__construct()进行调用父类的构造方法,构造继承而来的父类的成员属性。
也可以使用类名::__construct()来调用父类的构造方法,不推荐使用。 - 继承代码的时候不要瞎继承,人类不要继承鸟类,不会变成鸟人。要有一定的逻辑关系。
- php继承的特点和其他语言略有不同
- php是单继承的语言
- 其他语言可能是多继承
- 单鸡场的主要关系在 生物学逻辑
- 多继承的主要关系在 社会学逻辑 一个徒弟有多个师傅
- 继承的格式:
4. 访问类型控制
- 三个封装关键字
- private 私有化封装
- public 公共的封装
- protected 受保护的封装
- 子类同名的方法的封装登记必须大于或者等于父类的封装等级
- private = 1
- protected = 2
- public = 3
- var是封装关键字,但是它不是一个标准的封装关键字。一般仅用于测试和学习。
- var = 50%public
- 原因:var只能修饰成员属性了,不能修饰成员方法。
5. 常见的关键字
- final 关键字 英文的意思 最终的 最后的
- 作用:
- 用来修饰成员方法,禁止在子类中重载父类的方法。
- 用来修饰类,被final修饰的类无法被继承。
- const 关键字
- 作用:
- 用于在类中声明常亮,这种常亮是类中的常量。、
- 在类中声明常量使用CONST关键字
- 声明常量时需要给常亮赋值
- 声明常量归类所有而不是归对象所有
- 类中常亮的访问方式
- 类外部
- 类名::常量名
- 类内部
- 类名::常量名
- self::常量名
- 类外部
- 需要记住的是:
- self 表示当前类
- $this 当前的对象
- static 关键字
- 在类中使用static声明的成员都是静态成员
- 静态成员的特征是:不归对象所有,而是归类所有
- static关键字,既可以修饰成员属性,也可以修饰成员方法。
- static声明的成员都是归类所有,而不是归对象所有,在没有对象的情况下,可以通过类来访问。
- 能声明静态的成员就声明静态的成员。效率高。
- 具有动态成员的方法不可以声明静态成员方法。
- 如果方法中没有$this存在,那么这个方法实际上已经是一个静态方法(PHP版本5.3之后需要写static关键字)
-
静态成员访问
类的内部
类名::$静态成员属性名
self::$静态成员属性名类名::静态成员方法名(); self::静态成员方法名();
类的外部
类名::$静态成员属性名
类名:静态成员方法名()对象->静态成员方法名()(一般不用)
-
魔术方法 __toString()
- 触发时机:对一个对象进行echo操作时自动触发
- 功能:简化操作或者为对象输出值
- 参数:无
- 返回值: 必须有,并且必须为字符串类型
-
魔术方法 __call()
- 触发时机:调用类中不存在的方法时自动触发.
- 功能:1.屏蔽错误。2为不存在的方法定义一个功能
- 参数:2个 1个是不存在的方法名。另一个是所有的实参列表
- 返回值: 可有可无
3. 面向对象的其它应用
1. 对象串行化
-
什么是串行化
- 将对象编程一个字符串的过程就是对象串行化
-
作用:
- 方便长久的保存对象
- 方便在网络上进行传输
-
魔术方法
- __sleep()
- 触发时机:对象进行串行化操作时自动触发
- 功能:指定需要串行化的成员属性
- 参数:无
- 返回值:需要返回一个数组类型,每个元素都是需要串行化的成员属性名
- __wakeup()
- 触发时机:对象反串行化操作时自动触发
- 功能:反串行化操作时修改部分成员属性
- 参数:无
- 返回值:无
- __sleep()
-
串行化与反串行化相关的函数
- 串行化操作:变量 = serialize(对象变量)
- 反串行化操作:对象变量 = unserialize(变量);
- __clone()
- 触发时机:对对象进行克隆操作时自动触发
- 功能:修改克隆之后的对象的部分成员属性
- 参数:无
- 返回值:无
- 注意:对象的赋值默认是引用赋值,不能通过赋值操作获取一个新的对象,获取新对象的操作应使用克隆操作
- 格式:新对象变量 = clone 对象变量
2. 抽象类和抽象方法
- 什么是抽象类
- 具有抽象方法的类就是抽象类
- 什么是抽象方法:
- 没有方法体的方法就是抽象方法
- 什么是方法体?
- 花括号内的{}
- 作用:
- 领导用的 协同工作、制定标准。
- 抽象类特征
- 抽象方法就是没有方法体的方法,方法体就相当于函数体,抽象方法前,必须使用abstract关键字,且方法后不能够写{},但是要写结束符(?
- 如果类中有抽象方法,那么这个类前面也必须使用abstract关键字进行修饰。
- 抽象类中可以有非抽象方法
- 抽象方法可以具有参数,要实现该抽象方法,必须传入同样的参数。
- 抽象类不能直接使用,必须由其他的类继承且完全实现除所有的抽象方法后,才可以使用。抽象类主要是给其它类进行继承操作
- 抽象类可以继承抽象类。
- 抽象类中不可以使用private关键字
3. 接口
- 接口的定义:
- 如果一个类中没有任何的非抽象方法,且不存在常量之外的任何成员属性,那么这个类就是一个接口。
- 特征:
- 声明一个接口不使用class关键字,而是使用interface官方尖子
- 接口中的抽象方法不能写abstract关键字,虽然它是一个抽象类,但是也不能写。
- 接口只能用public关键字,不可以使用protected或者private
- 接口中不允许有任何的成员属性,除了常量。
- 接口的继承不是使用extends而是使用implements关键字
- extends只能继承一个普通类或者一个抽象类,而implements可以同时继承多个接口,从而模拟多继承。
- 抽象类和接口的区别
- 抽象类的成员可以具有访问级别,而接口的成员全部public级别。
- 抽象类可以包含成员属性,而接口可以有常量。
- 抽象类可以继承接口,而接口不能继承抽象类。
- 抽象类的成员可以具有具体实现,而接口不行。
- 抽象的子类可以选择性实现其基类的抽象方法,而接口的子类必须全部实现。
4. 多态
- 概念:不同的人做相同的事得到不同的结果
- instanceof 运算符 判断一个对象是不是一个类的实例
5. 单例设计模式
- 最终的结果只能实例化一个对象
6. trait的声明及使用
- trait声明在名子前加trait关键字即可
- 格式:trait 名字{
//成员方法
//成员属性
}
- 格式:trait 名字{
- trait里面可以包含成员方法,成员属性。
- 支持疯转关键字及其他修饰词(final\static\abstract)
- trait不能通过new关键字来实例化
- 可以在类中通过use关键字后面加trait声明的名字进行引入到当前类中。
- use引入trait可以同时引入多个trait,使用英文逗号进行分割。
- 如果两个trait都插入了一个同名的方法,如果没有明确解决冲突将会产生错误,为了解决多个trait在同一个类中的命名冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一个。
- as操作符可以为某个方法引入别名,但是as操作符不会对方法进行从命名,也不会影响其方法。并且as的第二个用户还可以修改访问控制。
- 单个Trait也可由多个trait组成。
- trait也支持抽象放的使用,也支持静态方法的使用。
- trait会覆盖调用类继承的父类方法,有限顺序是来之当前类的成员覆盖了trait的方法,而trait则覆盖了继承的父类方法
7. 匿名类
- 从PHP7开始支持匿名类,既没有名字的类。一般用于处理某个特定的任务,当你发现某个类只用一次时,此时也可以使用匿名类
- 语法:
- 没有名字的类就是匿名类
- PHP允许通过 new class直接声明一个对象赋值给变量。
- 在创建匿名类时可以在class后面加上()表示传参给构造方法进行初始化成员属性。
- 注意:在匿名类的花括号之后一定要给分号,它是赋值语句
- 匿名类也可以扩展继承其他的类,实现接口及其他普通类一样也可以使用trait
4. 类的自动加载
- 魔术方法 __autoload()
- 触发时机:当页面中需要一个类,而该类不存在时自动触发
- 功能:实现类的自动加载
- 参数:1个 不存在的类名
- 返回值:没有
- 注意:在PHP版本大于7.2之后__autoload由spl_autoload_register()函数取代。推荐使用spl_autoload_register()函数自动加载需要的类,使用方式和__autoload用法一样。
5. 命名空间
-
什么是命名空间
- 将代码划分不同的区域,每个区域的常量、函数和类的名字互补影响。
-
命名空间的主要作用:用来解决重名问题。
- 注意:任意合法的PHP代码都可以包含在命名空间中,但是只有三种类型的代码会受命名空间的影响。就是类、常量、函数。
-
命名空间的基本应用。
- 定义命名空间使用namespace关键字声明
- namepsance需要写在PHP脚本的顶部,必须是第一个PHP指令,不要在namespance前面出现非PHP代码,HTML或者空格。
- 从定义namespace出现开始,到下一个namespace出现之前或者脚本运行结束时都是一个独立的空间。
- 注意:如果为相同代码定义多个命名空间是不可能的,只能被最后一个包含。
- 在同一文件中可以定义不同的命名空间
- 如果在当前空间中需要调用另外空间的内容。需要使用类似文件路径的语法 ‘\空间名\元素名’对于类、常量以及函数的用法都是一样。
- 命名空间可以定义子空间,并且子空间也可以定义多层。一般定义多层子空间时建议使用公司的域名倒置在加上项目名称组合而成。
- 使用define方式定义的常量归公共空间所有,不归命名空间所有。归命名空间所有的常量只能用const来声明。
- 什么是公共空间:
- 没有定义命名空间的函数、类、常量都是归属于公共空间。
- 注意:公共空间的代码被引入到某个命名空间下以后,该公共空间中的代码不属于任何命名空间内。
- 如果在命名空间中需要调用公共空间的元素,可以通过\元素名方式来调用。
-
命名空间中的名称和术语:
-
非限定名称 – 不包含前缀的类名称 比如:$u = new User() 如果当前命名空间是com/lmonkey。User会被解析为com\lmonkey\User. 如果使用User的代码在公共空间中,则User会被解析为User;
-
限定名称 – 包含前缀的名称 比如 $u = new xxyd\User() 如果当前命名空间是com,则user会被解析为com\xxyd\User.如果使用user的代码在公共空间中,则User会内解析为User;
-
完全限定名称 包含了全局前缀操作符的名称 比如:$u = new \xxyd\User() User总是被解析为xxyd\User;
-
-
别名与导入
- 使用use关键字后面跟命名空间名称可以指定导入该命名空间。
- 也可以使用as操作符对命名空间或者命名空间中的类元素进行重命名操作。
- 在使用use进行导入时,当前空间有相同的名字氮元素时,将会发生错误。
- 同一个namespace导入类,函数和常亮必须通过多个use语句一个一个导入,从PHP7开始,可以使用use语句一次性导入一种类型。
注意:如果使用use导入函数 需要加function 、如果导入常量需要加const.导入类时不需要加关键字 - 除了使用别名和导入还可以通过namespace关键字和__NAMESPACE__魔术常量动态的访问元素。其中namepace关键字表示当前空间。而魔术常量的值是当前空间的名称。
6. MVC设计模式
- 设计模式不限语言,任何一门服务器脚本语言都可以使用。
- m:model 模型层 负责加工处理数据,返回结果。
- v:view 视图层, 负责解释信息和显示信息。
- C:control 控制层 负责一盒五逻辑的处理
7. 数据库抽象层PDO
十五、会话控制
1. 什么是会话
- 现实中,两个人之间的对话就是会话。
- 在计算机中,客户端和服务器之间的通讯就是会话。
2. 什么是会话控制
- 对会话的控制就是会话控制
3. HTTP协议?
- HTTP叫无状态跟踪协议 老年痴呆协议,不能有任何的状态跟踪
4. cookie的使用方法:
-
添加COOKIE值
setcookie(‘下标’,’值’,’有效时间’,’有效作用域 / 表示当前作用域下好使’); -
修改COOKIE值
setcookie(‘下标’,’新值’,’新的有效时间’,’有效作用域’); -
删除COOKIE值
setcookie(‘下标’,null,’设置过期时间’,’有效作用域’); -
查看COOKIE值
cookie所有的值都是使用依赖于系统提供的$_COOKIE预定义数组,所有的COOKIE设置的值都会成为该数组的一个元素。
查看COOKIE值可以使用VAR_dump或者print_r
如果使用特点的COOKIE的值:$_COOKIE[‘下标’]; -
$_COOKIE是一个可以跨页面的系统预定义变量。
-
$_COOKIE在设置当前页面是无法读取信息的。
-
COOKIE的缺点。
- 它必须依赖于客户端允许(客户端可以关闭COOKIE)
- 相对不安全,COOKIE信息容易泄露
5. session的使用方法
-
session的操作跟数组的操作时一模一样。
-
在页面中如果使用session,那么必须在页面开始处先开启session(session_start())会话。
-
设置或者获取sessionid;通过函数sessionid();
-
添加session
- $_SESSION[‘下标’] = 值;
-
修改session
- $_SESSION[‘下标’] = 新值;
-
删除session
- 删除session的变量值(保留数据类型)
- $_SESSION = array();
- 删除所有session信息(包括文件)一般使用于退出操作
-
- 使客户端COOKIE中的SESSIONID过期。
-
- 清空页面SESSION的变量值
-
- 摧毁服务器的SESSION文件
-
- 删除session的变量值(保留数据类型)
-
使用session
- 查看全部SESSION信息
- var_dump()或者print_r();
- 使用其中sesssion的某个元素
- $_SESSION[‘下标’];
- 查看全部SESSION信息
-
session的配置文件相关选项
- session.save_handler = files 设定session文件的存储方式
- sesion.sava_path = ‘c:/wamp64/tmp’ session文件保存的路径
- session.use_cookies = 1 设定是否使用cookie来存储session的id
- session.use_only_cookies = 1 设定SESSION是否只用cookie
- session.name = PHPSESSID session名称
- session.auto_start = 0 设置是否自动开启session
- session.cookie_lifetime = 0 设定session使用cookie的有效生存时间,0 表示关闭浏览器前有效
- session.cookie_path = / 设置session使用cookie的有效路径
- session.cookie_domain = 设置SESSION使用cookie的有效域名 空 表示当前域名有效
- session.cookie_httponly = 设置session使用cookie是否指允许使用http协议
- session.serialize_handler = php session串行化的方式
- session.gc_probability = 1 垃圾回收机制的除数
- session.gc_divisor = 1000 垃圾回收机制的被除数
- session.gc_maxlifetime = 1440 session垃圾回收的最大时间。
- session.use_trans_sid = 0 session是否使用传输方式传session的id
- session.trans_sid_tags = “a=href,area=href,frame=src,form=” session可以传输id的方式
- 基于URL的SESSION的会话原理
- 在第一个页面获取对应的SESSION的ID,然后通过超链接的方式(手动 和 自动)将ID传送给下一个需要使用SESSION的ID页面,这种方式就是基于URL传送SESSION会话
- 如果是自动方式 需要更改配置文件选项:
session.use_trans_sid = 1 开启自动传送session的id
session.use_only_cookies = 0 关闭session仅使用cookie方式进行工作的选项
- 如果是自动方式 需要更改配置文件选项:
-
记住的一个问题:session是怎么工作的。
- 将ID存入到cookie的文件中,然后内容存放到服务器里。
- 如果禁用COOKIE的时候SESSION还能使用?
- 答案:不能,但是我们可以通过另一种方式来实现(URL传输的方式)