仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 822|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网站制作之PHP5中PDO的复杂利用

[复制链接]
再现理想 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:13:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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函数基本还是不懂吧!
若相依 该用户已被删除
沙发
发表于 2015-2-4 09:58:03 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
深爱那片海 该用户已被删除
板凳
发表于 2015-2-7 17:05:22 | 只看该作者
兴趣是最好的老师,百度是最好的词典。
乐观 该用户已被删除
地板
发表于 2015-2-9 17:52:16 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
admin 该用户已被删除
5#
发表于 2015-2-25 02:16:50 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
冷月葬花魂 该用户已被删除
6#
发表于 2015-3-5 13:55:01 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
第二个灵魂 该用户已被删除
7#
发表于 2015-3-14 21:54:45 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
海妖 该用户已被删除
8#
发表于 2015-3-15 14:47:28 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
愤怒的大鸟 该用户已被删除
9#
发表于 2015-3-22 01:18:51 | 只看该作者
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
谁可相欹 该用户已被删除
10#
发表于 2015-3-27 00:09:33 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
灵魂腐蚀 该用户已被删除
11#
发表于 2015-3-27 04:11:36 | 只看该作者
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
活着的死人 该用户已被删除
12#
发表于 2015-3-27 13:11:09 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
金色的骷髅 该用户已被删除
13#
发表于 2015-3-29 02:06:51 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
飘灵儿 该用户已被删除
14#
发表于 2015-4-4 08:45:34 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
爱飞 该用户已被删除
15#
发表于 2015-4-12 00:56:05 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
飘飘悠悠 该用户已被删除
16#
发表于 2015-4-21 17:17:09 | 只看该作者
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
变相怪杰 该用户已被删除
17#
发表于 2015-5-4 13:03:49 | 只看该作者
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
若天明 该用户已被删除
18#
发表于 2015-5-10 10:01:51 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
老尸 该用户已被删除
19#
发表于 2015-6-6 02:58:19 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 13:14

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表