PDO基础知识

PDO基础知识

一、什么是PDO?

PHP DATA OBJECT

PHP数据库抽象层

位于PHP与数据库中间的一个桥梁

二、为什么要使用PDO?

方便数据库的迁移

方便数据库的升级

减少学习成本

使程序更加安全

防止sql注入

提高代码效率

三、何时采用PDO?

绝大多数操作数据库的项目都使用PDO

四、PDO的安装

1)类库文件需要存在

php根目录下的ext文件夹中:php_pdo.dll、php_pdo_mysql.dll

2)在php的配置文件php.ini中须开启

extension=php_pdo.dll

extension=php_pdo_mysql.dll

五、如何使用PDO?

1)PDO核心类

①连接数据库

new PDO($dsn,$username,$password)

$dsn:

1.直接写入字符串(推荐)

$dsn="mysql:host=localhost;dbname=test;charset=utf8";

2.远程加载文件(不推荐)

$dsn="uri:file:///d:/dsn.txt";

$dsn="uri:http://www.baidu.com/dsn.txt";

dsn.txt文件中的内容为:

mysql:host=localhost;dbname=test;charset=utf8

3.设置php.ini(不推荐)

在php的配置文件php.ini中找到:[PDO],若没有找到则在文件最后手动添加:

[PDO]

pdo.dsn.mydsn="mysql:host=localhost;dbname=test;charset=utf8";

在代码中引入:

$dsn="mydsn";

②判断错误

使用PDOException异常处理

③设置字符集

$pdo->query("set names utf8");

④错误模式设置

1.手动抛出错误异常,放在sql语句执行之后

PDO::errorCode()

PDO::errorInfo()

2.设置自动抛出错误异常,放在sql语句执行之前

PDO::setAttribute()

静默模式(默认)

PDO::ATTR_ERRMODE=>PDO::ERRMODE_SILENT

警告模式

PDO::ATTR_ERRMODE=>PDO::ERRMODE_WARNING

异常处理模式(推荐)

PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION

⑤执行sql语句

1.exec()

执行增、删、改语句,成功返回受影响行数,失败返回false

2.query()

执行查询语句,成功返回PDO预处理对象(可作二维数组处理,直接用foreach遍历)

3.lastInsertId()

返回最近一次插入行的ID或序列值

⑥关闭数据库连接

$pdo=null; 或 unset($pdo);

2)PDO预处理类

1.什么是预处理?

就是将sql语句的语法提前解析

2.为什么要使用预处理?

效率提高,语法只解析一次

有效防止sql注入

3.何时采用预处理?

框架当中基本全是预处理

4.如何使用预处理?

①准备参数,依次为预处理对象中占位符对应的字段

②创建预处理对象

$stmt=$pdo->prepare(" ");

③绑定参数,标识符从1开始,有几个参数就依次绑定几次

方式一:

$stmt->bindParam(1,$i);

$stmt->bindParam(2,$j);

方式二:

$stmt->bindValue(1,$i);

$stmt->bindValue(2,$j);

方式三:

可以使用数组对应各占位符的值,在下一步执行对象时将该数组传入

$arr=array('第一个占位符对应的值','第二个占位符对应的值',...);

$arr=array('字段名1'=>'以字段名1为占位符对应的值','字段名2'=>'以字段名2为占位符对应的值',...);

④执行对象

$stmt->execute();

//$stmt->execute($arr);

⑤占位符

?

在绑定参数时须指定各占位符对应位置,从1开始

:字段名称

在绑定参数时须指定各对应的字段名称

⑥查询处理

$stmt->execute()执行完毕后,解析结果:

1.$stmt->fetch(PDO::FETCH_ASSOC)

解析一条,需要循环解析

while($stmt->fetch(PDO::FETCH_ASSOC){

}

2.$stmt->fetchAll(PDO::FETCH_ASSOC)

解析所有结果,将结果返回到一个二维数组中

3.$stmt->rowCount()不仅可以获取增、删、改的受影响行数,也可获取查询的记录行数

3)PDO的异常处理类

PDOException

PDOException::getCode() 异常号

PDOException::getMessage() 异常信息

4)事务处理

1.什么是事务处理

把一整件事情作为一个整体,作为一个事务

2.为什么要使用事务处理

程序的安全性、完整性

3.什么时候使用事务处理

重要数据

4.如何使用事务处理

①开启事务

PDO::beginTransaction()

②执行sql语句

PDO::exec()

③执行事务或回滚事务

PDO::commit()

PDO::rollBack()

try{

//连接数据库

$dsn="mysql:host=localhost;dbname=test;charset=utf8";

$username="autumn";

$password="ZWQ900815";

$pdo=new PDO($dsn,$username,$password);

//设置字符集

$pdo->query("set names utf8");

//错误模式设置

//方式一:手动抛出错误异常,放在sql语句执行之后

/*

$errorInfo=$pdo->errorInfo();

//发生错误时,$errorInfo[1]为错误号和$errorInfo[2]为错误信息

//无错误时,$errorInfo[1]和$errorInfo[2]均为空

if(!empty($errorInfo[1])){

//抛出错误异常

throw new PDOException($errorInfo[2],$errorInfo[1]);

}

*/

//方式二:自动抛出错误异常,放在sql语句执行之前

//设置PDO::ATTR_ERRMODE(静默模式[默认]、警告模式、异常处理模式[推荐])

$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

//准备sql语句

//$sql01="insert into cms_user(username,password) values('admin02','1234')";

//$sql02="delete from cms_user where id=2";

//$sql03="update cms_user set username='admin' where id=1";

//$sql04="select1 * from cms_user";

//执行sql语句

//exec 处理增、删、改语句,返回受影响行数

//query 处理查询语句

//$pdo->exec($sql01);

//返回最近一次插入行的ID或序列值

//echo $pdo->lastInsertId();

//$pdo->exec($sql02);

//$pdo->exec($sql03);

/*

$data=$pdo->query($sql04);

foreach ($data as $key=>$val) {

echo $val['id']."\n";

echo $val['username']."\n";

echo $val['password']."\n";

}

*/

//预处理

//方式一

/*

//1.准备参数,依次为下面要处理的sql语句中?占位符对应的字段值

$id=1;

$username='autumn';

//2.创建预处理对象

$stmt=$pdo->prepare("delete from cms_user where id=? and username=?");

//3.绑定参数,$id、$username为引用传参,参数赋值可在前可在后

//绑定参数标识符从1开始,有几个参数变量,就依次绑定几次

$stmt->bindParam(1,$id);

$stmt->bindParam(2,$username);

//绑定值,变量值的赋值只能在前,不能在后,作用等同于bindParam()

//$stmt->bindValue(1,$id);

//$stmt->bindValue(2,$username);

//4.执行对象

$stmt->execute();

*/

//方式二

/*

$id=1;

$username='autumn';

$stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username");

$stmt->bindParam(":id",$id);

$stmt->bindParam(":username",$username);

$stmt->execute();

*/

//方式三(推荐)

//若使用“?”作为占位符

//$stmt=$pdo->prepare("delete from cms_user where id=? and username=?");

//$arr=array(1,'autumn');

//若使用“:字段名称”作为占位符

/*

$stmt=$pdo->prepare("delete from cms_user where id=:id and username=:username");

$arr=array("id"=>1,"username"=>"autumn");

$stmt->execute($arr);

echo $stmt->rowCount(); //受影响行数

*/

$stmt=$pdo->prepare("select * from cms_user where id>:id");

$arr=array("id"=>3);

$stmt->execute($arr);

$data=$stmt->fetchAll(PDO::FETCH_ASSOC);

echo $stmt->rowCount(); //也可获取查询的记录行数

echo "

";

var_dump($data);

echo "

";

//执行事务处理

/*

//1.开启事务

$pdo->beginTransaction();

//2.执行sql语句

$aff01=$pdo->exec("update cms_user set username='admin01' where id=1");

//sql语句本身有错误而无法执行时会自动抛出错误异常,而当sql语句可执行后受影响行数为0时,需要手动抛出异常

if($aff01==0){

throw new PDOException("受影响行数为0!");

}

$aff02=$pdo->exec("insert into cms_user(username,password) values('admin02','0000')");

if($aff02==0){

throw new PDOException("受影响行数为0!");

}

//3.执行事务

$pdo->commit();

*/

//关闭数据库连接

$pdo=null;

}catch(PDOException $e){

//4.回滚事务

//$pdo->rollBack();

//异常处理

//$e->getCode();//异常号

//$e->getMessage();//异常信息

echo "(".$e->getCode().")".$e->getMessage();

}

相关推荐

怎么在全民K歌中获取鲜花的礼物道具
365tiyu

怎么在全民K歌中获取鲜花的礼物道具

⌛ 07-09 👁️ 7859
亩和平方米的换算
365tiyu

亩和平方米的换算

⌛ 07-09 👁️ 3020
耳机插头为什么要镀金
beat365官网地址下载

耳机插头为什么要镀金

⌛ 07-02 👁️ 4826