仓酷云

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

[学习教程] PHP网站制作之ADODB官方引见

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

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

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

x
到现在,对排版还是不很熟练,经常会排不好。ado   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


我先解释一下我的学习思路。
若相依 该用户已被删除
沙发
发表于 2015-2-4 10:03:38 | 只看该作者
爱上php,他也会爱上你。
深爱那片海 该用户已被删除
板凳
发表于 2015-2-8 20:50:23 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
愤怒的大鸟 该用户已被删除
地板
发表于 2015-2-26 09:52:25 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
金色的骷髅 该用户已被删除
5#
发表于 2015-2-26 12:43:56 | 只看该作者
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
乐观 该用户已被删除
6#
发表于 2015-3-8 15:13:21 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
小女巫 该用户已被删除
7#
发表于 2015-3-16 02:43:19 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
海妖 该用户已被删除
8#
发表于 2015-3-22 19:04:46 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
兰色精灵 该用户已被删除
9#
发表于 2015-3-27 15:11:06 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
因胸联盟 该用户已被删除
10#
发表于 2015-3-30 13:49:39 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
第二个灵魂 该用户已被删除
11#
发表于 2015-4-1 08:08:42 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
简单生活 该用户已被删除
12#
 楼主| 发表于 2015-4-8 01:52:21 | 只看该作者
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
透明 该用户已被删除
13#
发表于 2015-4-10 11:10:10 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
变相怪杰 该用户已被删除
14#
发表于 2015-4-26 15:10:42 | 只看该作者
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
冷月葬花魂 该用户已被删除
15#
发表于 2015-5-6 10:36:47 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
老尸 该用户已被删除
16#
发表于 2015-5-7 05:54:11 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
分手快乐 该用户已被删除
17#
发表于 2015-6-12 07:10:13 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
18#
发表于 2015-6-12 11:57:02 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
蒙在股里 该用户已被删除
19#
发表于 2015-6-15 03:36:00 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
活着的死人 该用户已被删除
20#
发表于 2015-6-18 14:49:28 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 05:13

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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