PHP面向对象07_PDO

oop007复习

2014-9-4 9:42:28

 

摘要:

1、pdo的作用
2、pdo的安装
3、pdo连接属性设置
4、pdo对象和PDOStatement对象
5、pdo预处理
6、pdo事务机制

1、pdo的作用

简介:
PDO(php data object)扩展类库为php访问数据库定义了轻量级的、一致性的接口,它提供了一个数据库访问抽象层.
这样,无论你使用什么数据库,都可以通过一致的函数执行查询和获取数据.
PDO大大简化了数据库的操作并能够屏蔽不同数据库之间的差异.
使用pdo可以很方便地进行跨数据库程序的开发,以及不同数据库间的移植,是将来php在数据库处理方面的主要发展方向.
它可以支持mysql,postgresql,oracle,mssql等多种数据库.

举例说明:
假如我们做了个项目,使用的是mysql,如果是面向过程操作数据库,那么,基本上所有的数据库函数都是mysql_形式.
现在我们突然要换数据库了,比如pgsql.而pgsql数据库函数基本是pg_形式.
并且二者部分函数是互相不存在的,都有各自的"扩展函数".
那么这时候改项目就比较复杂了.

但是如果我们使用的是pdo操作数据库,一切都简单了.
使用mysql,我们只需在连接的时候这样定义:

$m=new PDO("mysql:host=localhost;dbname=test","root","123");

使用pgsql,我们只需在连接的时候这样定义:

$m=new PDO("pgsql:host=localhost;port=5432;dbname=test","postgres","123");

其它的操作都是一样的,比如查询都是stmt=m->query(sql),遍历都是stmt->fetchAll();
一切都变简单了.PDo还提供了预处理和事务支持.

2、pdo的安装

[windows环境]
01) 编辑php.ini文件:

extension=php_pdo.dll
extension=php_pdo_mysql.dll

02)重启apache服务:

httpd –k restart

03)打开phpinfo.php查看是否有pdo、pdo_mysql

[Linux环境(CentOS6.0)]
一般步骤是:



1 tar -zxvf PDO_MYSQL-1.0.2.tgz
2 cd PDO_MYSQL-1.0.2
3 /usr/local/php/bin/phpize
4 ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
5 make
6 make install

编辑php.ini,添加
注:$ext_dir为扩展目录名字,例如no-debug-zts-20060613

extension_dir=/usr/local/php/lib/php/extensions/$ext_dir
extension=pdo_mysql.so

然后重启服务器即可.

3、pdo连接属性设置

*连接数据库格式:

PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )

01)连接mysql

$m=new PDO("mysql:host=localhost;dbname=test","root","123");

02)连接pgsql

$m=new PDO("pgsql:host=localhost;port=5432;dbname=test","postgres","123");

03)连接Oracle

$m=new PDO("OCI:dbname=accounts;charset=UTF-8", "scott", "tiger"); 

*不过,一般都是采用异常处理方式连接,例如 :

try{
  $m=new PDO("mysql:host=localhost;dbname=test","root","123");
  }catch(PDOException $e){
  die('数据库连接失败:' . $e->getMessage());
}

 

*PDO与连接有关的选项

PDO::ATTR_ERRMODE
PDO::ERRMODE_SILENT 0    忽略错误模式
PDO::ERRMODE_WARNING 1    警告级别模式
PDO::ERRMODE_EXCEPTION 2    异常处理模式
PDO::ATTR_AUTOCOMMIT
//关闭自动提交
//开启自动提交
PDO::ATTR_DEFAULT_FETCH_MODE
PDO::FETCH_ASSOC 2
PDO::FETCH_NUM 3
PDO::FETCH_BOTH 4
PDO::FETCH_OBJ 5

例如:

$option=array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
$m=new PDO("mysql:host=localhost;dbname=test","root","123",$option);

 

或者更通用的设置属性方式:



$m->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//设置异常处理方式
$m->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);//设置默认关联索引遍历

 

常见PDO属性输出:

echo "\nPDO是否关闭自动提交功能:". $m->getAttribute(PDO::ATTR_AUTOCOMMIT);
echo "\n当前PDO的错误处理的模式:". $m->getAttribute(PDO::ATTR_ERRMODE);
echo "\n表字段字符的大小写转换: ". $m->getAttribute(PDO::ATTR_CASE);
echo "\n与连接状态相关特有信息: ". $m->getAttribute(PDO::ATTR_CONNECTION_STATUS);
echo "\n空字符串转换为SQL的null:". $m->getAttribute(PDO::ATTR_ORACLE_NULLS);
echo "\n应用程序提前获取数据大小:".$m->getAttribute(PDO::ATTR_PERSISTENT);
echo "\n与数据库特有的服务器信息:".$m->getAttribute(PDO::ATTR_SERVER_INFO);
echo "\n数据库服务器版本号信息:". $m->getAttribute(PDO::ATTR_SERVER_VERSION);
echo "\n数据库客户端版本号信息:". $m->getAttribute(PDO::ATTR_CLIENT_VERSION);

 

*字符集设置
设置php连接mysql时的客户端字符串和连接字符串集为:

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

或者:

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

4、PDO对象和PDOStatement对象

01)pdo对象中的成员方法

1.PDO::beginTransaction — 启动一个事务
2.PDO::commit — 提交一个事务
3.PDO::__construct — 创建一个表示数据库连接的 PDO 实例
4.PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE
5.PDO::errorInfo — 获取错误信息
6.PDO::exec — 执行一条 SQL 语句,并返回受影响的行数
7.PDO::getAttribute — 取回一个数据库连接的属性
*8.PDO::getAvailableDrivers — 返回一个可用驱动的数组(了解即可)
*9.PDO::inTransaction — 检查是否在一个事务内(了解即可)
10.PDO::lastInsertId — 返回最后插入行的ID或序列值
11.PDO::prepare — 创建SQL的预处理,返回PDOStatement对象
12.PDO::query — 用于执行查询SQL语句,返回PDOStatement对象
13.PDO::quote — 为sql字串添加单引号
14.PDO::rollBack — 回滚一个事务
15.PDO::setAttribute — 设置属性

 

pdo::query()方法
当执行返回结果集的select查询时,或者所影响的行数无关紧要时,应当使用pdo对象中的query()方法.
如果该方法成功执行指定的查询,则返回一个PDOStatement对象.
如果使用了query()方法,并想了解获取数据行总数,可以使用PDOStatement对象中的rowCount()方法获取

pdo::exec()方法
当执行insert,update,delete没有结果集的查询时,使用pdo对象中的exec()方法去执行.
该方法成功执行时,将返回受影响的行数.注意,该方法不能用于select查询.

-------------------------------------------------------------------------------------------
示例:

<?php
try{
  $m=new PDO("mysql:host=localhost;dbname=test","root","123");
}catch(PDOException $e){
  die('数据库连接失败:' . $e->getMessage());
}

$stmt=$m->query("select * from stu");//返回PDOStatement对象$stmt
echo $stmt->rowCount();
?>

 

-------------------------------------------------------------------------------------------

02)PDOStatement对象中的成员方法

1.PDOStatement::bindColumn — 绑定一列到一个 PHP 变量(*)
2.PDOStatement::bindParam — 绑定一个参数到指定的变量名(*)
3.PDOStatement::bindValue — 把一个值绑定到一个参数(*)
4.PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。
5.PDOStatement::columnCount — 返回结果集中的列数
6.PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
7.PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE(*)
8.PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息(*)
9.PDOStatement::execute — 执行一条预处理语句(*)
10.PDOStatement::fetch — 从结果集中获取下一行(*)
11.PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组(*)
12.PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
13.PDOStatement::fetchObject — 获取下一行并作为一个对象返回。
14.PDOStatement::getAttribute — 检索一个语句属性(*)
15.PDOStatement::getColumnMeta — 返回结果集中一列的元数据
16.PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
17.PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数(*)
18.PDOStatement::setAttribute — 设置一个语句属性(*)
19.PDOStatement::setFetchMode — 为语句设置默认的获取模式。

注:(*)表示必须会使用的方法.

5、pdo预处理

准备一条SQL语句使用PDOStatement::execute()方法执行.
预处理SQL语句可以使用包含零或多个命名为(:name)或者以?号标记为(?)的形式.例如

$stmt=$m->prepare("insert into stu(name,age,sex,classid)values(?,?,?,?)");
$stmt=$m->prepare("insert into stu(name,age,sex,classid)values(:name,:age,:sex,:classid)");

预处理的好处是可以防止SQL注入、更快执行效率支持批量操作.

6、pdo事务机制

概要:将多条sql操作(增删改)作为一个操作单元,要么都成功,要么都失败.
单条数据不用事务处理

时间: 2025-01-21 01:56:32

PHP面向对象07_PDO的相关文章

ASP面向对象编程探讨及比较

比较|编程|对象|比较 ASP是Microsoft于较早期推出的动态网页编程技术,但其结合ADO对数据库方便快捷的访问.结合XML.COM/ActiveX等其它技术 实现服务器多层结构的功能使它在今天还有着顽强的生命力,并且依然有着一定的发展.ASP.Net虽然在架构上完全不同于ASP,但它很多内建对象也是基 于ASP进行扩展的.网上有无数的介绍ASP的文章,却鲜有介绍ASP面向对象以及与其它语言比较的,这也就是我下决心写这篇文章的原因.因为是早期的版本,ASP只提供了很弱的面向对象的接口.

JavaScript面向对象程序设计(8) 优雅的封装还是执行的效率?

优雅的封装还是执行的效率?这是一个悖论. 优雅封装的程序看起来是那么的美妙:每个属性被隐藏在对象之后,你所能看到的就是这个对象让你 看到的,至于它到底是怎么操作的,这个不需要你操心. 执行的效率就是另外一回事.就像是C语言和面向对象的C++之间的差别:C++很优雅,但是执行效率 ,无论是编译后的二进制代码还是运行期的内存的占用,都要比简单的C语言多出一截来. 这个问题在脚本语言中显得更加重要,因为JavaScript根本就是一种解释语言,解释语言的执行效率 要比编译语言低很多. 1.优雅的封装

面向对象-领域对象 和 实现对象是什么?

问题描述 领域对象 和 实现对象是什么? 如题,在面向对象技术中文版(原书名为object-oriented Technology)一书中领域对象 和 实现对象是什么意思?(原文为domain object与implementation object) 解决方案 要看上下文,具体它怎么解释的,从字面上看,前者代表数据实体,比如User Product等等,后者代表业务逻辑,比如ProductService,里面包含了GetProducts GetOrders等等逻辑 解决方案二: 领域模型是对领

JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买电脑来说吧,首先,你不懂电脑,你去电脑城买电脑,和大象装冰箱里一样,是什么步骤?咨询 砍价 ,谈妥了就那电脑走人,对吧,这就是面向过程的思想,而面向对象是:你有一个哥们,他懂电脑,什么都会,你只要带他去,就行,你这个哥们就是对象,在JAVA中,我们就是操作一个对象去完成各种各样的操作的,这就是面向对

讲解Python中面向对象编程的相关知识

  这篇文章主要介绍了深入讲解Python中面向对象编程的相关知识,是Python入门学习中的基础知识,需要的朋友可以参考下 Python从第一天开始就是面向对象的语言.正因为如此,创建和使用类和对象是非常地容易.本章将帮助您在使用Python面向对象编程的技术方面所有提高. 如果没有任何以往面向对象(OO)的编程的经验,那么可能要了解一些基本的入门课程就可以了,或者至少某种形式的教程,让你有了解基本概念. 但是,这里会比较少地介绍面向对象编程(OOP): OOP术语概述 类: 用户定义的原型对

PHP面向对象精要总结

 1 使用extends实现继承以及重载.魔术方法的含义 class B extends A 声明的时候B里可以没有A里的方法 调用的时候: $b=new B(); $b->A里的方法(); $b->A里的属性=1; $b->B里的方法(); $b->B里的方法(); 如果$a=new A(); 可以 $a->A里的方法(); $a->A里的属性=1; 不可以 $a->B里的方法(); $a->B里的方法();   重载:B继承A ,B里实现和A同名的方法属

php面向对象(基础)

最近重新学习了php面向对象这一部分的知识,做了下笔记,分享给大家,其中一部分为自己的简介,加色部分一般为自己认为比较重点或需要注意的地方,分享给大家,还希望大家多提意见共同学习. 1. 析构函数:__destruct ( ) //这是一个析构函数,在对象销毁前调用 function __destruct() { echo "再见".$this->name.""; } 2. 构造函数:__construct( ) PHP子类能否继承父类的构造方法? 如果没有定

PHP中的面向对象和面向过程

对象|过程 简介"真正的天才具有正确评价不确定的,有风险的和矛盾的信息的能力.--邱吉尔" 使用许多编程语言时,你通常只能使用面向对象或面向过程二者之一的编程方式.而在PHP中,你可以自由选择或混用.目前绝大多数PHP程序员使用面向过程的方式,因为解析WEB页面本身就非常"过程化"(从一个标签到另一个标签).在HTML中嵌入过程处理代码是很直接自然的作法,所以PHP程序员通常使用这种方式. 如果你是刚接触PHP,用面向过程的风格来书写代码很可能是你唯一的选择.但是如

JAVA中面向对象编程语言的学习之路

编程|对象 第一步是安装好JDK 写一个Hello World,? 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的:另一个问题是package和import问题,如何来寻找类的路径问题.把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍.推荐看一下王森的<Java深度历险>,对这两个问题进行了深入的探讨. 第二步是学习Java