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)]
一般步骤是:
tar -zxvf PDO_MYSQL-1.0..tgz
cd PDO_MYSQL-1.0.
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
make
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
0 //关闭自动提交
1 //开启自动提交
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注入、更快执行效率支持批量操作.
*详见 PDO预处理
6、pdo事务机制
概要:将多条sql操作(增删改)作为一个操作单元,要么都成功,要么都失败.
单条数据不用事务处理
*详见 PDO事务处理
PHP面向对象07_PDO的更多相关文章
- PHP数据库操作:从MySQL原生API到PDO
本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对象.PDO操作MySQL数据库的. 为了后面的测试,先建立数据库表test.包含表名user,s ...
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
- 一起学 Java(二)面向对象
一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...
- js面向对象学习 - 对象概念及创建对象
原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- .NET 基础 一步步 一幕幕[面向对象之对象和类]
对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...
- 简单分析JavaScript中的面向对象
初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
随机推荐
- HTML5+CSS3学习笔记(一)
HTML5+CSS3概述 HTML5和CSS3不仅仅是两项新的Web技术标准,更代表了下一代HTML和CSS技术.虽然HTML5的标准规范还没有正式发布,但是未来的发展前景已经可以预见,那就是HTML ...
- 用户行为数据采集核心思维(APP、web数据采集/埋点)
关于数据采集(也就是所谓的埋点),有很多中形式,或者说方法.所有的数据采集都时围绕一个核心的三个点来做区别的处理. 数据采集核心思维三个点: 1.对象: 要采集谁,一个页面.一个按钮,页面或者按钮,就 ...
- jsQunit
1:什么是单元测试? 1.1:单元测试又称为模块测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.单元测试主要是用来检验程式的内部逻辑,也称为个体测试.结构测试或逻辑驱动测试.通常 ...
- where和having子句的区别
having子句可以让我们筛选成组后的各种数据,having子句在查询过程中慢于聚合语句 having的用法 having子句可以让我们筛选成组后的各种数据,having子句在查询过程中慢于聚合语句( ...
- 天气预报API(四):全国城市代码列表(“新编码”)
说明 天气预报API系列文章涉及到的天气网站10个左右,只发现了中国气象频道和腾讯天气城市代码参数特别: 暂且称 中国气象频道.腾讯天气使用的城市代码为 "新编码" 注:中国气象频 ...
- Linq学习工具及Lamada表达式
好东西.转载一个.以备学习 Linq学习工具: http://www.linqpad.net/ Lamada表达式: Func<int, int, int> IntPow = (x ...
- [Leetcode][JAVA] Interleaving String
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given:s1 = ...
- VIM使用(一) VIM插件管理利器-vundle
有关VIM的文件网上一大堆,这里只是记录一下我新配置环境的步骤.以备查看参考. sudo apt-get install gitgit clone https://github.com/gmarik/ ...
- CSS 布局入门
概述 Web 兴起之后,关于CSS的介绍和学习资料已经铺天盖地. 本文不涉及具体的CSS语法之类的,而是希望从初学者的角度,让没有接触或很少接触CSS的人能快速的了解 CSS 到底是什么以及如何使用. ...
- 对InvokeAction简略分析了解验证失败为什么Action还会继续执行
一.前言 有些同学使用AuthorizationFilter来进行用户是否登录验证,如果未登录就跳到登录页. 很简单的一个场景,但是有些同学会发现虽然验证失败了,但是整个Action还会执行一遍. 于 ...