高级篇中将涉及数据库的使用以及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)
立即学习“PHP免费学习笔记(深入)”;
定义:用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等
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) 极大整数值
浮点型
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个值,一个值段可存多个值
日期型
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 混合日期和时间值,时间戳
※任何数据类型以字符串的形式存入,都可以自动转换类型
※将时间保存为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 |
| 事务处理 | 不支持 | 支持 |
| 数据行锁定 | 不支持 | 支持 |
| 外键约束 | 不支持 | 支持 |
| 表空间占用 | 相对较小 | 较大 |
| 全文索引 | 支持 | 不支持 |
MySQL默认字符集
推荐utf8
字符集:用来定义MySQL存储字符串的方式
使用character set关键字指定字符集
校对规则:对规则定义了比较字符串的方式
使用collate指定校对规则
数据操作语言(DML)
主要有三种形式:
1) 插入:INSERT
insert into tablename[(字段列表)] values(值列表1)[,(值列表2)...]
表名后面,若有字段列表,则值列表与字段列表一一对应,若没有字段列表,则值列表与表中的字段一一对应
2) 更新:UPDATE
update tablename set 字段名='值' [条件]
3) 删除:DELETE
delete from tablename [条件]
可以使用运算符,包括算术运算符、逻辑运算符、比较运算符、位运算符
数据查询语言(DQL)
ShoopD 网上商店系统
用 php + mysql 驱动的在线商城系统,我们的目标为中国的中小企业及个人提供最简洁,最安全,最高效的在线商城解决方案,使用了自建的会员积分折扣功能,不同的会员组有不同的折扣,让您的商店吸引更多的后续客户。 系统自动加分处理功能,自动处理会员等级,免去人工处理的工作量,让您的商店运作起来更方便省事 采用了自建的直接模板技术,免去了模板解析时间,提高了代码利用效率 独立开发的购物车系统,使用最
下载
基本结构是由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赋值
执行sql语句
没有结果集返回
使用execute()方法执行插入的参数,返回boolean类型
有结果集返回
使用bind_result($var1[,$var2...])绑定结果集
使用fetch()执行语句,每次获取一条结果,并传递到bind_result()中的变量
使用store_result()执行语句,将所有结果一次性取出,返回结果集,再用fetch()获取每一条记录
result_matedate()返回结果集,用于获取字段信息
使用result_free()释放结果集
关闭资源
使用close()方法关闭
函数
mysqli和mysqli_result支持函数,mysqli_stmt基本都支持
事务处理
建立表
表类型为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语句
PDOStatement:代表一条预处理语句,并在该语句被执行后代表一个相关的结果集
作用
准备一条语句
处理结果集
准备并发送语句
语句中的参数值可使用占位符“?”
占位符“:占位符名字”代替
使用PDO::prepare($sql)方法将语句发送到服务器准备,返回PDOStatement对象,存储结果集
给占位符传值(绑定参数)
使用bind_param($key,$value)绑定参数
“?”占位符
$key设置为索引号,
$value设置为传送值
名字占位符
$key设置为键名
$value设置为传送值
sql语句执行
使用execute()方法执行已绑定参数的语句
使用execute($array),$array数组中添加参数,避免绑定参数
记录获取
使用fetch()获取结果集中的每一条记录,返回索引和关联混合数组
参数为PDO::FETCH_ASSOC,返回关联数组
参数为PDO::FETCH_NUM,返回索引数组
参数为PDO::FETCH_BOTH,返回索引关联混合数组
fetchAll()获取结果集的每一条记录,返回二维数组
使用setFatchMode()设置获取模式,就可以避免每次获取都要设置模式
字段获取
columnCount()获取字段数
getColumnMeta()返回结果集中一列的元数据
PDOException:代表一个由 PDO 产生的错误。在自己的代码不应抛出一个 PDOException 异常
使用try catch捕获各种异常,包括连接异常、sql语句异常等
mamcache/memcached
一个高性能的分布式的内存对象缓存系统。通过在内存中维护一个巨大的hash表,维护内存中的数据
工作原理
PHP第一次查询数据时,会将数据存储在mamcache中,下次查询时,先访问mamcache。
安装
Linux下安装
基于libevent事件,所以必须先安装libevent库
Windows下安装
默认端口11211
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
使用$_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的基础学习算是完成了,需要多做多学,方能提高!