PHP中PDO基础教程 入门级


Posted in PHP onSeptember 04, 2011

PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么 php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等扩展来连接MySQL、PostgreSQL、MS SQL Server、SQLite,同样的,我们必须借助 ADOdb、PEAR::DB、PHPlib::DB之类的数据库抽象类来帮助我们,无比烦琐和低效,毕竟,php代码的效率怎么能够我们直接用C/C++写的扩展斜率高捏?所以嘛,PDO的出现是必然的,大家要平静学习的心态去接受使用,也许你会发现能够减少你不少功夫哦。

安装PDO
我是在Windows XP SP2 上面,所以嘛,整个过程都是在Windows行进行的啦,至于Linux/FreeBSD 等平台,请自行查找资料设置安装。
我的是PHP 5.1.4,已经自带有了php_pdo.dll的扩展,不过需要稍微设置一下才能使用。
打开 c:\windows\php.ini ,那是我的PHP配置文件,找到下面这行:
extension_dir

这个就是我们扩展存在的目录,我的PHP 5扩展是在:C:\php5\ext,那么我就把这行改成:

extension_dir = "C:/php5/ext"

然后再往php.ini下面找到:
; Dynamic Extensions ; 

下面有一堆类似 ;extension=php_mbstring.dll 的东西,这里就是PHP扩展加载的配置了,我们再最后面添加上我们PDO的扩展: 
extension=php_pdo.dll 
extension=php_pdo_mysql.dll 
extension=php_pdo_pgsql.dll 
extension=php_pdo_sqlite.dll 
extension=php_pdo_mssql.dll 
extension=php_pdo_odbc.dll 
extension=php_pdo_firebird.dll 
;extension=php_pdo_oci8.dll

各种PDO的驱动,能给加上的全给加上,不过后面的php_pdo_oci8.dll,因为我没有安装Oralce数据库,所以没有这个,就使用分号注释掉它。然后重启我们的Web服务器, IIS/Apache,我的是IIS,嘿嘿,表鄙视我,在Windows上,简单嘛。重启后,在我们Web服务器的文档目录下写一个phpinfo.php的文件,加上这些:
<? 
 phpinfo(); 
?>

输出的内容中,如果你能够顺利的看到:
PDO
PDO support enabled
PDO drivers mysql, pgsql, sqlite, mssql, odbc, firebird
后面有各种驱动的说明:PDO_Firebird,pdo_mssql,pdo_mysql,PDO_ODBC,pdo_pgsql,pdo_sqlite。那么,恭喜你安装成功了,否则请仔细检查上面的步骤。

PDO教程

我用的是MySQL 4.0.26,但是我个人推荐大家使用 MySQL 4.1.x 或者 MySQL 5.0.x,因为那些版本有很多有趣的东西值得去学习。我们这里PDO需要连接的就是我的MySQL 4.0啦,如果你没有安装MySQL,请自行安装。我们建立好了MySQL,并且在test库里添加了表foo,包括 id,name,gender,time等四个字段。

我们开始构造第一个PDO应用,建立一个pdo.php文件在Web文档目录下:

<?php 
 $dsn = "mysql:host=localhost;dbname=test"; 
 $db = new PDO($dsn, 'root', ''); 
 $count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='男',time=NOW()"); 
 echo $count; 
 $db = null; 
?>

$dsn = "mysql:host=localhost;dbname=test";

就是构造我们的DSN(数据源),看看里面的信息包括:数据库类型是mysql,主机地址是localhost,数据库名称是test,就这么几个信息。不同数据库的数据源构造方式是不一样的。
$db = new PDO($dsn, 'root', '');

初始化一个PDO对象,构造函数的参数第一个就是我们的数据源,第二个是连接数据库服务器的用户,第三个参数是密码。我们不能保证连接成功,后面我们会讲到异常情况,这里我们姑且认为它是连接成功的。
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='男',time=NOW()");
echo $count;

调用我们连接成功的PDO对象来执行一个查询,这个查询是一个插入一条记录的操作,使用PDO::exec() 方法会返回一个影响记录的结果,所以我们输出这个结果。最后还是需要结束对象资源:
$db = null;

默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db = new PDO($dsn, 'root', '', array(PDO::ATTR_PERSISTENT => true));

一次操作就这么简单,也许跟以前的没有太大区别,跟ADOdb倒是有几分相似。

PDO进阶教程

如果我们想提取数据的话,那么就应该使用数据获取功能。(下面用到的$db都是上面已经连接好的对象)

<?php 
 foreach($db->query("SELECT * FROM foo")){ 
print_r($row); 
 } 
?>

我们也可以使用这种获取方式:
<?php 
 $rs = $db->query("SELECT * FROM foo"); 
 while($row = $rs->fetch()){ 
print_r($row); 
 } 
?>

如果想一次把数据都获取到数组里可以这样:
<?php 
$rs = $db->query("SELECT * FROM foo"); 
$result_arr = $rs->fetchAll(); 
print_r($result_arr); 
?>

输出的结果如下:
Array 
([0] => Array( 
 [id] => 1 
 [0] => 1 
 [name] => heiyeluren 
 [1] => heiyeluren 
 [gender] => 男 
 [2] => 男 
 [time] => 2006-10-28 23:14:23 
 [3] => 2006-10-28 23:14:23 
) 
}

我们看里面的记录,数字索引和关联索引都有,浪费资源,我们只需要关联索引的:
<?php 
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER); 
$rs = $db->query("SELECT * FROM foo"); 
$rs->setFetchMode(PDO::FETCH_ASSOC); 
$result_arr = $rs->fetchAll(); 
print_r($result_arr); 
?>

看上面的代码,setAttribute() 方法是设置部分属性,主要属性有:PDO::ATTR_CASE、PDO::ATTR_ERRMODE等等,我们这里需要设置的是PDO::ATTR_CASE,就是我们使用关联索引获取数据集的时候,关联索引是大写还是小写,有几个选择:

PDO::CASE_LOWER -- 强制列名是小写
PDO::CASE_NATURAL -- 列名按照原始的方式
PDO::CASE_UPPER -- 强制列名为大写

我们使用setFetchMode方法来设置获取结果集的返回值的类型,同样类型还有:

PDO::FETCH_ASSOC -- 关联数组形式
PDO::FETCH_NUM -- 数字索引数组形式
PDO::FETCH_BOTH -- 两者数组形式都有,这是缺省的
PDO::FETCH_OBJ -- 按照对象的形式,类似于以前的 mysql_fetch_object()

当然,一般情况下我们是使用PDO::FETCH_ASSOC,具体使用什么,按照你自己的需要,其他获取类型参考手册。

除了上面这种获取数据的方式,还有这种:

<?php 
$rs = $db->prepare("SELECT * FROM foo"); 
$rs->execute(); 
while($row = $rs->fetch()){ 
 print_r($row); 
} 
?>

其实差不多啦。如果你想获取指定记录里一个字段结果的话,可以使用 PDOStatement::fetchColumn():
<?php 
$rs = $db->query("SELECT COUNT(*) FROM foo"); 
$col = $rs->fetchColumn(); 
echo $col; 
?>

一般使用fetchColumn()来进行count统计或者某些只需要单字段的记录很好操作。

简单的总结
查询操作主要是PDO::query()、PDO::exec()、PDO::prepare()。PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作,PDO::exec()主要是针对没有结果集合返回的操作,比如INSERT、UPDATE、DELETE等操作,它返回的结果是当前操作影响的列数。PDO::prepare()主要是预处理操作,需要通过$rs->execute()来执行预处理里面的SQL语句,这个方法可以绑定参数,功能比较强大,不是本文能够简单说明白的,大家可以参考手册和其他文档。 获取结果集操作主要是:PDOStatement::fetchColumn()、PDOStatement::fetch()、PDOStatement::fetchALL()。PDOStatement::fetchColumn() 是获取结果指定第一条记录的某个字段,缺省是第一个字段。PDOStatement::fetch() 是用来获取一条记录,PDOStatement::fetchAll()是获取所有记录集到一个中,获取结果可以通过PDOStatement::setFetchMode来设置需要结果集合的类型。

另外有两个周边的操作,一个是PDO::lastInsertId()和PDOStatement::rowCount()。PDO::lastInsertId()是返回上次插入操作,主键列类型是自增的最后的自增ID。PDOStatement::rowCount()主要是用于PDO::query()和PDO::prepare()进行DELETE、INSERT、UPDATE操作影响的结果集,对PDO::exec()方法和SELECT操作无效。

从上面的使用看出,PDO功能确实强大,另外还有一些内容我没有讲到,比如绑定参数、预处理、存储过程、事务处理等等功能。另外还有不同数据扩 DSN的构造,Oracle数据库自己很多特殊的东西,都需要深入去学习理解,这篇文章就只是简单的描述了一些入门知识,算是对PDO一个简单的了解吧。

PHP 相关文章推荐
PHP 数字左侧自动补0
Mar 31 PHP
php中通过curl模拟登陆discuz论坛的实现代码
Feb 16 PHP
php 获取本地IP代码
Jun 23 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
Apr 28 PHP
PHP使用CURL获取302跳转后的地址实例
May 04 PHP
在Mac上编译安装PHP7的开发环境
Jul 28 PHP
全面解读PHP的Yii框架中的日志功能
Mar 17 PHP
PHP简单实现生成txt文件到指定目录的方法
Apr 25 PHP
Smarty环境配置与使用入门教程
May 11 PHP
PHP开发制作一个简单的活动日程表Calendar
Jun 20 PHP
PHP实现多关键字加亮功能
Oct 21 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
PHP中PDO的错误处理
Sep 04 #PHP
php中将网址转换为超链接的函数
Sep 02 #PHP
php ajax 静态分页过程形式
Sep 02 #PHP
php中防止伪造跨站请求的小招式
Sep 02 #PHP
10个实用的PHP代码片段
Sep 02 #PHP
PHP文件操作实现代码分享
Sep 01 #PHP
深入探讨PHP中的内存管理问题
Aug 31 #PHP
You might like
用PHP 4.2书写安全的脚本
2006/10/09 PHP
微信公众平台开发之配置与请求
2015/08/26 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
node实现登录图片验证码的示例代码
2018/04/20 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
python实现对一个完整url进行分割的方法
2015/04/29 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
解决python 输出是省略号的问题
2018/04/19 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
python3.7简单的爬虫实例详解
2019/07/08 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
新闻网站实习自我鉴定
2013/09/25 职场文书
初中三年学生的学习自我评价
2013/11/13 职场文书
校园招聘策划书
2014/01/09 职场文书
大学生入党思想汇报
2014/01/14 职场文书
个人公开承诺书
2014/03/28 职场文书
《大江保卫战》教学反思
2014/04/11 职场文书
继承公证书格式
2015/01/26 职场文书
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS