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. 【Sqlserver系列】CAST和CONVERT

    1   概述 本篇文章主要讲解SqlServer中类型转换涉及的两个函数:CAST和CONVERT. 2   具体内容 2.1  CAST (1)作用:将一种数据类型的表达式转换为另一种数据类型的表达 ...

  2. CentOS下nginx php mysql 环境搭建

    CentOS下搭建PHP运行环境. 首先是在虚拟机上装好一个命令行的CentOS,如果只是弄服务器的话,不要装图形界面,会比较卡. 一.安装编译工具及库文件 yum -y install make z ...

  3. 关于SQLALCHEMY之(一)

    SQLALCHEMY是一个不可靠的方案.对于初级开发者而言,并不如SQL语句来得简明. 或者说,我不知道是不是所有的ORM数据库对象映射方案都存在这么一种情况.纯以开发逻辑而言.下述两段代码的结论是一 ...

  4. maven项目启动报:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener 错误解决方法-杜恩德

    如果你是maven项目,tomcat在发布项目的时候没有同时发布maven依赖所添加的jar包, 你需要设置一下eclipse: 项目 -> 属性 -> Deployment Assemb ...

  5. 切换用户,显示用户名, 调用Windows系统命令

    CONN 用户名/密码 CONN sys/密码 AS SYSDBA | SYSOPER SHOW USER SELECT * FROM 用户名.表名; 调用Windows系统命令: HOST Wind ...

  6. iOS常见的几种加密方法(base64.MD5.Token传值.系统指纹验证。。加密)

    普通加密方法是讲密码进行加密后保存到用户偏好设置中 钥匙串是以明文形式保存,但是不知道存放的具体位置 一. base64加密 base64 编码是现代密码学的基础 基本原理: 原本是 8个bit 一组 ...

  7. go实例之轻量级线程goroutine、通道channel与select

    1.goroutine线程 goroutine是一个轻量级的执行线程.假设有一个函数调用f(s),要在goroutine中调用此函数,请使用go f(s). 这个新的goroutine将与调用同时执行 ...

  8. NOIP2017day1游记

    NOIP 2017总结 Day1 Day1T1 第一眼看到瞬间慌掉,woc这玩意啥! 然后懵逼了两分钟 好的 我相信他是NOIP第一题 那我就打个表吧 然后花五分钟打了个暴力 玩了几组数据 哇!好像有 ...

  9. JDBC 程序实例小练习

    JDBC 程序实例问题 编程实现如下功能:在数据库中建立一个表,表名为student,其结构为学号.姓名.性别.年龄.英语.JavaSE程序设计.初级日语.总分,在表中输入多条记录. 学生的总分信息, ...

  10. 本地如何操作服务器的mysql,详细教程

    前置条件: 1.在阿里云服务器de系统是win service 2012. 2.服务器里自己安装了my sql 5.7 3.本地也安装了my sql 5.7 需求:想通过本地的mysql连接上远程的服 ...