高级篇中将涉及数据库的使用以及Cookie和Session会话,提高PHP的开发效率和运行效率
PHP程序员需要掌握的MySQL操作
- 为项目设计表
- 使用SQL语句
- MySQL的目录结构
- data目录中存放的是库文件
- bin目录中存放的是MySQL管理命令
- *.ini文件记录的是MySQL的配置
连接MySQL DB:
- mysql -h sql地址 -u 用户名 -p密码,如mysql -h localhost -u root -p123456
- 安全的方法:先输入“mysql -h sql地址 -u 用户名 -p”,回车,再输入密码
数据定义语言(DDL)
- 定义:用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等
- SQL语句
- 创建数据库
CREATE DATABASE [IF NO EXISTS] DatabaseName
- 创建表
CREATE TABLE [IF NOT EXISTS] TableName (colname1 type [property] [index],colname2 type [property] [index],...)[tableType] [tableCharSet];
- 修改表
- alter table 操作
- 数据类型
- 数值型
- UNSIGNED:指定为无符号存储
- 整型
- TINYINT 1 Byte (-128,127) (0,255) 小整数值
SMALLINT 2 Byte (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 Byte (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 Byte (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 Byte (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
- TINYINT 1 Byte (-128,127) (0,255) 小整数值
- 浮点型
- FLOAT 4 字节 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38)
- DOUBLE 8 字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)
- 字符型
- CHAR 0-255Byte 定长字符串,
VARCHAR 0-255Byte 变长字符串,必须指定长度
TINYBLOB 0-255Byte 不超过 255 个字符的二进制字符串
TINYTEXT 0-255Byte 短文本字符串
BLOB 0-65 535Byte 二进制形式的长文本数据
TEXT 0-65 535Byte 长文本数据
MEDIUMBLOB 0-16 777 215Byte 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215Byte 中等长度文本数据
LOGNGBLOB 0-4 294 967 295Byte 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295Byte 极大文本数据 - CHAR的处理速度比较快,VARCHAR具有可变大小
- 二进制保存主要用于保存非文本文件
- ENUM,枚举类型,最多能存储65535个值,一个字段只能存一个值
- SET,集合类型,最多可存储64个值,一个值段可存多个值
- CHAR 0-255Byte 定长字符串,
- 日期型
- DATE 3Byte 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3Byte '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1Byte 1901/2155 YYYY 年份值
DATETIME 8Byte 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 8Byte 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
- DATE 3Byte 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
- 数值型
※任何数据类型以字符串的形式存入,都可以自动转换类型
※将时间保存为php时间戳,方便运算
数据字段属性
- unsigned:设置该字段为无符号数值,只能是数值型
- zerofill:设置该字段的记录的值未达到指定位数时,用“0”填充,只能是数值型
- auto_increment:设置该字段的值自动增长,也可设定自定义值,需要同时设定索引或主键,只能是数值型
- null和not null:设置该字段是否允许为空,建议设定为非空,配合default使用
- default:设置该字段的默认值,若不输入,使用默认值
索引
- 优点:
- 提高查询速度
- 缺点:
- 创建和维护成本比较高
- 占用资源
- 主键索引(primary key):索引值必须唯一,每张表只有一个
- 唯一索引(unique):索引值必须唯一,但一张表可以有多个
- 常规索引(index):最基本的索引,没有太多的限制
- 全文索引(filltext):只能在MyISAM上使用,表越大,效果越好,但速度较慢
- 创建和使用,可查看MySQL索引类型一览表 让MySQL高效运行起来
数据表类型及存储位置
- MySQL可以针对不同的存储引擎需求可以选择最优的存储引擎
- 数据表类型即存储引擎
- 使用type或engine关键字指定表类型
- 常用的表类型
- MyISAM
- 强调快速读取操作
- 对一些功能不支持(事务)
- InnoDB
- 支持一些MyISAM不支持的功能
- 不支持全文索引
- 占用空间比较大
功能 MyISAM InnoDB 事务处理 不支持 支持 数据行锁定 不支持 支持 外键约束 不支持 支持 表空间占用 相对较小 较大 全文索引 支持 不支持
- 占用空间比较大
- MyISAM
MySQL默认字符集
- 推荐utf8
- 字符集:用来定义MySQL存储字符串的方式
- 使用character set关键字指定字符集
- 校对规则:对规则定义了比较字符串的方式
- 使用collate指定校对规则
数据操作语言(DML)
- 主要有三种形式:
- 1) 插入:INSERT
- insert into tablename[(字段列表)] values(值列表1)[,(值列表2)...]
- 表名后面,若有字段列表,则值列表与字段列表一一对应,若没有字段列表,则值列表与表中的字段一一对应
- insert into tablename[(字段列表)] values(值列表1)[,(值列表2)...]
- 2) 更新:UPDATE
- update tablename set 字段名='值' [条件]
- 1) 插入:INSERT
- 3) 删除:DELETE
- delete from tablename [条件]
- 可以使用运算符,包括算术运算符、逻辑运算符、比较运算符、位运算符
- 3) 删除:DELETE
数据查询语言(DQL)
- 基本结构是由SELECT[ALL|DISTINCT]子句,FROM子句,WHERE
- 子句组成的查询块:
- SELECT <字段列表>
- FROM <表或视图名>
- [WHERE<查询条件>/GROUP BY/ORDER BY]
- DISTINCT表示不显示重复的记录
- 使用as关键字,可为字段名起别名,用于可能产生歧义的字段名
- 子句组成的查询块:
数据控制语言(DCL)
- 定义:用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。
MySQL内置函数
- 位置:select语句,及子句where order by having 中,update delete语句及子句
- 函数中可以将字段名当作变量来用,变量的值就是该列对应的所有值
- 常用
- 字符串函数
- concat:把传入的参数连接成一个字符串
- insert(str,x,y,insert):从str的x位置开始,替换y长度的字符串为insert
- lower(str),upper(str):将字符串转换为大写,小写
- left(str,x) right(str,x) 返回str左边(右边)x个字符,x为null则返回null
- lpad(str,n,pad) rpad(str,n,pad) 用pad对字符串str从最左边(右边)进行填充,直到总长度n
- trim(str),ltrim(str),rtrim(str)去掉两边,左边,右边空格
- replace(str,a,b) 在字符串str中用字符串b替换所有的字符串a
strcmp(s1,s2):如果S1比S2小,返回-1;如果S1比S2大则返回1;如果相等则返回0(比较的是ASCII码)
- substring(str,x,y) 返回字符串str中从位置x起,长度为y的子字符串
- 数值函数
- abs(x):返回绝对值
- ceil(x):返回大于x的最小整数
- floor(x):返回小于x的最大整数
- mod(x,y):返回x与y的模
- rand():返回0-1之间的随机数
- round(x,y):返回参数x的y位小数的四舍五入结果
- truncate(x,y):返回数字x截断为y位小数的结果
- 日期函数
- curdate():返回当前年月日
- curtime():返回当前时分秒
- now():返回当前日期
- unix_timestamp(time):返回unix时间戳
- from_unixtime():将Unix时间戳转换为日期
- week():返回时间戳的周
- year():返回时间戳的年
- hour():返回时间戳的小时
- minute():返回时间戳的分钟
- month():返回时间戳的月
- date_format(time,"%Y-%m-%d %H:%i:%s"):格式化返回时间
- 流程控制函数
- if(value,t,f):如果value值为true,返回t,如果value值为false,返回f
- ifnull(value1,value2):如果value1为空,则返回value2,如果value1不为空,返回value1
- case
when value1 then value2
when value3 then value4
......
else fault END- 当value1为true,返回value2,当value3位true,返回value4,以此类推,否则返回fault
- 其他用法:mysql 语句case when
- 其他函数
- database():返回数据库名
- version():返回MySQL版本
- user():返回MySQL的用户
- inet_aton(ip):将IP转换为网路字节序
- inet_nton():将网络字节序转为IP
- password():MySQL用户密码加密
- md5(str):将字符串加密
- 字符串函数
PHP操作数据库
- 连接数据库
- mysql_connect(IP,user,psw):IP为数据库地址,user为用户名,psw为用户密码,连接成功,返回数据库资源,连接失败,返回false
- 选择库
- mysql_select_db($dbname,[$res]):$dbname为库名称;$res为连接数据库是返回的资源,若不添加该参数,则默认为最近创建的数据库资源
- SQL语句输入
- mysql_query():执行SQL语句,若语句有返回结果集,则函数执行成功返回结果集,若语句没有返回结果集,函数执行成功返回true
- 解决错误
- mysql_errno():返回错误号
- mysql_error():返回错误信息
- 关闭数据库资源
- mysql_close():关闭数据库资源,不使用参数,默认关闭开启的资源(推荐)
- 函数
- mysql_insert_id():返回自动增长的id,若没有设置AUTO_INCREMENT,则返回false
- mysql_affected_rows():获取受影响的行数
- 从结果集中取出数据
- mysql_fetch_row($result):从结果集中取得一条数据,返回索引数组
- mysql_fetch_assoc($result):从结果集中取得一条数据,返回关联数组
- mysql_fetch_array($result):从结果集中取得一条数据,返回索引数组和关联数组
- mysql_fetch_object($result):从结果集中取得一条数据,返回对象
- mysql_data_seek($result,$row):将指针移动到指定位置
- 从结果集中获取字段
- mysql_num_rows($result):获取结果集的字段数
- mysql_num_fields($result):获取结果集的列数
- mysql_field_name($result):获取结果集的字段名
mysqli操作数据库
- PHP5以后的新添加的功能都是面向对象的,所以mysqli是以对象的形式添加的
- mysqli优点
- 表示改进
- 功能增加
- 效率大大增加
- 更稳定
- mysqli扩展提供的三个类
- mysqli:和连接有关的类
- 构造方法
- mysqli([$host [, $username [, $passd[, $dbname [,$port [, $socket ]]]]]] )
- 连接成功返回对象,失败返回false
- 查看连接失败信息
- connect_errno():返回连接错误号码
- connect_error():返回连接错误信息
- SQL语句输入
- query(sql):执行SQL语句,若语句有返回结果集,则函数执行成功返回结果集对象mysqli_result,若语句没有返回结果集,函数执行成功返回true
- 方法
- affected-rows():返回影响行数
- errno():返回错误号
- error():返回错误信息
- insert_id():返回自动增长的id
- 关闭资源
- close():关闭连接
- 构造方法
- mysqli_result:表达对数据库的查询所返回的结果集
- 属性:
- $num_rows:结果集中记录数
- $field_count:结果集中字段数
- $current_field:获取当前列的位置
- 方法:
- 处理记录
- fetch_row():与mysql_fetch_row()一致
- fetch_assoc():与mysql_fetch_assoc()一致
- fetch_array():与mysql_fetch_array()一致
- fetch_object():与mysql_fetch_object()一致
- data_seek():与mysql_data_seek()一致
- free():释放结果集
- 处理字段
- fetch_field():取出列信息,并作为对象返回
- fetch_fields():取出所有列信息,并作为对象返回
- field_seek():移动字段指针
- 执行多条SQL语句
- multi_query(sql1[;sql2]):可执行多条sql语句,语句间用“;”隔开,若有多个结果集,则均会被返回
- next_result():返回multi_query()的下一个结果集
- more_results():检查是否含有下一个结果集
- 处理记录
- 属性:
- mysqli_stmt:预处理类
- 优点:
- mysqli和mysqli_result能完成的功能,mysqil_stmt都能完成
- 效率比较高,执行多条相同的sql语句,只有数据不同的话,不用重复传语句,直接传数据即可
- 防止sql注入,因为出入的数据只会当做值类使用,不会当做可执行语句
- 创建对象
- 创建好mysqli对象后,使用该对象的stmt_init()方法初始化mysqli_stmt对象
- 准备并发送语句
- 语句中的参数值要使用占位符“?”代替
- 使用mysqli_stmt中的prepare($sql)方法将语句发送到服务器准备
- 不用创建mysqli_stmt对象,直接使用mysqli中的prepare($sql)准备sql语句,并返回mysqli_stmt对象
- 语句中的参数值要使用占位符“?”代替
- 给占位符传值(绑定参数)
- 使用bind_param($type,$var1[,$var2...])绑定参数
- $type可以为i、d、s、b,分别代表integer、double、string和二进制资源
- $type中的类型个数要与占位符相同,$var个数也要与占位符个数相同
- 给变量$var赋值
- 使用bind_param($type,$var1[,$var2...])绑定参数
- 执行sql语句
- 没有结果集返回
- 使用execute()方法执行插入的参数,返回boolean类型
- 有结果集返回
- 使用bind_result($var1[,$var2...])绑定结果集
- 使用fetch()执行语句,每次获取一条结果,并传递到bind_result()中的变量
- 使用store_result()执行语句,将所有结果一次性取出,返回结果集,再用fetch()获取每一条记录
- result_matedate()返回结果集,用于获取字段信息
- 使用result_free()释放结果集
- 使用bind_result($var1[,$var2...])绑定结果集
- 没有结果集返回
- 关闭资源
- 使用close()方法关闭
- 函数
- mysqli和mysqli_result支持函数,mysqli_stmt基本都支持
- 优点:
- mysqli:和连接有关的类
- 事务处理
- 建立表
- 表类型为MyISAM不支持事务功能,需要建立InnoDB类型的表
- 关闭自动提交
- autocommit():参数为0或false时,关闭自动提交
- 提交事务
- commit():提交事务(多条执行后的sql语句)
- 回滚事务
- rollback():回滚事务(多条已执行的sql语句)
- 建立表
- 其他方法
- set_charset($string):设置取出字符集
PDO
- 优点:
- 更换数据库时,不用更改代码
- 缺点:
- 效率不如mysql和mysqli高
- 三个类
- PDO:代表 PHP 和数据库服务之间的一个连接
- 创建PDO对象
- dpo($dsn,$username,$passd[,$array]):$dsn连接mysql数据库时,设置为'mysql:host=ip:port;dbname=$string',$array为调优参数
- DSN(data source name)数据源:包括主机位置、库名和不同数据库所需驱动
- 可用getattribute($attribute)查看属性,使用setattribute($attribute,$value)设置属性
- 执行sql语句
- query($string):执行有结果集返回的语句,返回预处理对象PDOStatement
- exec($string):执行对表有影响的语句,返回被影响行数
- 设计错误报告
- 使用setAttribute()设置错误报告模式
- ERRMODE_SILENT:不显示错误,开发人员自行检查错误
- errorCode:返回错误号码
- errorInfo:返回错误信息数组
- ERRMODE_WARNING:发生错误,显示一个E_WARNING消息
- ERRMODE_EXCEPTION:发生错误,抛出PDOException异常
- 事务处理
- 使用setAttribute(),设置开启事务处理,关闭自动提交
- 使用commit()提交已执行的sql语句
- 使用rollback()回滚已执行的sql语句
- 创建PDO对象
- PDOStatement:代表一条预处理语句,并在该语句被执行后代表一个相关的结果集
- 作用
- 准备一条语句
- 处理结果集
- 准备并发送语句
- 语句中的参数值可使用占位符“?”
- 占位符“:占位符名字”代替
- 作用
- PDO:代表 PHP 和数据库服务之间的一个连接
- 使用PDO::prepare($sql)方法将语句发送到服务器准备,返回PDOStatement对象,存储结果集
- 给占位符传值(绑定参数)
- 使用bind_param($key,$value)绑定参数
- “?”占位符
- $key设置为索引号,
- $value设置为传送值
- 名字占位符
- $key设置为键名
- $value设置为传送值
- “?”占位符
- 使用bind_param($key,$value)绑定参数
- 给占位符传值(绑定参数)
- sql语句执行
- 使用execute()方法执行已绑定参数的语句
- 使用execute($array),$array数组中添加参数,避免绑定参数
- 记录获取
- 使用fetch()获取结果集中的每一条记录,返回索引和关联混合数组
- 参数为PDO::FETCH_ASSOC,返回关联数组
- 参数为PDO::FETCH_NUM,返回索引数组
- 参数为PDO::FETCH_BOTH,返回索引关联混合数组
- fetchAll()获取结果集的每一条记录,返回二维数组
- 使用setFatchMode()设置获取模式,就可以避免每次获取都要设置模式
- 使用fetch()获取结果集中的每一条记录,返回索引和关联混合数组
- 字段获取
- columnCount()获取字段数
- getColumnMeta()返回结果集中一列的元数据
- sql语句执行
- PDOException:代表一个由 PDO 产生的错误。在自己的代码不应抛出一个 PDOException 异常
- 使用try catch捕获各种异常,包括连接异常、sql语句异常等
mamcache/memcached
- 一个高性能的分布式的内存对象缓存系统。通过在内存中维护一个巨大的hash表,维护内存中的数据
- 工作原理
- PHP第一次查询数据时,会将数据存储在mamcache中,下次查询时,先访问mamcache。
- 安装
- Linux下安装
基于libevent事件,所以必须先安装libevent库
- Windows下安装
- 默认端口11211
- Linux下安装
- memcache命令
Command | Description | Example |
---|---|---|
get | Reads a value | get mykey |
set | Set a key unconditionally | set mykey 0 60 5 |
add | Add a new key | add newkey 0 60 5 |
replace | Overwrite existing key | replace key 0 60 5 |
append | Append data to existing key | append key 0 60 15 |
prepend | Prepend data to existing key | prepend key 0 60 15 |
incr | Increments numerical key value by given number | incr mykey 2 |
decr | Decrements numerical key value by given number | decr mykey 5 |
delete | Deletes an existing key | delete mykey |
flush_all | Invalidate specific items immediately | flush_all |
Invalidate all items in n seconds | flush_all 900 | |
stats | Prints general statistics | stats |
Prints memory statistics | stats slabs | |
Prints memory statistics | stats malloc | |
Print higher level allocation statistics | stats items | |
stats detail | ||
stats sizes | ||
Resets statistics | stats reset | |
version | Prints server version. | version |
verbosity | Increases log level | verbosity |
quit | Terminate telnet session | quit |
PHP中使用memcache
- 类:memcache
- 连接:memcache::connect($host,$port)
1 <?php2 $memcache = new Memcache;3 $memcache->connect("localhost",11211) or die("could not connect");
- 其他方法
- add:添加数据
- set/replace:修改数据
- get:获取数据
- delete:删除数据
- ......
- 何时使用memcache
- 数据库中读出来的数据,方便下次使用
- 会话控制中使用
- 技巧
- 用sql语句作为key
- 用md5()修改sql语句,使sql语句变短,便于保存
会话控制:面向连接的可靠的连接方式,通过会话控制,判断用户的登录行为
- cookie技术
- 服务器给客户端的一个文件,通过客户端的这个文件,保存用户信息,服务器根据文件,区分用户
- 设置cookie
- setcookie($key,$value,$time):头信息,不能有任何输出
- 获取cookie
- 使用全局数组$_COOKIE[]获取cookie内容
- 删除cookieti
- 用setcookie设置$value为空或不设置,$time设置为0或不设置
- session技术
- 在服务器中保存用户数据,会产生一个SessionID,可使用cookie和url传递该id
- session配置
- 配置服务器端的php.ini
- 开启会话
- session_start():让php的核心程序将和session有关的内建环境变量预先载入到内存中
- 开启一个会话
- 基于cookie的session,使用该函数不能有任何输出
- 返回已开启的会话
- 开启一个会话
- session_start():让php的核心程序将和session有关的内建环境变量预先载入到内存中
- 设置和获取session
- 使用$_SESSION[]设置和获取session
- session_id()获取和设置session的id
- 删除session
- $_SESSION=array();将session设置为空数组
- 删除cookie中的session
- session_destory():销毁session
- 基于url传递sessionid,设置url的参数为session_name,session_start()后,会自动寻找该参数
- 常量SID,当用户关闭cookie时,该常量表示session_name和session_id;当用户开启cookie时,该常量为空
- 设置php.ini中的session.use_trans_sid=1,会使页面跳转(超链接、header、表单)后面自动添加SID
- session高级技术
- php.ini中,session的设置
- session_name:设置存在cookie以及SID中的session_name
- session.use_trans_sid:设置SID是否开启,开启后,可自动添加SID
- session.save_path:设置session文件的保存位置,如果不设置,则不生成session文件
- session.gc_maxlifetime:设置session文件有效时间,超过该时间session未刷新,session文件将失效
- session.gc_probability和session.gc_divisor结合使用,定义session垃圾回收概率,算法为session.gc_probability/session.gc_divisor
- session.use_cookie:设置session写入到cookie中
- session.cookie_path:设置哪些文件的session写入到cookie中
- session.cookie_lifetime:设置session的生命周期
- session.save_handler:设置session写入方式及位置,当值为user时,可使用session_set_save_handler()函数
- session_set_save_handler(open(),close(),read(),write(),destroy(),gc()):可自定义session文件的存储路径及存储方式等
- 使用该函数定义了各个方法,像往常一样使用session
- open():在执行session_start()时,被调用
- close():在执行session_write_close()时,被调用
- read():在调用open()后,被调用
- write():脚本结束时和session_write_close()执行时,被调用
- destroy():当session使用session_destroy()或者session_regenerate_id()被销毁时,被调用
- gc():由session.gc_probability和session.gc_divisor决定,任何时候军可能被调用
- 具体用法
- 将Session写入数据库
- 将Session写入Memcache
- php.ini中,session的设置
至此,PHP的基础学习算是完成了,需要多做多学,方能提高!