PHP笔记(PHP高级篇)

高级篇中将涉及数据库的使用以及Cookie和Session会话,提升PHP的开发效率和运行效率php

 

PHP程序员须要掌握的MySQL操做html

  • 为项目设计表
  • 使用SQL语句
  • MySQL的目录结构
    • data目录中存放的是库文件
    • bin目录中存放的是MySQL管理命令
    • *.ini文件记录的是MySQL的配置

链接MySQL DB:mysql

  • mysql -h sql地址 -u 用户名 -p密码,如mysql -h localhost -u root -p123456
  • 安全的方法:先输入“mysql -h sql地址 -u 用户名 -p”,回车,再输入密码

 数据定义语言(DDL)linux

  • 定义:用来建立数据库中的各类对象-----表、视图、索引、同义词、聚簇等
  • 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时间戳,方便运算web

数据字段属性算法

  • unsigned:设置该字段为无符号数值,只能是数值型
  • zerofill:设置该字段的记录的值未达到指定位数时,用“0”填充,只能是数值型
  • auto_increment:设置该字段的值自动增加,也可设定自定义值,须要同时设定索引或主键,只能是数值型
  • null和not null:设置该字段是否容许为空,建议设定为非空,配合default使用
  • default:设置该字段的默认值,若不输入,使用默认值

索引sql

  • 优势:
    • 提升查询速度
  • 缺点:
    • 建立和维护成本比较高
    • 占用资源
  • 主键索引(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。
  • 安装  
  • 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 <?php
    2     $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的基础学习算是完成了,须要多作多学,方能提升!

相关文章
相关标签/搜索