1.PDO介绍(php data object)

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。

PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。

示意图如下:

设置pdo的开启状态。在php.ini文件中找到如下:

  1. extension=php_pdo.dll  //开启pdo
  2. extension=php_pdo_mysql.dll  //pdo访问mysql驱动

查看是否成功开启pdo,可以通过phpinfo函数。

pdo提供了三组类:PDO、PDOStatement、PDOException。分别为数据库使用、预处理、异常

2.PDO数据库连接

连接数据库和异常处理代码如下:

<?php
// 1.使用try、catch来进行错误处理。有专门的PDOException异常类
try {
// 2.PDO参数解析:数据源DSN、用户名、密码、属性设置
// 2.1 数据源DSN:'数据库驱动:地址=localhost;数据库名:test'
// 2.2 数据库驱动:mysql
// 2.3 属性设置:drive_opt。通过数组来设置这些属性
$drive_opt=array(
PDO::ATTR_AUTOCOMMIT=>1, //修改成功
PDO::ATTR_SERVER_VERSION=>4 //修改失败。因为setAttribut没有修改ATTR_SERVER_VERSION属性
);
$_pdo=new PDO('mysql:host=localhost;dbname=test','root','',$drive_opt);
$_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 获取与连接相关的信息
echo $_pdo->getAttribute(PDO::ATTR_CONNECTION_STATUS)."<br/>";
echo $_pdo->getAttribute(PDO::ATTR_SERVER_VERSION)."<br/>";
echo $_pdo->getAttribute(PDO::ATTR_AUTOCOMMIT)."<br/>";
echo $_pdo->getAttribute(PDO::ATTR_ERRMODE);
}catch (PDOException $e){
exit( "数据库链接错误");
}
?>

结果:

可以使用setAttribute来设置属性值。使用getAttribute来获取属性值

3.数据库操作

一:增删改(执行没有结果集的查询,使用exec()方法将返回查询所影响的行数)

在pdo操作sql有错误的情况下,提供了3中报错的方式,如下:

  • 如果使用默认模式,需要我们自己进行判断和输出错误结果
  • 如果使用警告模式,会自动提醒pdo操作数据库存在的问题
  • 如果使用异常模式,则需要通过try{}catch{}来捕获
<?php
$drive_opt=array(
PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES UTF8',  //设置字符集编码
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION //注意 一定要写这个,不如写try catch 不会执行异常
);
try{
$_pdo=new PDO('mysql:host=localhost;dbname=test','root','',$drive_opt);
}catch (PDOException $e){
exit('数据库连接失败'.$e->getMessage());
}
//增删改
try {
$sql="insert into user1(name,Password,Email,age) values('hello',md5(456),'hello@qq.com',55);";
$res=$_pdo->exec($sql);
if ($res){
echo "添加成功";
}else{
echo "添加失败";
}
}
catch (PDOException $e){
exit($e->getMessage());
}
// 如果是使用的默认模式,需要自己对结果进行判断输出
// $sql="insert into use4r1(name,Password,Email,age) values('hello',md5(456),'hello@qq.com',55);";
// $res=$_pdo->exec($sql);
// if (!$res){
// print_r($_pdo->errorInfo());
// }
?>

二:查(一次执行一个查询,应使用query()方法)

query()方法详解:

  1. 设置字符集编码($_pdo->query("SET NAMES UTF8");)
  2. 获取数据集(返回的不是结果集,而是预处理对象PDOStatement)

<?php
$drive_opt=array(
PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES UTF8',
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
);
try{
$_pdo=new PDO('mysql:host=localhost;dbname=test','root','',$drive_opt);
}catch (PDOException $e){
exit('数据库连接失败'.$e->getMessage());
}
//查
try {
$sql1="select id,name from user1;";
$stmt= $_pdo->query($sql1);
var_dump($stmt);
//以对象的方式获取下一行的结果集
// while(!!$_row=$stmt->fetchObject()){
// print_r($_row);
// }
//----------一次性获取所有的数据----------
// foreach ($stmt->fetchAll()as $_row){
// print_r($_row);
// }
//-----------使用fetch方法,可以获取结果集下一行------------------
// while (!!$_row=$stmt->fetch()){
// print_r($_row);
// }
//-----------通过foreach循环来获取每行的数据------------------
foreach ($stmt as $_row){
print_r($_row);
// echo $_row[0]."----".$_row[1]."<br/>";
}
} catch (PDOException $e) {
die($e->getMessage());
}
?>

4.准备语句

多次执行一个查询(prepare())

准备语句是使用两个方法实现的:prepare()负责准备要执行的查询,execute()使用一组给定的列参数返回地执行查询。这些参数可以现实地作为数组传递给 execute()方法,也可以使用通过 bindParam()方法指定的绑定参数提供给 execute()方法。

如果采用 prepare 和 execute 方法,还可以防止 SQL 注入等攻击。因为所有的变量都会被自动转义。而如果采用 query()方法,将不具备这种保护,必须手动转义,比如使用 PDO里的 quote()方法来转义变量

使用prepare和execute方法增删改

<?php
try {
$_pdo=new PDO('mysql:host=localhost;dbname=test','root','');
} catch (PDOException $e) {
die($e->getMessage());
}
// $sql='';
// $sql="insert into user1(name,Password,Email,age) values('hi',md5(456),'hi@qq.com',55);";
$sql="update user1 set name='test_hhh' where id=3";
$stmt=$_pdo->prepare($sql);
$stmt->execute();
// rowCount()获取影响的行数,通过影响的行数判断是否增删改成功
if ($stmt->rowCount()){
echo "修改成功";
}else{
echo "数据没有被修改,修改失败";
}
// 获取最后新增的id
// echo "新增的id为".$_pdo->lastInsertId();
?>

新增多条数据

<?php
try {
$_pdo=new PDO('mysql:host=localhost;dbname=test','root','');
} catch (PDOException $e) {
die($e->getMessage());
}
// 使用”?“号准备语句新增多条数据
$sql="insert into user1(name,Password,Email,age) values(?,?,?,?);";
$stmt=$_pdo->prepare($sql);
$stmt->execute(array('aa','md5(456)','aa@qq.com','55'));
// 使用”:名称“号准备语句新增多条数据
$sql="insert into user1(name,Password,Email,age) values(:name,:Password,:Email,:age);";
$stmt=$_pdo->prepare($sql);
$stmt->execute(array(':name'=>'abc',':Password'=>'111',':Email'=>'abc.qq.com',':age'=>'18'));
// 结合绑定新增多条数据
$sql="insert into user1(name,Password,Email,age) values(:name,:Password,:Email,:age)";
$stmt=$_pdo->prepare($sql);
$stmt->bindParam(':name', $name);
$stmt->bindParam(':Password', $Password);
$stmt->bindParam(':Email', $Email);
$stmt->bindParam(':age', $age);
$name='qwe';
$Password='555';
$Email='qwe@qq.com';
$age='18';
$stmt->execute();
?>

5.事务处理

  • PDO 为能够执行事务的数据库提供了事务支持。有 3 个 PDO 方法可以完成事务任务:beginTransaction()、commit()和 rollback()。
  • 所谓事务,说白了,就是一组 SQL 关联的操作,如果其中一条 SQL 有误没有执行,而其他的 SQL 都会撤销执行。
  • MySQL 数据库类型为 InnoDB 方可启用事务处理
<?php
try {
$_pdo=new PDO('mysql:host=localhost;dbname=test','root',''); } catch (PDOException $e) {
die($e->getMessage());
}
// PS:一定要注意定义error模式。不然不会执行try catch
$_pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION );
try {
$_pdo->beginTransaction(); //开启事务
$sql="UPDATE account1 SET balance=balance+50 where id=1;";
$_stmt=$_pdo->prepare($sql);
$_stmt->execute();
$sql1="UPDATE account1 SET balance=balance-50 where id=2;";
$_stmt1=$_pdo->prepare($sql1);
$_stmt1->execute();
$_pdo->commit(); //提交
} catch (PDOException $e) {
die($e->getMessage());
$_pdo->rollBack(); //回滚
}
?>

【三十】php之PDO抽象层的更多相关文章

  1. pdo 抽象层连接数据库

    <?php   header("content-type:text/html; charset=utf8");    try{          $pdo=new PDO(' ...

  2. Python之路【第三十篇】:django 模型层-多表关系

    多表操作 文件为 ---->  orm2 数据库表关系之关联字段与外键约束 一对多Book id title price publish email addr 1 php 100 人民出版社 1 ...

  3. PDO数据访问抽象层

    PDO数据访问抽象层: 我们使用的mysqli是针对mysql这个数据库扩展的一个类,如果要用到别的数据库的话就可以用PDO来做 1.操作数据库 先来代码 <!--PDO--> <! ...

  4. PDO(数据访问抽象层)、pdo事务功能和预处理功能---2017-05-05

    之前所学的数据访问都是用mysqli做成类来访问的,但是mysqli这个类只是针对mysql这个数据库的:那么如果访问其他类型的数据库呢? 那么这就用到了PDO(数据访问抽象层). 一.关于PDO基本 ...

  5. PHP中关于PDO数据访问抽象层的功能操作

    PDO:数据访问抽象层 具有三大特点: 1.可以访问其它数据库  所有数据库都可以 2.具有事务功能 3.带有预处理语句功能(防止SQL注入攻击) 实例操作代码如下: <?php //1.造PD ...

  6. 【代码总结】数据库抽象层PDO

    一.概述 PDO就是一个"数据库访问抽象层",起作用是统一各种数据库的访问接口,能够轻松的在不同数据库之间进行切换. 二.PDO的安装 编辑php.ini文件 添加 extensi ...

  7. PDO是一个“数据库访问抽象层”

    PDO是一个"数据库访问抽象层",作用是统一各种数据库的访问接口,与mysql和mysqli的函数库相比,PDO让跨数据库的使用更具有亲和力:与ADODB和MDB2相比,PDO更高 ...

  8. PHP 数据库抽象层pdo

    PDO是PHP数据对象(PHP Data Object)的缩写. pdo就是一个"数据库访问抽象层",作用是统一各种数据库的访问接口,能够轻松地在不同数据库之间进行切换,使得数据库 ...

  9. php PDO:数据访问抽象层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. MySQL存储过程之游标实战

    MySQL存储过程之游标实战 ​ 博主日前在解决一个项目需求时,没有什么好的方法,于是就来学习存储过程了,之前也是接触过,奈何年少贪玩,竟是全部又还给了大学老师-苦不堪言呐-. ​ 先说一下业务需求吧 ...

  2. Spring框架(三) JDBCTemplate,声明式事务,自动装载(注解)

    JDBCTemplate 按照标准正常项目的结构 结构图: model层 dao层 实现  dao:(DateBase Access Object) 数据访问对象,dao层只用来访问数据库和模型层 s ...

  3. sqlserver 存储过程 增加

    CREATE PROCEDURE [dbo].[InsertMessage]( @strTable varchar(), --表名 @strValues nvarchar(), --要插入的数据(用英 ...

  4. iOS OC利用imageview属性切出类似圆柱图形

    效果一: 效果二: 上边的图形我也数不出来名字,,暂称圆柱正切图形吧,看到这样的需求似不似在想各种插件,各种切图方法了呢... UIImageView的属性可以轻松搞定 UIViewContentMo ...

  5. APP上传APP Store遇到的各种问题

    内容含敏感话题或对苹果不友好的信息(如苹果婊) 使用了友盟的统计SDK,获取了IDFA但是上传填写无广告 采用友盟IDFA的sdk,并用友盟的默认淘宝页面广告,被告知和产品内容不符(最近) App在i ...

  6. 第2章KNN算法笔记_函数classify0

    <机器学习实战>知识点笔记目录 K-近邻算法(KNN)思想: 1,计算未知样本与所有已知样本的距离 2,按照距离递增排序,选前K个样本(K<20) 3,针对K个样本统计各个分类的出现 ...

  7. Java NIO (四) 选择器(Selector)

    选择器(Selector) 是 SelectableChannle 对象的多路复用器,Selector 可以同时监控多个 SelectableChannel 的 IO 状况,也就是说,利用 Selec ...

  8. Java 多线程笔记

    资料来源于网络,仅供参考学习.   1.A Java program ends when all its threads finish (more specifically, when all its ...

  9. elastaticresearch 学习过程

    1.在Windows上安装了es 2.在chrome上装了sense 3.尝试创建 es 的模板

  10. 脚本全选全不选操作asp.net treeview控件

    //树节点勾选(取消)上级自动全部勾选(取消)下级,勾选下级自动勾选上级,取消全部下级,自动取消上级 //事件响应函数 var HandleCheckbox = function () { //取得事 ...