|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
既然选择了PHP,就要坚持学下去!大家有没有问自己为什么会选择学习PHP呢?就我个人而言,完全是因为兴趣,因为我的专业和计算机完全无关,但是就是对编程很赶兴趣,尤其对网络编程、web开发特别赶兴趣。php5 PDO(PHP Data Object) 是PHP 5新出来的器材,在PHP 6都要出来的时分,PHP 6只默许利用PDO来处置数据库,将把一切的数据库扩大移到了PECL,那末默许就是没有了咱们喜欢的php_mysql.dll之类的了,那怎样办捏,咱们只要与时俱进了,我就小试了一把PDO。(本文只是入门级的,高手可以略过,呵呵)
【PDO是啥】
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();
?>
然后翻开咱们心爱的阅读器:IE/FireFox,我的是FireFox 2.0,刚下载的,很爽,不怕地痞软件,哈哈。
在阅读器外面输出:http://localhost/phpinfo.php,假如你的这个页面途径纷歧致,请自行输出。
输入的内容中,假如你可以顺遂的看到:
PDO
PDO support enabled
PDO drivers mysql, pgsql, sqlite, mssql, odbc, firebird
前面有各类驱动的申明,
PDO_Firebird,pdo_mssql,pdo_mysql,PDO_ODBC,pdo_pgsql,pdo_sqlite
那末,祝贺你装置胜利了,不然请细心反省下面的步调。
【牛刀小小实验】
我用的是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却是有几分类似。
【持续懂得】
假如咱们想提取数据的话,那末就应当利用数据获得功效。(上面用到的$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类的毛病信息和异常处置。
1. 面向对象的体例
先看看假如毗连毛病等的处置,利用面向对象的体例来处置:
<?php
try {
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$db = null;
} catch (PDOException $e) {
print "Error: " . $e->getMessage() . "<br/>";
die();
}
?>
这里使用咱们PHP 5面向对象的异常处置特点,假如外面有异常的话就初始化挪用PDOException来初始化一个异常类。
PDOException异常类的属性布局:
<?php
class PDOException extends Exception
{
public $errorInfo = null; // 毛病信息,可以挪用 PDO::errorInfo() 或 PDOStatement::errorInfo()来会见
protected $message; // 异常信息,可以试用 Exception::getMessage() 来会见
protected $code; // SQL形态毛病代码,可使用 Exception::getCode() 来会见
}
?>
这个异常处置类是集成PHP 5内置的异常处置类,咱们复杂的看一下PHP 5内置的异常处置类布局:
<?php
class Exception
{
// 属性
protected $message = 'Unknown exception'; // 异常信息
protected $code = 0; // 用户自界说异常代码
protected $file; // 产生异常的文件名
protected $line; // 产生异常的代码行号
// 办法
final function getMessage(); // 前往异常信息
final function getCode(); // 前往异常代码
final function getFile(); // 前往产生异常的文件名
final function getLine(); // 前往产生异常的代码行号
final function getTrace(); // backtrace() 数组
final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
}
?>
响应的,在代码中可以适合的挪用 getFile() 和 getLine() 来停止毛病定位,更便利的停止调试。
2. 利用面向进程的办法
先看代码:
<?
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$rs = $db->query("SELECT aa,bb,cc FROM foo");
if ($db->errorCode() != '00000'){
print_r($db->errorInfo());
exit;
}
$arr = $rs->fetchAll();
print_r($arr);
$db = null;
?>
PDO和PDOStatement对象有errorCode() 和 errorInfo() 办法,假如没有任何毛病, errorCode() 前往的是: 00000 ,不然就会前往一些毛病代码。errorInfo() 前往的一个数组,包含PHP界说的毛病代码和MySQL的毛病代码和毛病信息,数组布局以下:
Array
(
[0] => 42S22
[1] => 1054
[2] => Unknown column 'aaa' in 'field list'
)每次履行查询今后,errorCode() 的了局都是最新的,所以咱们可以很轻易本人掌握毛病信息显示。
【复杂总结】
从下面的利用看出,PDO功效的确壮大,别的还有一些内容我没有讲到,好比绑定参数、预处置、存储进程、事务处置等等功效。别的还有分歧数据扩 DSN的机关,Oracle数据库本人良多特别的器材,都需求深切去进修了解,这篇文章就只是复杂的描写了一些入门常识,算是对PDO一个复杂的懂得吧。
[ 参考材料 ]
PHP 5 数据对象 (PDO) 笼统层与 Oracle
也或许是因为我还没有真正的学到深处吧,说实在的,PHP中的很多高级点的应用,如PHP类、PHP函数基本还是不懂吧! |
|