小女巫 发表于 2015-2-4 00:18:16

PHP网页设计PEAR MDB 数据库笼统层 ―― 一次编写―...

基础这个东西是个比较笼统的概念,如果你之前学习过c语言, c语言被认为是数据|数据库   Write once - run anywhere
一次编写――到处运转

这是Java的一句行销标语,然而它同时也是PHP的关头特征之一。很多贸易模子依附于操作体系有关性来包管产物可以发卖给普遍的客户群体。因此,为何要把你本人绑在某种数据库厂商的身上呢?数据库笼统层使得你可以与数据库自力的开辟你的使用法式。然而,凡是情形下它们对功能的影响超越了你所但愿的,要末他们其实不足够笼统以消弭一切和特定命据库相干的代码。

这篇文章将教给我甚么?

这篇文章将对数据库笼统包 PEAR MDB 有一个很好的引见。文章的核心将是对 MDB 超出相似包所供应的更先辈的特征,例如数据类型笼统和基于 XML 的 schema 办理。对 PHP 和 SQL 的根基了解是保举的。

为何别的再要一个数据库类?

凡是, web 工程在客户已肯定了要利用那种 RDBMS (关系型数据库办理体系)以后被添加给已存在的 IT 基本布局。即便那并非由于分歧的预算能够影响的你选择何种数据用于安排的情形。终究,你作为开辟者能够复杂的偏好过不把本人绑在某个厂商身上。自此,意味着给每一个撑持的数据坚持版本或就义更多功能然而取得多于必需的易用性:走入 PEAR MDB 吧。

MDB 是着眼于使得编写 RDBMS 有关的 PHP 法式成为复杂的进程的数据库笼统层。大局部其他的 PHP 的所谓数据库笼统层牢牢给一切撑持的数据库供应了一个公用 API 和十分无限的笼统(大局部只是针对序列的)。MDB 另外一方面可以用来笼统一切数据库发送和吸收的数据。乃至数据库 schema 都能被界说为 RDBMS 有关的格局。然而它供应这些功效的同时依然坚持了很高的功能和复杂易用。这是经由过程深切察看两个盛行的数据库笼统层,PEAR DB 和 Metabase, 以后而且对它们停止了交融后取得的。并且在交融过程当中,趁着这个时机清算了它们交融后的 API 和任何影响功能的设计。

MDB 是如何呈现的?

早在 2001 年的秋季,我就在寻觅一种能够可以让我公司的法式框架与 RDBMS 自力的数据库笼统包。这个方针是把特定命据库相干的代码数目削减到零。我发明供应如许的功效的独一的一个包是 Metabase。然而 Metabase有一些局部是由于为了和 PHP3 兼容的让人不恬逸的 API。虽然如斯,咱们决意 Metabase 是咱们独一的选择。然而即便是在给 Metabase 增添了一特性能改善的补钉以后,咱们依然感应咱们保持了太多的功能。咱们在 2001 年的 PHP 国际会议上碰着了 Metabase 的作者,而且咱们议论了让像 Metabase 如许的器材成为 PEAR 工程一局部的优点。后来不久,在 PEAR 邮件列表上就 PEAR DB 和 Metabase 交融的能够的优点又入手下手了一场会商。在咱们公司停止了很多会商以后,咱们决意承当这个义务。数个月的艰苦任务以后,咱们如今有了 MDB 的第一个不乱的 release。

MDB 给你供应了甚么?

MDB 联合了 PEAR DB 和 Metabase 的大局部特征。实践上,PEAR DB 的特征中独一不再存在的是作为了局集前往一个对象。咱们保持了这个特征是由于这个特征不经常使用并且关于功能的丧失长短常分明的。很多开辟上的工夫用在了使得 API 尽量的好用。终究,MDB 十分洼地供应了这些功效最少和 PEAR DB 一样快并且比 Metabase 快良多。这些最主要地特征的列表:

OO 作风的 API
预筹办的查询摹拟
给一切传递出去和从数据库中掏出的数据的完整的数据类型笼统(包含 LOB 撑持)
事务撑持
数据库/表/索引/序列创立/丢弃/改动
RDBMS 有关的数据库 schema 办理
承继进 PEAR 框架(PEAR 装置法式,PEAR 毛病处置等)

那末它若何利用呢?

MDB 供应了一些十分先辈的笼统特征。记住这些特征只是供选择的是很主要的。然而在编写 RDBMS 有关的 PHP 法式时利用它们长短常主要的。一个展现利用 MDB 是何等复杂的例子在文章的开头的 "链接和文献" 局部。如后面所说,文章的核心是引见使得 MDB 与其他 PHP 数据库笼统层分歧的那些特征。你可以在随本期文章一同包装的 CD 中找到一切这些例子剧本的代码。

然而,起首咱们需求把 MDB 装置上去。利用 PEAR 装置法式这其实十分轻易。我不克不及在这篇文章中完全的讲述 PEAR 装置法式然而我传闻下一期将十分具体的会商 PEAR 框架的里里外外。让装置法式运转于 Windows 的任务在停止看成然而撑持依然有一点乖僻。关于 *nix 体系你需求 PHP 的 CGI 版本装置在了你的体系而且复杂地运转上面地号令:

lynx -source go-pear.org|php


在装置完成以后你只需求再输出一行号令那末就全体弄定了。

pear install MDB


假如后面的进程对你来讲不论用,老是有从 PEAR MDB 主页中直接取得包的选项。URL 列于文章的最初。

使用数据类型笼统

由于大局部数据库偏向于有一些特性或怪癖,关于MDB来讲把这些分歧的地方给开辟者埋没起来十分主要。MDB 经由过程界说本人的外部数据类型来到达这点:text,boolean,integer,decimal,float,date,time,time stamp,large objects(文件)。一切传递给数据库和从数据库获得的数据都能转换成 MDB 的外部格局或从数据库的外部格局转化回来。本节相干的例子剧本可以再 datatype 目次中找到。让咱们看看上面的查询:

$session = '098f6bcd4621d373cade4e832627b4f6';
// set time out to 30 minutes
$timeout = time()+60*30;
// SELECT query showing how the datatype conversion works
$query = 'SELECT createtime, user_id FROM sessions';
$query .= ' WHERE session = '.$session;
$query .= ' AND lastaccess < '.$timeout;


这个查询假如发送给数据库的话八成要掉败。缘由是存储在 $name 中的值需求转换为准确的字符串格局。这或许意味着 $name 的内容能够有特别的本义字符或被引号包抄。PEAR DB 为此供应了办法 DB:.quote()。在 MDB 中这个办法叫 MDB::getTextValue()。分歧的地方是 MDB 给每种后面所列的数据类型都供应了如许的函数。因此咱们也可以把 $timeout 转换为准确的格局。

// convert $timeout to the MDB timestamp format
$timeout = MDB_date::unix2Mdbstamp($timeout);
// SELECT query showing how the datatype conversion works
$query = 'SELECT createtime, user_id FROM sessions';
$query .= ' WHERE session = '.$mdb->getTextValue($session);
$query .= ' AND lastaccess < '.$mdb->getTimestampValue($timeout);


为了作个演示,让咱们假定我仅仅想要获得第一行。MDB::queryRow() 取得第一行,它释放了局集而且前往其内容,因此它恰是咱们所要的。

$result = $mdb->queryRow($query);


然而分歧的 RDBMS 前往像日期如许的数据时用的格局是分歧的。因而,假如咱们然后要对一些数据停止盘算,不论选择的 RDBMS 是甚么,把数据以不异的格局前往是主要的。这个可以由 MDB 半主动地完成。你一切需求做的是告知你的了局列将是甚么样的类型,MDB将处置转换的任务。最复杂的举措是把如许的信息传递给查询函数。

$types = array('timestamp', 'integer');
$result = $mdb->queryRow($query, $types);


这告知 MDB 了局集的第一列类型是 'timestamp' 和第二列是'integer'。一切查询函数可以承受如许的元信息作为可选的参数。数据还能过后用 MDB::setResultTypes() 来设置。取决于数据获得于的数据库,它然后将被响应的转换前往的数据。MDB 外部的 timestamps 的数据格局是遵守 ISO 8601 尺度的。其他像 PEAR::Date 如许的包可以处置这类格局。MDB 还在 MDB_Date 类中供应了一些数据格局转换函数,它们可以被可选的包括。

由于相当多的 RDBMS 以不异的办法前往整数数据,没有需要转换整数数据。因此,为了取得稍许的功能改善你可以这么做:

$types = array('timestamp');
$result = $mdb->queryRow($query, $types);


如许只要了局集的第一列会被转换。固然,假如 MDB 用于前往整数分歧的数据库,这能够成为一个成绩。但是,稍许的功能改良能够其实不值得冒这个风险。然而再一次的,它显示了这些特征的利用仅仅是供选择的。

Listing 1 展现了一个利用预筹办的查询的例子。假如你必需运转大批查询而独一的不同是数据传递给数据库,然而查询的布局仍是一样的,这些可以相当的便利。初级的数据库可以在内存中贮存解析好的查询来减速功能。

Listing 1

$alldata = array(
array(1, 'one', 'un'),
array(2, 'two', 'deux'),
array(3, 'three', 'trois'),
array(4, 'four', 'quatre')
);

$p_query = $mdb->prepareQuery('INSERT INTO numbers VALUES (?,?,?)');
$param_types = array('integer', 'text', 'text');

foreach ($alldata as $row) {
$mdb->execute($p_query, NULL, $row, $param_types);
}


在 $alldata 中贮存的一切四个数组将用于 execute 语句。数据将主动被转换为准确的格局。由于这是一个拔出语句,MDB::execute() 的第二个参数被设置为 NULL 由于咱们将没有任何了局列需求咱们设置数据类型。

在撑持的数据类型中还有 LOB (大对象),它使得咱们可以在数据库中贮存文件。二进制文件贮存在 BLOB (二进制大对象)中并且通俗文本文件贮存在 CLOB (字符大对象)中。在 MDB 中你仅仅可以利用预筹办的 INSERT 和 UPDATE 查询贮存 LOB。利用 MDBA::setParamBlob() 或 MDB::setParamClob() 你可以设置预筹办查询的 LOB 域的值。两个函数都预期传递一个 LOB 对象,而它可以利用 MDB::createLob() 创立。

$binary_lob = array(
'Type' => 'inputfile',
'FileName' => './myfile.gif'
);
$blob = $mdb->createLob($binary_lob);

$character_lob = array(
'Type' => 'data',
'Data' => 'this would be a very long string container the CLOB data'
);
$clob = $mdb->createLob($character_lob);


如你能看到的,MDB::createLob() 被传递一个关系数组。Type 键的值多是以下中的一个:data, inputfile 或 outputfile。前两个用于你想要把 LOB 写入数据库的时分。假如你有一个贮存在变量中的 LOB,你应该在 需求利用 inputfile 时从文件直接读取 LOB。最初,outpufile 应该在你想要从数据库中读取 LOB 时利用。取决于你是不是利用数据或 inputfile 你需求给 Filename 键或 Data 键指定一个值,像下面的例子那样。如今,咱们将把后面的 LOB 贮存到数据库中去。

$p_query = $mdb->prepareQuery('INSERT INTO files (id, b_data, c_data) VALUES (1, ?, ?)');

$mdb->setParamBlob($p_query, 1 , $blob, 'b_data');
$mdb->setParamClob($p_query, 2 , $clob, 'c_data');

$result = $mdb->executeQuery($p_query);


为了从数据库中获得下面的文件,咱们需求起首从数据库当选择数据而且利用 MDB::createLob() 创立 LOB 对象。此次咱们将设置 'Type' 为 'outputfile'

$mdb->query('SELECT b_data FROM files WHERE id = 1');

$binary_lob = array(
'Type' => 'outputfile',
'Result' => $result,
'Row' => 0,
'Field' => 'b_data',
'Binary' => 1,
'FileName' => './myfile2.gif'
);
$blob = $mdb->createLob($binary_lob);


如今咱们可以利用 MDB::readLob() 从了局集中读取 LOB。传递长度 0 给 MDB::readLob() 意味着全部 LOB 被读取和贮存在咱们后面指定的文件中。一旦义务完成了,咱们可以把资本释放了。你也能够设置任何大于零的长度而且利用一个 while 轮回反省 MDB::endofLob() 来读取 LOB。

$mdb->readLob($blob, $data, 0);


注重你不要把这个获得函数和 bulk 获得函数像 MDB::fetchAll()弄混了,由于这将在大局部 PHP 数据库扩大中招致成绩。在一些时分,MDB 能够可以利用 bulk 获得函数取得 LOB。

如咱们在这节所见,MDB 特征自己的原生数据类型集主动映照于数据库中的原生数据类型。这包管了不管咱们发送和从数据库吸收甚么样的数据,它都能与利用的 RDBMS 有关的利用不异的格局。如我在本节开篇已提到的,这分明需求数据库利用的数据类型是 MDB 预期的。这类需求被用于确保映照所消耗的价值很小。下一节将教给咱们 MDB 若何帮助在数据库中利用准确的数据类型。


利用 XML schema 文件

使用在上个段落中描写的特征,你能编写真实的数据库自力的法式。然而 MDB 测验考试向前加倍迈出一步:它答应你用 XML 界说你的 schema。一个办理器把这类 schema 转换为给每种 RDBMS 的需要的 SQL 语句。这意味着你能对一切撑持的 RDBMS 利用不异的 schema。本节的例子可以在 xml_schema 目次中找到。

咱们如今将从头编写一个 XML schema 文件。起首,咱们必需界说一个 XML 文档。数据库界说是包括在一个 database 标签当中的。数据库的名字是利用 name 标签界说的。create 标签告知办理器数据库是不是需求在它不存在的时分被创立。假如你把你的 schema 文件朋分成好几个文件你你起首提交给办理器的谁人文件中把 create 设置为 1。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<database>
<name>auth</name>
<create>1</create>
</database>


能够你已从数据库名 auth 猜出了这个数据库的目标是用于贮存复杂的验证法式的用户数据。Listing 2 界说了在个中咱们能贮存用户数据的表。

Listing 2

<table>
<name>users</name>
<declaration>
<field>
<name>user_id</name>
<type>integer</type>
<notnull>1</notnull>
<unsigned>1</unsigned>
<default>0</default>
</field>
<field>
<name>handle</name>
<type>text</type>
<length>20</length>
<notnull>1</notnull>
<default></default>
</field>
<field>
<name>is_active</name>
<type>boolean</type>
<notnull>1</notnull>
<default>N</default>
</field>
</declaration>
</table>


如你能看到的,如利用 XML 时可以预期的,器材变得有一些冗杂。不必忧虑:咱们有一个基于阅读器的东西称为 MDB_frontend 使得这个进程加倍复杂。我将在这篇文章的前面议论这个工程。能够这极为具体地表格描写的长处长短常分明。后面例子中的表格被称为 users 而且咱们界说了 3 个域:类型为整数的 user_id,类型为文本的 handle 和类型为逻辑型的 is_active。记住假如你如前一节那样传递了需要的元数据 MDB 为你处置类型笼统。你还不需求 MDB 把这些类型映照为你的 RDBMS 中的甚么。在每一个域声明中还能利用的其他标签是可选的:length,notnull,unsigned 和 default。

下一件咱们如今需求做的工作是经由过程在 user_id 域放置得当的索引确保 user_id 是独一的。索引界说就在声明标签以内(Listing 3)。

Listing 3:

<table>
<name>users</name>
<declaration>
<index>
<unique>1</unique>
<name>user_id_index</name>
<field>
<name>user_id</name>
<sorting>ascending</sorting>
</field>
</index>
</declaration>
</table>


在 listing 3 中的界说在域 user_id 中创立一个独一的上升排序的名为 user_id_index 的索引。固然,咱们可以复杂地添加别的一个域标签在索引界说中指定多于一个的域。咱们如今依然没有提到的是为咱们发生独一的用户 id 的序列。

<sequence>
<name>users_user_id</name>
<start>1</start>
<on>
<table>users</table>
<field>user_id</field>
</on>
</sequence>


上一个例子十分的绕弯。一行行看过去,咱们看到起首翻开一个 sequence 标签,随着一个指定序列名字的 name 标签。这以后随着一个界说序列初始值的 start 标签。如今,咱们翻开一个可选的 on标签。这儿咱们需求设置一个表中的指定域。这个信息是办理器用来把序列的值设置为 users 表的 user_id 域的最大值。假如 users 表是空的,作为替换利用的是 start 标签中指定的值。请注重在 start 标签中指定的值是咱们挪用 MDB::nextId() 前往的第一个值。

固然,你也能利用任何值初始化表。例如你能够想要用你老是想要包括在你的法式中的办理用户来初始化后面的表格。为了这么做,咱们需求把一个 initialization 标签添加给 table 标签。Listing 4 界说了一在别的一用 insert 标签包含的行以后的行。

Listing 4

<table>
<name>users</name>
<initialization>
<insert>
<field>
<name>user_id</name>
<value>1</value>
</field>
<field>
<name>handle</name>
<value>default</value>
</field>
<field>
<name>is_active</name>
<value>Y</value>
</field>
</insert>
</initialization>
</table>


如你从上个例子中能看到的那样,一切咱们需求做的就是给表的每一个域设定值。咱们如今已晓得了需要的基本常识来创立一个 MDB 的 XML schema。下一步是把这个 schema 文件传递给 MDB 办理器。

$manager = new MDB_Manager;
$input_file = 'auth.schema';
// we do not have to connect to a specify a specific database at this time
$dsn = "mysql://$user:$pass@$host";
$manager->connect($dsn);
$manager->updateDatabase($input_file, $input_file. '.before');


咱们如今有了一个新的名字叫 auth 的数据库,它有一个表叫 users。在域 user_id 有一个索引。并且在表中还有一行。咱们还有一个序列称为 users_user_id,它将被初始化为 1。因而序列中的下一个值就是 2。最初,schema 的一个拷贝以名字auth.schema.before 被创立。这是由于咱们给 MDB_Manger::updateDatabase() 传递了可选的第二个参数。鄙人一节咱们将看到为何要创立这个拷贝。

一切这些都十分使人惊异然而它变得更好。很多情形下法式需求在某些中央作出改动。例如咱们能够决意需求把表的名字从 users 酿成 people。咱们能够还需求增添一个域 pwd 来贮存暗码域(请反省 textbox 的保存字)。


保存字

咱们没有称谁人域为 password 的缘由是那是 Interbase 中一个域名的保存字。由于咱们需求 RDBMS 自力,MDB 办理器要末给出一个正告要末在 fail_on_invalid_names 选项被设置为真的时分(这是缺省值)掉败。

在曩昔的时分,你能够如今正处于把你一切已有的器材酿成这类新的 schema 的疾苦当中。然而因为 MDB 这些任务可以主动完成。在 listing 5 中是咱们对咱们的表格界说停止的修正:

Listing 5

<table>
<name>people</name>
<was>users</was>
<declaration>
<field>
<name>pwd</name>
<type>text</type>
<length>32</length>
<notnull>1</notnull>
<default></default>
</field>
</declaration>
</table>


如今咱们想要办理器来作出需要的改动,然而在此之前我像提一下能够的圈套。由于咱们把表从 users 改名为 people,咱们还需求把一切对本来名字的援用停止更改,好比咱们创立的序列。在 on 标签中的索引需求更改成指向 people 表。为了到达这个目标,咱们把 shcema 的新旧版本传递给办理器。这酒是为何咱们在第一次挪用 MDB_Manager::updateDatabase() 时咱们创立一个 .before 文件的缘由。这确保了咱们有一个旧版本的 shcema 来与新的版本停止对比。

$input_file = 'auth.schema';
$manager->updateDatabase($input_file, $input_file.'.before');


一切的就是如许!users 体现在称为 people 而且咱们也有了一个 pwd 域。

我如今要看看 XML schema 格局的最初一个特征。假如你想要编程性的利用办理器,这个特征特别主要。假定你有好几个有不异验证法式运转在你的数据库办事器的客户。 每一个客户有一个办事器运转在这个办事器有不异的 schema 只要巨大的区分:数据库的名字。能够为每一个客户独自保留 schema 文件是可行的由于更新周期能够不是一样的,这不是咱们例子验证法式的情形。这儿一切的客户同时更新。XML schema 文件答应咱们为此可使用变量。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<database>
<name><variable>name</variable></name>
</database>


咱们如今在运转时设置变量为恣意咱们需求的器材。

foreach($clients as $name) {
$variables = array('name' => $name)
$manager->updateDatabase($input_file, $input_file.'.before', $variables);
}


XML schema 办理是 MDB 供应的数据库笼统概念的别的一个十分主要的局部。它使得咱们坚持咱们的 schema 界说与特定的 RDBMS 有关。然而利用这个格局还确保了利用准确的原生数据类型因此 MDB 可以准确地映照它的原生数据类型。最初,由于数据是基于 XML 的,编写发生或读取 XML schema 文件的东西要轻易一些。


听起来不错然而我的使用法式已利用了……

大局部读者能够发明它们处于如许的地步――他们已有了大批运转于其他数据库笼统层的法式。因为 MDB 的出生,大局部 PEAR DB 的用户应该发明 MDB 感到上十分相似,由于 MDB 的 API 是基于 PEAR DB 的。Metabase 用户应该发明他们一切偏心的功效都在 MDB 中有对应的器材。XML schema 格局和 Metabase 中的是一摸一样的。一个完整的指点来引诱你把已写好的法式移植到 MDB 中超越了本文的局限,然而我将使用这个时机给一些提醒。假如你有任何详细的成绩,宁神的发信来扣问我。

为了把你的 PEAR DB 法式移植到 MDB,最好的出发点是 PEAR wrapper。你能利用 PEAR wrapper 来运转你的法式。wrapper 固然增添了一些额定承当,因此你能够有些想要移植到原生的接口。那末第一步是列出一切你法式以后利用的 PEAR DB 函数。然后看看 wrapper 从中找出任何 API 上的区分。有两个你要注重的关头区分:了局集不再是对象并且一切的答应你传递了局集的数据类型的查询办法将招致参数按次上的少量改动。第一个区分意味着不克不及再了局对象上挪用获得函数。

$result = $db->query($sql);
$row = $result->fetchRow();


你如今必需挪用 MDB 对象来停止获得:

$result = $mdb->query($sql);
$row = $mdb->fetchRow($result);


第二个区分经由过程察看 wrapper 可以等闲的被处理。如你再 wrapper 中能看到的,你可以再 MDB 希冀失掉了局集的数据类型的中央复杂地传递 NULL。如今,你地法式应该可以利用 MDB。固然,你如今没有真正失掉了 MDB 地初级特征长处的好处。这最有能够的是需求对你以后的数据库 schema 停止一些修改。办理器可以测验考试反向地从已存在的数据库中获得 XML schema 文件。一个十分复杂的前端可以在 MDB 包中找到:reverse_engineer_xml_schema.php 剧本。极有能够你将需求手动修改发生的 XML schema 恩见,然而它将给你一个很好的入手下手。

假如你想要把你已存在的法式从 Metabase 移植到 MDB 你将必需修改一切的函数挪用。检查 Metabase wrapper 需求修改甚么将变得十分分明。假如你晓得正则表达式你能够可以完成大局部如许的交换任务。不管若何,你应该向前而且运转你本来喜欢的初级笼统特征然而如今用的是 MDB。你能够注重失掉的是函数名变得加倍冗长了。假如你作一些功能测试,你也将看到可不雅的功能改良。


那末 MDB 未来会是甚么模样呢?

本文宣布时 MDB 能够已不再是本来的 1.0 release 了。在本来的 MySQL 和 PostGreSQL 驱动以后,MDB还将有一个 ODBC 驱动和能够的更多的驱动。这是 MDB 开辟过程当中存眷的关头区域之一。一旦 MDB 在驱动方面跟上了 PEAR DB,它很有能够成为 PEAR 框架中尺度的数据库笼统层。

然而还有别的一个开辟中的关头范畴:MDB_frontend 工程。MDB_frontend将成为基于 MDB 和 MDB 办理器的 phpMyadmin。有了这个东西,你将可以阅读贮存在 MDB 撑持的 RDBMS 中的数据库。MDB_frontend 将同时显示原生和 MDB 数据类型。摹拟的特征好比 MySQL 中的序列将被埋没。用户将仅仅看到一个序列列表而不是一个贮存序列指的表,而在 MySQL 中这就是序列是若何被摹拟的。并且 MDB_frontend 将匡助移植已存在的数据库来合适 MDB 预期利用的原生数据类型。它还将匡助创立和更新 XML schema 文件。一些早期的任务已完成了然而良多任务需求在公然宣布之前被添加。

驱动和 MDB_frontend 是以后开辟的一切核心,在 MDB 中还有很多用户能够需求的:像 bulk 获得 LOB 域的集成,其别人能够需求内部和主键撑持。如一向以来的那样假如你介入测试和完成,开源的器材将加速良多。然而我也很感激像特征需求合阳的反应。


一些文后的思虑

在数月的艰苦任务以后,MDB 正在以后的 PEAR DB 和 Metabase 用户中取得承认。我还但愿以后还没有被其他数据库笼统层压服的用户意想到 MDB 给他们的优点。固然,仍是有很多法式需求对 RDBMS 停止特别剪裁,关于这类情形像 MDB 如许的东西仅仅是增添了不用要的额定承当和限制。总的来讲,我十分乐意咱们在咱们的公司中作出向导 MDB 开辟的决意。在后来,我对测验考试同时取悦 PEAR DB 和 Metabase 的用户然而了局能够各处不奉迎几何有些忧虑。别的一个关怀的来历是 PHP 社区是不是将匡助其开辟。我十分乐意 PHP 社区来了而且匡助撰写驱动和 MDB 的中心。因此咱们以为这个项目是一个极大的胜利。咱们还一并信任 MDB 将失掉更大的改善。并且咱们对匡助 PHP 变得更好感应乐意。

关于作者
Lukas Smith 是 PEAR DB 的次要作者。它积极地给多个 PHP 开远项目停止奉献而且是专注于 PHP 开辟的 BackendMeida 公司的创立者。


链接 和 文献

PEAR MDB homepage: http://pear.php.net/package-info.php?package=MDB
PEAR MDB documentation: http://www.backendmedia.com/MDB/docs/
PEAR MDB sample script: http://cvs.php.net/co.php/pear/MDB/MDB_test.php
PEAR DB homepage: http://pear.php.net/package-info.php?package=DB
Metabase homepage: http://www.phpclasses.org/mirrors.html?page=%2Fbrowse.html%2Fpackage%2F20.html
Simple benchmark: http://freshmeat.net/screenshots/30313/PHP于1994年由Rasmus Lerdorf创建,刚刚开始是Rasmus Lerdorf为了要维护个人网页而制作的一个简单的用Perl语言编写的程序。

飘飘悠悠 发表于 2015-2-4 11:01:51

曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线\\\\\\\'_\\\\\\\' ;

活着的死人 发表于 2015-2-5 08:14:01

做为1门年轻的语言,php一直很努力。

因胸联盟 发表于 2015-2-11 08:01:31

Ps:以上纯属原创,如有雷同,纯属巧合

冷月葬花魂 发表于 2015-3-1 23:45:49

Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81

小妖女 发表于 2015-3-11 01:02:45

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

爱飞 发表于 2015-3-13 07:07:11

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

第二个灵魂 发表于 2015-3-18 20:05:37

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

透明 发表于 2015-3-21 02:37:19

php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。

兰色精灵 发表于 2015-3-26 23:11:31

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

灵魂腐蚀 发表于 2015-3-30 13:15:00

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

深爱那片海 发表于 2015-4-8 16:49:03

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

乐观 发表于 2015-4-10 06:43:20

做为1门年轻的语言,php一直很努力。

不帅 发表于 2015-4-16 05:00:11

在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、

莫相离 发表于 2015-4-19 10:02:07

小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。

再现理想 发表于 2015-4-25 10:39:55

我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。

海妖 发表于 2015-5-6 20:09:35

小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。

分手快乐 发表于 2015-5-6 23:10:23

说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年具体的记不清啦,囧。

老尸 发表于 2015-5-8 08:42:59

这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。

谁可相欹 发表于 2015-6-15 14:53:08

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
页: [1] 2
查看完整版本: PHP网页设计PEAR MDB 数据库笼统层 ―― 一次编写―...