1.2 PDO介绍
1.2.1 连接数据库方式
方法一:mysql扩展【这种方式php7已经淘汰】
方法二:mysqli扩展
方法三:PDO扩展
1.2.2 PDO介绍
PDO(PHP Data Object)扩展为PHP访问各种数据库提供了一个轻量级,一致性的接口。无论访问什么数据库,都可以通过一致性的接口去操作。
1.2.3 开启PDO扩展
开启PDO连接MySQL扩展,在php.ini文件里面.
extension=pdo_mysql
1.3 PDO核心类
1、PDO类:表示PHP和数据库之间的一个连接
2、PDOStatement 类
第一:表示执行数据查询语句(select ,show)后的相关结果集
第二:预处理对象
3、PDOException类:表示PDO的异常
1.4 实例化PDO对象
语法
1.4.1 DSN
DSN:data source name,数据源名称,包含的是连接数据库的信息,格式如下:
$dsn=数据库类型:host=主机地址;port=端口号;dbname=数据库名称;charset=字符集
数据库类型:
MySQL数据库=>mysql:oracle数据库=>oci:SQL Server =>sqlsrv:具体驱动类型参见手册“PDO驱动”
1.4.2 实例化PDO
实例化PDO的过程就是连接数据库的过程
1.4.3 注意事项
1、如果连接的是本地数据库,host可以省略<?php$dsn='mysql:port=3306;dbname=data;charset=utf8';$pdo=new PDO($dsn,'root','root');var_dump($pdo); //object(PDO)#1 (0) { } 2、如果使用的是3306端口,port可以省略<?php$dsn='mysql:dbname=data;charset=utf8';$pdo=new PDO($dsn,'root','root');var_dump($pdo); //object(PDO)#1 (0) { } 3、charset也省略,如果省略,使用的是默认字符编码<?php$dsn='mysql:dbname=data';$pdo=new PDO($dsn,'root','root');var_dump($pdo); 4、dbname也可以省略,如果省略就没有选择数据库<?php$dsn='mysql:';$pdo=new PDO($dsn,'root','root');var_dump($pdo);
5、host、port、dbname、charset不区分大小写,没有先后顺序
6、驱动名称不能省略,冒号不能省略(因为冒号是驱动名组成部分),数据库驱动只能小写
1.5 使用PDO
1.5.1 执行数据操作语句
方法:p d o − > e x e c ( pdo->exec(pdo−>exec(sql),执行数据增、删、改语句,执行成功返回受影响的记录数,如果SQL语句错误返回false。
1.5.2 执行数据查询语句
方法:p d o − > q u e r y ( pdo->query(pdo−>query(sql),返回的是PDOStatement对象
query('select * from user');//var_dump($stmt);//object(PDOStatement)//2、获取数据//2.1获取二维数组//$rs=$stmt->fetchAll();//默认返回关联和索引数组//$rs=$stmt->fetchAll(PDO::FETCH_BOTH); //返回关联和索引数组//$rs=$stmt->fetchAll(PDO::FETCH_NUM);//返回索引数组//$rs=$stmt->fetchAll(PDO::FETCH_ASSOC);//返回关联数组//$rs=$stmt->fetchAll(PDO::FETCH_OBJ);//返回对象数组//2.2获取一维数组,匹配完成后指针下移一条//$rs=$stmt->fetch(); //关联和索引数组//$rs=$stmt->fetch(PDO::FETCH_NUM); //索引数组//例题:通过while循环获取所有数据/*while($row=$stmt->fetch(PDO::FETCH_ASSOC)){$rs[]=$row;}echo '';var_dump($rs); *///3.3匹配列:匹配当前行的第n列,列的编号从0开始,匹配完毕后指针下移一条//echo $stmt->fetchColumn();//获取当前行的第0列//echo $stmt->fetchColumn(1);//获取当前行的第1列//3.4总行数,总列数/*echo '总行数:'.$stmt->rowCount(),'
';echo '总列数:'.$stmt->columnCount();*///3.5 遍历PDOStatement对象(PDOStatement对象是有迭代器的)foreach($stmt as $row){echo $row['Host'],'-',$row['User'],'
';}
1.7 单例模式封装MyPDO类
1.7.1 步骤
1、单例模式
2、初始化参数
3、连接数据库
4、执行增删改
5、执行查询
a)返回二维数组
b)返回一维数组
c)返回一行一列
1.7.2 代码实现
第一部分:单例、初始化参数、实例化PDO
type}:host={$this->host};port={$this->port};dbname={$this->dbname};charset={$this->charset}";$this->pdo=new PDO($dsn, $this->user, $this->pwd);} catch (PDOException $ex) {echo '错误编号:'.$ex->getCode(),'
';echo '错误行号:'.$ex->getLine(),'
';echo '错误文件:'.$ex->getFile(),'
';echo '错误信息:'.$ex->getMessage(),'
';exit;}}//显示异常private function showException($ex,$sql=''){if($sql!=''){echo 'SQL语句执行失败
';echo '错误的SQL语句是:'.$sql,'
';}echo '错误编号:'.$ex->getCode(),'
';echo '错误行号:'.$ex->getLine(),'
';echo '错误文件:'.$ex->getFile(),'
';echo '错误信息:'.$ex->getMessage(),'
';}//设置异常模式private function initException(){$this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}//执行增、删、改操作public function exec($sql){try{return $this->pdo->exec($sql);} catch (PDOException $ex) {$this->showException($ex, $sql);exit;}}//获取自动增长的编号public function lastInsertId(){return $this->pdo->lastInsertId();}//判断匹配的类型private function fetchType($type){switch ($type){case 'num':return PDO::FETCH_NUM;case 'both':return PDO::FETCH_BOTH;case 'obj':return PDO::FETCH_OBJ;default: return PDO::FETCH_ASSOC;}}//获取所有数据 ,返回二维数组public function fetchAll($sql,$type='assoc'){try{$stmt=$this->pdo->query($sql);//获取PDOStatement对象$type= $this->fetchType($type); //获取匹配方法return $stmt->fetchAll($type);} catch (Exception $ex) {$this->showException($ex, $sql);}}//获取一维数组public function fetchRow($sql,$type='assoc'){try{$stmt=$this->pdo->query($sql);//获取PDOStatement对象$type= $this->fetchType($type); //获取匹配方法return $stmt->fetch($type);} catch (Exception $ex) {$this->showException($ex, $sql);exit;}}//返回一行一列public function fetchColumn($sql){try{ $stmt=$this->pdo->query($sql);return $stmt->fetchColumn();} catch (Exception $ex) {$this->showException($ex, $sql);exit;}}}//测试$param=array( );$mypdo= MyPDO::getInstance($param);//echo $mypdo->exec('delete from news where id=6');/*if($mypdo->exec("insert into news values (null,'11','1111',unix_timestamp())"))echo '自动增长的编号是:'.$mypdo->lastInsertId (); *///$list=$mypdo->fetchAll('select * from news');//$list=$mypdo->fetchRow('select * from news where id=1');$list=$mypdo->fetchColumn('select count(*) from news');echo '';var_dump($list);