高级篇中将涉及数据库的使用以及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) 极大整数值 浮点型 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)
基本结构是由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的基础学习算是完成了,需要多做多学,方能提高!