|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
也得学会了PHP。然后再学,见异思迁是最不可取的,狗熊掰玉米就是这个道理,如果经常中途放弃,只能是一无所获,还浪费了N多的时间和经历,得不偿失,最重要的是,你会被别人瞧不起。
■pdo为什么物?pod(php data object)扩大在php5中到场,php6中将默许识用pdo毗连数据库,一切非pdo扩大将会在php6被从扩大中移除。该扩大供应php内置类 pdo来对数据库停止会见,分歧数据库利用不异的办法名,处理数据库毗连不一致的成绩。我是设置装备摆设在windows下做开辟用的。■pdo的方针
供应一种轻型、明晰、便利的 api
一致各类分歧 rdbms 库的共有特征,但不扫除更初级的特征。
经由过程 php 剧本供应可选的较大水平的笼统/兼容性。
■pdo的特色:
功能。pdo 从一入手下手就吸收了现无数据库扩大胜利和掉败的经历经验。由于 pdo 的代码是全新的,所以咱们无机会从头入手下手设计功能,以使用 php 5 的最新特征。
才能。pdo 旨在将罕见的数据库功效作为基本供应,同时供应关于 rdbms 共同功效的便利会见。
复杂。pdo 旨在使您可以轻松利用数据库。api 不会强行参与您的代码,同时会清晰地标明每一个函数挪用的进程。
运转时可扩大。pdo 扩大是模块化的,使您可以在运转时为您的数据库后端加载驱动法式,而不用从头编译或从头装置全部 php 法式。例如,pdo_oci 扩大会替换 pdo 扩大完成 oracle 数据库 api。还有一些用于 mysql、postgresql、odbc 和 firebird 的驱动法式,更多的驱动法式尚在开辟。
■装置pdo
我这里是windows下开辟用的pdo扩大,如果你要在linux下装置设置装备摆设,请到其余中央寻觅。
版本请求:php5.1和今后版本的法式包里已带了;php5.0.x则要到pecl.php.net下载,放到你的扩大库,就是php地点的文件夹的ext文件夹下;手册上说5.0之前的版本不克不及运转pdo扩大。设置装备摆设:
修正你的php.ini设置装备摆设文件,使它撑持pdo.(php.ini这个器材没有弄懂的话,先弄清晰,要修正挪用你的phpinfo()函数所显示的谁人php.ini)把extension=php_pdo.dll后面的分号去失落,分毫是php设置装备摆设文件正文符号,这个扩大是必需的。往下还有
;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll各各扩大所对应的数据库是:
driver name supported databases pdo_dblib freetds / microsoft sql server / sybase pdo_firebird firebird/interbase 6 pdo_informix ibm informix dynamic server pdo_mysql mysql 3.x/4.x pdo_oci oracle call interface pdo_odbc odbc v3 (ibm db2, unixodbc and win32 odbc) pdo_pgsql postgresql pdo_sqlite sqlite 3 and sqlite 2 你要利用哪一种数据库,只需把响应的扩大前的正文符号";"去失落就能够了。
■利用pdo
我这里假定你已装好mysql了,如果没装的话,费事先想举措装上,我的是mysql5.0.22,黑夜路人用的是mysql 4.0.26也能够用。★数据库的毗连:
咱们经由过程上面的例子来剖析pdo毗连数据库,
<?php
$dbms='mysql'; //数据库类型 oracle 用odi,关于开辟者来讲,利用分歧的数据库,只需改这个,不必记住那末多的函数了
$host='localhost'; //数据库主机名
$dbname='test'; //利用的数据库
$user='root'; //数据库毗连用户名
$pass=''; //对应的暗码
$dsn="$dbms:host=$host;dbname=$dbname";
//
try {
$dbh = new pdo($dsn, $user, $pass); //初始化一个pdo对象,就是创立了数据库毗连对象$dbh
echo "毗连胜利<br/>";
/*你还可以停止一次搜刮操作
foreach ($dbh->query('select * from foo') as $row) {
print_r($row); //你可以用 echo($global); 来看到这些值
}
*/
$dbh = null;
} catch (pdoexception $e) {
die ("error!: " . $e->getmessage() . "<br/>");
}
//默许这个不是长毗连,假如需求数据库长毗连,需求最初加一个参数:array(pdo::attr_persistent => true) 酿成如许:
$db = new pdo($dsn, $user, $pass, array(pdo::attr_persistent => true));
?>
★数据库查询:
下面咱们已停止了一次查询,咱们还可使用以下的查询:
<?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::setattribute()的参数: pdo::attr_case: 强迫列名酿成一种格局,具体以下(第二个参数):
pdo::case_lower: 强迫列名是小写.
pdo::case_natural: 列名依照原始的体例
pdo::case_upper: 强迫列名为大写.
pdo::attr_errmode: 毛病提醒.
pdo::errmode_silent: 不显示毛病信息,只显示毛病码.
pdo::errmode_warning: 显示正告毛病.
pdo::errmode_exception: 抛出异常.
pdo::attr_oracle_nulls (不单单是oracle无效,其余数据库也无效): )指定命据库前往的null值在php中对应的数值。
pdo::null_natural: 不变.
pdo::null_empty_string: empty string is converted to null.
pdo::null_to_string: null is converted to an empty string.
pdo::attr_stringify_fetches: convert numeric values to strings when fetching. requires bool.
pdo::attr_statement_class: set user-supplied statement class derived from pdostatement. cannot be used with persistent pdo instances. requires array(string classname, array(mixed constructor_args)).
pdo::attr_autocommit (available in oci, firebird and mysql): whether to autocommit every single statement.
pdo::mysql_attr_use_buffered_query (available in mysql): use buffered queries.
例子中的$rs->setfetchmode(pdo::fetch_assoc);是pdostatement::setfetchmode(),对前往类型的声明。
有以下:
pdo::fetch_assoc -- 联系关系数组模式
pdo::fetch_num -- 数字索引数组模式
pdo::fetch_both -- 二者数组模式都有,这是缺省的
pdo::fetch_obj -- 依照对象的模式,相似于之前的 mysql_fetch_object()
更多前往类型声明(pdostatement::办法名)看手册。
★拔出,更新,删除数据,
$db->exec("delete from `xxxx_menu` where mid=43");
复杂的总结一下下面的操作:
查询操作次要是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 毗连到了 mysql,在收回查询之前,您应当了解 pdo 是若何办理事务的。假如之前没有接触过事务,那末起首要晓得事务的 4 个特点:原子性(atomicity)、分歧性(consistency)、自力性(isolation)和耐久性(durability),即 acid。用门外汉的话说,关于在一个事务中履行的任何任务,即便它是分阶段履行的,也必定可以包管该任务会平安地使用于数据库,而且在任务被提交时,不会遭到来自其他毗连的影响。事务性任务可以依据恳求主动撤消(假定您还没有提交它),这使得剧本中的毛病处置变得加倍轻易。
事务凡是是经由过程把一批更改积储起来、使之同时失效而完成的。如许做的优点是可以大大进步这些更新的效力。换句话说,事务可使剧本更快,并且能够更强健(不外需求准确地利用事务才干取得如许的优点)。
不幸的是,并非每种数据库都撑持事务(mysql5撑持事务,mysql4我不晓得),所以当第一次翻开毗连时,pdo 需求在所谓的“主动提交(auto-commit)”形式下运转。主动提交形式意味着,假如数据库撑持事务,那末您所运转的每个查询都有它本人的隐式事务,假如数据库不撑持事务,每一个查询就没有如许的事务。假如您需求一个事务,那末必需利用 pdo::begintransaction() 办法来启动一个事务。假如底层驱动法式不撑持事务,那末将会抛出一个 pdoexception(不管毛病处置设置是如何的:这老是一个严重毛病形态)。在一个事务中,可使用 pdo::commit() 或 pdo::rollback() 来停止该事务,这取决于事务中运转的代码是不是胜利。
当剧本停止时,或当一个毗连行将被封闭时,假如有一个未完成的事务,那末 pdo 将主动回滚该事务。这是一种平安办法,有助于防止在剧本非正常停止时呈现纷歧致的情形 ―― 假如没有显式地提交事务,那末假定有某个中央会呈现纷歧致,所以要履行回滚,以包管数据的平安性。
//例子来自http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505furlong/index.html
try {
$dbh = new pdo('odbc:sample', 'db2inst1', 'ibmdb2',
array(pdo_attr_persistent => true));
echo "connected\n";
$dbh->setattribute(pdo_attr_errmode, pdo_errmode_exception);
$dbh->begintransaction();
$dbh->exec("insert into staff (id, first, last) values (23, 'joe', 'bloggs')");
$dbh->exec("insert into salarychange (id, amount, changedate)
values (23, 50000, now())");
$dbh->commit();
} catch (exception $e) {
$dbh->rollback();
echo "failed: " . $e->getmessage();
}
在下面的示例中,假定咱们为一个新雇员创立一组条目,这个雇员有一个 id 号,即 23。除输出这团体的根基数据外,咱们还需求纪录雇员的薪水。两个更新分离完成起来很复杂,但经由过程将这两个更新包含在 begintransaction() 和 commit() 挪用中,就能够包管在更改完成之前,其别人没法看到更改。假如产生了毛病,catch 块可以回滚事务入手下手以来产生的一切更改,并打印出一条毛病动静。
并非必定要在事务中作出更新。您也能够收回庞杂的查询来提取数据,还可使用那种信息构建更多的更新和查询。当事务在举动时,可以包管其别人在任务停止傍边没法作出更改。现实上,这不是 100% 的准确,但假如您之前没有传闻过事务的话,如许引见也何尝不成。
★预处置语句和存储进程
良多更成熟的数据库都撑持预处置语句的概念。甚么是预处置语句?您可以把预处置语句看做您想要运转的 sql 的一种编译过的模板,它可使用变量参数停止定制。预处置语句可以带来两大优点:
查询只需解析(或筹办)一次,然而可以用不异或分歧的参数履行屡次。当查询筹办好后,数据库将剖析、编译和优化履行该查询的企图。关于庞杂的查询,这个进程要花对照长的工夫,假如您需求以分歧参数屡次反复不异的查询,那末该进程将大大下降使用法式的速度。经由过程利用预处置语句,可以免反复剖析/编译/优化周期。简言之,预处置语句利用更少的资本,因此运转得更快。
供应给预处置语句的参数不需求用引号括起来,驱动法式会处置这些。假如使用法式独有地利用预处置语句,那末可以确保没有 sql 入侵产生。(但是,假如您依然将查询的其他局部创立在不受信赖的输出之上,那末就依然存在风险)。
预处置语句是如斯有效,乃至 pdo 实践上打破了在方针 4 中设下的划定规矩:假如驱动法式不撑持预处置语句,那末 pdo 将仿真预处置语句。
实例:pdo的使用例子:
<?php
$dbms='mysql'; //数据库类型 oracle 用odi,关于开辟者来讲,利用分歧的数据库,只需改这个,不必记住那末多的函数了
$host='localhost'; //数据库主机名
$dbname='test'; //利用的数据库
$user='root'; //数据库毗连用户名
$pass=''; //对应的暗码
$dsn="$dbms:host=$host;dbname=$dbname";
class db extends pdo {
public function __construct(){
try {
parent::__construct("$globals[dsn]", $globals['user'], $globals['pass']);
} catch (pdoexception $e) {
die("error: " . $e->__tostring() . "<br/>");
}
}
public final function query($sql){
try {
return parent::query($this->setstring($sql));
}catch (pdoexception $e){
die("error: " . $e->__tostring() . "<br/>");
}
}
private final function setstring($sql){
echo "我要处置一下$sql";
return $sql;
}
}
$db=new db();
$db->setattribute(pdo::attr_case, pdo::case_upper);
foreach ($db->query('select * from xxxx_menu') as $row) {
print_r($row);
}
$db->exec('delete from `xxxx_menu` where mid=43');
?>
4.php手册
★ 至此,您已经由过程 pdo 毗连到了 mysql,在收回查询之前,您应当了解 pdo 是若何办理事务的。假如之前没有接触过事务,那末起首要晓得事务的 4 个特点:原子性(atomicity)、分歧性(consistency)、自力性(isolation)和耐久性(durability),即 acid。用门外汉的话说,关于在一个事务中履行的任何任务,即便它是分阶段履行的,也必定可以包管该任务会平安地使用于数据库,而且在任务被提交时,不会遭到来自其他毗连的影响。事务性任务可以依据恳求主动撤消(假定您还没有提交它),这使得剧本中的毛病处置变得加倍轻易。 事务凡是是经由过程把一批更改积储起来、使之同时失效而完成的。如许做的优点是可以大大进步这些更新的效力。换句话说,事务可使剧本更快,并且能够更强健(不外需求准确地利用事务才干取得如许的优点)。 不幸的是,并非每种数据库都撑持事务(mysql5撑持事务,mysql4我不晓得),所以当第一次翻开毗连时,pdo 需求在所谓的“主动提交(auto-commit)”形式下运转。主动提交形式意味着,假如数据库撑持事务,那末您所运转的每个查询都有它本人的隐式事务,假如数据库不撑持事务,每一个查询就没有如许的事务。假如您需求一个事务,那末必需利用 pdo::begintransaction() 办法来启动一个事务。假如底层驱动法式不撑持事务,那末将会抛出一个 pdoexception(不管毛病处置设置是如何的:这老是一个严重毛病形态)。在一个事务中,可使用 pdo::commit() 或 pdo::rollback() 来停止该事务,这取决于事务中运转的代码是不是胜利。 当剧本停止时,或当一个毗连行将被封闭时,假如有一个未完成的事务,那末 pdo 将主动回滚该事务。这是一种平安办法,有助于防止在剧本非正常停止时呈现纷歧致的情形 ―― 假如没有显式地提交事务,那末假定有某个中央会呈现纷歧致,所以要履行回滚,以包管数据的平安性。 本文链接http://www.cxybl.com/html/wlbc/Php/20120531/27131.htmlHTML中的任何元素都要亲自实践,只有明白了什么元素会起到什么效果之后,你才会记忆深刻,而一味的啃书,绝对是不行的,我想大部分新手之所以觉得概念难学,大部分是一个字“懒”,懒是阻止进步的最大敌人,所以克服掉懒的习惯,才能更快的学好一样东西。 |
|