当前位置: 代码迷 >> PHP >> PHP札记(PHP高级篇)
  详细解决方案

PHP札记(PHP高级篇)

热度:55   发布时间:2016-04-28 17:38:31.0
PHP笔记(PHP高级篇)

高级篇中将涉及数据库的使用以及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不支持的功能
      • 不支持全文索引
        • 占用空间比较大
          功能MyISAMInnoDB
          事务处理不支持支持
          数据行锁定不支持支持
          外键约束不支持支持
          表空间占用相对较小较大
          全文索引支持不支持

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。
  • 安装  
  • memcache命令
CommandDescriptionExample
getReads a valueget mykey
setSet a key unconditionallyset mykey 0 60 5
addAdd a new keyadd newkey 0 60 5
replaceOverwrite existing keyreplace key 0 60 5
appendAppend data to existing keyappend key 0 60 15
prependPrepend data to existing keyprepend key 0 60 15
incrIncrements numerical key value by given numberincr mykey 2
decrDecrements numerical key value by given numberdecr mykey 5
deleteDeletes an existing keydelete mykey
flush_allInvalidate specific items immediatelyflush_all
Invalidate all items in n secondsflush_all 900
statsPrints general statisticsstats
Prints memory statisticsstats slabs
Prints memory statisticsstats malloc
Print higher level allocation statisticsstats items
 stats detail
 stats sizes
Resets statisticsstats reset
versionPrints server version.version
verbosityIncreases log levelverbosity
quitTerminate telnet sessionquit

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的基础学习算是完成了,需要多做多学,方能提高!

  相关解决方案