PHP面向对象07

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

1 extension_dir=/usr/local/php/lib/php/extensions/$ext_dir
2 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"); 

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

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

*PDO与连接有关的选项

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

例如:

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

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

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

常见PDO属性输出:

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

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

 1 <?php
 2 try{
 3 $m=new PDO("mysql:host=localhost;dbname=test","root","123");
 4 }catch(PDOException $e){
 5 die(‘数据库连接失败:‘ . $e->getMessage());
 6 }
 7
 8 $stmt=$m->query("select * from stu");//返回PDOStatement对象$stmt
 9 echo $stmt->rowCount();
10 ?>

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

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)或者以?号标记为(?)的形式.例如

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

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

*详见 PDO预处理

6、pdo事务机制

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

*详见 PDO事务处理

时间: 2024-10-05 20:37:32

PHP面向对象07的相关文章

python面向对象07/异常处理

目录 python面向对象07/异常处理 1.异常错误分类 2.什么是异常? 3.异常处理 4.为什么要有异常处理? 5.异常处理的两种方式 5.1 if判断 5.2 try python面向对象07/异常处理 1.异常错误分类 语法错误: # if 2 > 1 # print(222) # # dic = {'name'; 'alex'} # tu = (2, 3, 4'' 6 ) 逻辑错误: # num = int(input('请输入数字')) # dic = {'name': '海狗',

百度房间卡是否可骄傲是快乐积分拉斯科

http://www.ebay.com/cln/ycn6646/-/167568259015/2015.02.07 http://www.ebay.com/cln/gon-n31/-/167197496017/2015.02.07 http://www.ebay.com/cln/hu_d027/-/167453250013/2015.02.07 http://www.ebay.com/cln/ywa2962/-/167301832012/2015.02.07 http://www.ebay.co

JavaSE学习总结第07天_面向对象2

07.01 成员变量和局部变量的区别 1.在类中的位置不同 成员变量    类中方法外 局部变量    方法内或者方法声明上 2.在内存中的位置不同 成员变量   堆内存 局部变量   栈内存 3.生命周期不同 成员变量   随着对象的存在而存在,随着对象的消失而消失 局部变量   随着方法的调用而存在,随着方法的调用完毕而消失 4.初始化值不同 成员变量   有默认的初始化值 局部变量   没有默认的初始化值,必须先定义,赋值,才能使用. 07.02 方法的形式参数是类名的调用 例: 1 cl

07.面向对象基础

面向对象思维方法 1.首先确定谁来做,其次确定怎么做: 2.首先考虑整体,其次考虑局部: 3.首先考虑抽象,其次考虑具体 创建类的方法 属性:成员变量,主要用于描述类的状态 方法:成员方法,主要用于描述类的行为 类的表示方法 生成对象的方法 对象的使用方法 使用对象调用变量和函数 1.对象 .变量 2.对象 . 函数()        classDog{ String name; int age; String color; void jump(){ System.out.println("ju

黑马程序员_JavaSE学习总结第07天_面向对象2

------- android培训.java培训.期待与您交流! ----------  07.01 成员变量和局部变量的区别 1.在类中的位置不同 成员变量    类中方法外 局部变量    方法内或者方法声明上 2.在内存中的位置不同 成员变量   堆内存 局部变量   栈内存 3.生命周期不同 成员变量   随着对象的存在而存在,随着对象的消失而消失 局部变量   随着方法的调用而存在,随着方法的调用完毕而消失 4.初始化值不同 成员变量   有默认的初始化值 局部变量   没有默认的初始

[Java初探07]__关于面向对象的简单认识

前言 类和对象,在我们学习Java语言的过程中,它们无时无刻不存在着,在我们还远未详细弄明白它们的意义之前,在我们不知不觉的下意识里,我们都会直接或间接的用到它们,这是因为Java是一门面向对象的语言,在学习类与对象的前提下,我们应当先对面向对象有所了解. 我们都知道,Java语言是一门面向对象的语言,实际上类与对象,就是面向对象编程思想的重要基础. 面向对象编程思想概述 面向对象的开发思想可以说是人类最自然的一种思考方式,它将所有预处理的问题抽象成为对象,同时了解这些对象的相应属性以及展示这些

(一)Python入门-6面向对象编程:07面向对象三大特征(封装、继承、多态)-继承

一:面向对象三大特征介绍 Python是面向对象的语言,也支持面向对象编程的三大特性:继承.封装(隐藏).多态. 封装(隐藏) 隐藏对象的属性和实现细节,只对外提供必要的方法.相当于将“细节封装起来”,只 对外暴露“相关调用方法”. 通过前面学习的“私有属性.私有方法”的方式,实现“封装”.Python 追求简洁的语法,没有严格的语法级别的“访问控制符”,更多的是依靠程序员自觉实现. 继承 继承可以让子类具有父类的特性,提高了代码的重用性. 从设计上是一种增量进化,原有父类设计不变的情况下,可以

Java笔记(07):面向对象--多态

1.final关键字 1 /* 2 final可以修饰类,方法,变量 3 4 特点: 5 final可以修饰类,该类不能被继承. 6 final可以修饰方法,该方法不能被重写.(覆盖,复写) 7 final可以修饰变量,该变量不能被重新赋值.因为这个变量其实常量. 8 9 常量: 10 A:字面值常量 11 "hello",10,true 12 B:自定义常量 13 final int x = 10; 14 */ 15 16 //final class Fu //无法从最终Fu进行继承

07 面向对象(下)

作者:thoughtInShare 出处:http://www.cnblogs.com/thoughtInShare 欢迎转载,也请保留这段声明.谢谢! 1.抽象类 之所以引进抽象类的概念是因为某些情况下,父类只需要告诉子类应该包含什么样的方法,但是没有必要实现这些具体方法,而由子类来是实现: 抽象方法使用abstract来修饰,含有抽象方法的类只能定义因此,为抽象类,但是抽象方法可以没有抽象类: 因此,抽象类无法使用new关键字来创建对象:只能当做作父类被其他子类继承:以发挥多态的优势,使得程