|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
也许您在学习PHP的时候只想尽快的开发一个网站,也就会想我做网站,干嘛要学什么网页这些小儿科?不难看出,眼高手低的新手不在少数,这种思想无疑于建造空中楼阁,你不建地基,何来的房顶呢?ado 媒介
You say eether and I say eyether,
You say neether and I say nyther;
Eether, eyether, neether, nyther -
Let's call the whole thing off !
You like potato and I like po-tah-to,
You like tomato and I like to-mah-to;
Potato, po-tah-to, tomato, to-mah-to -
Let's call the whole thing off !
我爱听这首歌,特别是由Louis Armstrong 及 Ella 的二重唱版本。它显示出两个爱情中人的彼此竞争有多辛劳,也是关于相互让步并追求共通的地方的过程。
PHP可以用起码的精神和最多的乐趣来创立静态的网站,要创立静态网站咱们需求利用数据库来撷取登入账号信息、宣布静态旧事、贮存会商区的文章。就以利用最通用的 MySQL 数据来讲,你们公司已完成了如斯奇异的任务,让你们的网站比你们所能想象的还要知名。接着你们也发明MySQL没法敷衍实践的任务量了,是该改换数据库体系的时分了。
不幸地,在PHP中一切数据库的存取都有些纤细的分歧。与MySQL保持你要利用 mysql_connect(),当你决意晋级到 Oracle 或 Microsoft SQL Server 时,你必需分离改用 ocilogon() 或 mssql_connect()。更糟的是分歧保持所利用的参数也都纷歧样,有的数据库说 po-tato(土豆的发音),其余数据库又说 pota-to(土豆的另外一个发音),喔…..天啊。
咱们不要保持
当你需求确保你法式的可移植性的时分,一个叫做 ADODB 的数据库封包链接库已呈现了。它供应了共通的使用法式接口来跟一切撑持的数据库沟通,因而你不必保持!
ADODB是Active Data Object DataBase的缩写(很抱愧!玩盘算机的有时分不是很有原创性)。ADODB今朝撑持MySQL、PostgreSQL、Oracle、Interbase、Microsoft SQL Server、Access、FoxPro、Sybase、ODBC及ADO,你可以从 http://php.weblogs.com/adodb下载 ADODB。
MySQL的例子
PHP中最通用的数据库是MySQL,所以我想你会喜好上面的法式代码,它保持到 localhost 的 MySQL 办事器,数据库称号是 mydab,而且履行一个 SQL 的 select 指令查询,查询了局会一列列地印出来。
$db = mysql_connect("localhost", "root", "password");
mysql_select_db("mydb",$db);
$result = mysql_query("SELECT * FROM employees",$db);
if ($result === false) die("failed");
while ($fields = mysql_fetch_row($result)) {
for ($i=0, $max=sizeof($fields); $i < $max; $i++) {
print $fields[$i].' ';
}
print "<br>n";
}
上列的法式代码用色彩标出分段,第一段是保持的局部,第二段是履行SQL指令,最初一段则是显示字段,while轮回扫描了局的每列,而for轮回扫描到每列的字段。
接上去是以ADODB的法式代码失掉一样的了局:
include("adodb.inc.php");
$db = NewADOConnection('mysql');
$db->Connect("localhost", "root", "password", "mydb");
$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed");
while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
print $result->fields[$i].' ';
$result->MoveNext();
print "<br>n";
}
如今改成指向Oracle数据库,法式代码只需修正第二行成为 NewADOConnection('oracle'),让咱们看一下完全的法式代码...
与数据库保持
include("adodb.inc.php");
$db = NewADOConnection('mysql');
$db->Connect("localhost", "root", "password", "mydb");
保持的法式代码比起本来MySQL的法式代码有干练一些,由于咱们恰是需求更干练些。在ADODB咱们利用对象导向的办法来办理多样数据库的庞杂性,咱们用分歧类(class)来掌握分歧数据库。假设你不熟习对象导向法式设计,别忧虑!一切的庞杂工作都埋没在 NewADOConnection() 函数以后。
为了节俭内存,咱们只加载与你所保持数据库相干的PHP法式代码,咱们经由过程挪用NewADOConnection(databasedriver)来完成这件事,正当的数据库驱动法式包括 mysql,mssql,oracle,oci8,postgres,sybase,vfp,access,ibase 和很多其它的驱动法式。
接着咱们经由过程挪用 NewADOConnection() 来从保持种别发生一个新的对象实体,最初咱们利用 $db->Connect() 来保持数据库。
履行SQL指令
$result = $db->Execute("SELECT * FROM employees");
if ($result === false) die("failed");
直接传送SQL指令到办事器,当做功履行以后,Execute()将传回一个recordset对象,你可以好像下面所列来反省$result。
一个初学者轻易搅浑的议题是,在ADODB有两品种型的对象,保持对象和recordset对象,咱们什么时候用这些对象呢?
保持对象($db)是担任保持数据库,格局化你的SQL查询。而recordset对象($result)则是担任撷取了局并将呼应数据规格化成文字或数组。
独一我需求增添的工作是,ADODB供应很多有效的函数来让INSERT及UPDATE指令更轻易些,这点咱们在进阶的章节会提到。
撷取材料
while (!$result->EOF) {
for ($i=0, $max=$result->FieldCount(); $i < $max; $i++)
print $result->fields[$i].' ';
$result->MoveNext();
print "<br>n";
}
后面获得数据的典范很像从档案读数据,在每行咱们起首反省是不是到了档案的开头(EOF),若还没到开头,轮回扫过每列中的字段,然后移到下一行(MoveNext)接侧重复一样的工作。
$result->fields[]数组是由PHP数据库延长体系所发生的,有些数据库延长体系其实不会以字段称号创立该数组的索引,要强制以称号排序索引该数组,利用$ADODB_FETCH_MODE的通用变量。
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs1 = $db->Execute('select * from table');
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$rs2 = $db->Execute('select * from table');
print_r($rs1->fields); // shows array([0]=>'v0',[1] =>'v1')
print_r($rs2->fields); // shows array(['col1']=>'v0',['col2'] =>'v1')
好像你所见的下面例子,两个recordset贮存并利用分歧的取用形式,当recordset由Execute()发生后再设定$ADODB_FETCH_MODE。
ADOConnection
保持到数据库的对象,履行SQL指令而且有一组东西函数来尺度格局化SQL指令,好比联系关系与日期格局等指令。
其它有效的函数
$recordset->Move($pos)卷动今朝的数据列,ADODB撑持全部数据库往前卷动,有一些数据库其实不撑持往后的卷动,这倒不会是个成绩,由于你可以用暂存记载到快取来仿真往后卷动。
$recordset->RecordCount()传回SQL指令存取到的记载笔数,有些数据库会由于不撑持而传回-1。
$recordset->GetArray()以数组的体例传回了局。
rs2html($recordset)函数将传进的recordset转为HTML的表格格局。下例中以粗体字显示相干用法:
include('adodb.inc.php');
include('tohtml.inc.php'); /* includes the rs2html function */
$conn = &ADONewConnection('mysql');
$conn->PConnect('localhost','userid','password','database');
$rs = $conn->Execute('select * from table');
rs2html($rs); /* recordset to html table */
还有很多其它有效的函数列示在文件当中,可从以下网址查得 http://php.weblogs.com/adodb_manual
进阶题材
新增及更新
假定你要新增以下数据到数据库中。
ID = 3
TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
Note= sugar why don't we call it off
当你改用其余数据库,能够就没举措新增数据。
第一个成绩是,每个数据库各自有分歧的内定日期格局,MySQL利用 YYYY-MM-DD 格局,而其它数据库则有分歧的内定格局,ADODB供应DBDate()函数来转换分歧数据库之间的日期内定格局。
次一个成绩是单引号(don't)的暗示法,在MySQL可以直接利用单引号(don't),但在其它数据库如Sybase、Access、 Microsoft SQL Server,则用两个单引号暗示(don''t),qstr()函数可以处理此成绩。
咱们若何利用这些函数?就像如许:
$sql = "INSERT INTO table (id, thedate,note) values ("
. $ID . ','
. $db->DBDate($TheDate) .','
. $db->qstr($Note).")";
$db->Execute($sql);
ADODB还有$connection->Affected_Rows()函数,传回受最初update或delete指令影响的数据列数,及$recordset->Insert_ID()函数,传回最初因insert指令而主动发生的数据列编号,事后提示人人,没有任何数据库有供应这两个函数。
MetaTypes
你可以失掉关于字段的更多信息,透过recordset的办法FetchField($fieldoffset)传回对象的3个属性:name,type,max_length。
举例申明:
$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);
了局$f0->name的内容是'adata',$f0->type将是'date',假设max_length不晓得,其内容将会是-1。
处置分歧数据库的一个成绩是,每个数据库关于不异的数据型态会有分歧的称号,好比timestamp型态在某数据库中称为datetime,而另外一个数据库则称为time,所以ADODB供应MetaType($type,$max_length)函数来尺度化以下的数据型态:
C: character and varchar types
X: text or long character (eg. more than 255 bytes wide).
B: blob or binary image
D: date
T: timestamp
L: logical (boolean)
I: integer
N: numeric (float, double, money)
在后面的例子中,
$recordset = $conn->Execute("select adate from table");
$f0 = $recordset->FetchField(0);
$type = $recordset->MetaType($f0->type, $f0->max_length);
print $type; /* should print 'D' */
Select指令的Limit及Top撑持
ADODB有个$connection->SelectLimit($sql,$nrows,$offset)函数让你撷取recordset的局部纠合,这是采取Microsoft产物中的SELECT TOP用法,及PostgreSQL与MySQL中的SELECT...LIMIT用法的长处,即便本来的数据库并没有供应此用法,本函数也仿真供应该利用体例。
快取增援
ADODB答应你在你的档案体系中暂存recordset的数据,而且在$connection->CacheExecute($secs2cache,$sql)及 $connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset)等设定的工夫距离抵达以后,才真正去做数据库的查询以节俭工夫。
PHP4 Session撑持
ADODB也撑持PHP4 session handler,你可以寄存你的session变量在数据库中,相干功效请参考 http://php.weblogs.com/adodb-sessions
勉励贸易利用
假设你企图写商用的PHP使用软件来发卖,你也能够利用ADODB,咱们根据GPL来出书ADODB,也就是说你可以正当地在商用使用软件中援用,并保有你法式代码的一切权。激烈地勉励ADODB的贸易使用,咱们本人外部也正以这个来由如斯利用中。
结论
为了感激你看完这篇文章,上面就是 let's call the whole thing off 的完全歌词。
Refrain
You say eether and I say eyether,
You say neether and I say nyther;
Eether, eyether, neether, nyther -
Let's call the whole thing off !
You like potato and I like po-tah-to,
You like tomato and I like to-mah-to;
Potato, po-tah-to, tomato, to-mah-to -
Let's call the whole thing off !
But oh, if we call the whole thing off, then we must part.
And oh, if we ever part, then that might break my heart.
So, if you like pajamas and I like pa-jah-mas,
I'll wear pajamas and give up pa-jah-mas.
For we know we
Need each other, so we
Better call the calling off off.
Let's call the whole thing off !
Second Refrain
You say laughter and I say lawfter,
You say after and I say awfter;
Laughter, lawfter, after, awfter -
Let's call the whole thing off !
You like vanilla and I like vanella,
You, sa's'parilla and I sa's'parella;
Vanilla, vanella, choc'late, strawb'ry -
Let's call the whole thing off !
But oh, if we call the whole thing off, then we must part.
And oh, if we ever part, then that might break my heart.
So, if you go for oysters and I go for ersters,
I'll order oysters and cancel the ersters.
For we know we
Need each other, so we
Better call the calling off off.
Let's call the whole thing off !
Song and lyrics by George and Ira Gershwin, introduced by Fred Astaire and Ginger Rogers in the film "Shall We Dance?"
英文原版:http://php.weblogs.com/adodb_tutorial
把例子全部敲进去试验,完成一遍以后就会有心得了,因为你会发现为啥我的程序和书上的一模一样就是结果不正确。新手学习的时候必须承认,不容易,因为我也是过来人,你会发现原来有那么多常用的语句,函数都要记。 |
|