|
對(duì)于大型和結(jié)構(gòu)復(fù)雜、內(nèi)容繁多的網(wǎng)站,都要實(shí)現(xiàn)網(wǎng)站的動(dòng)態(tài)化和方便的管理。數(shù)據(jù)管理離不開(kāi)數(shù)據(jù)庫(kù)系統(tǒng)的支持。而衡量一種CGI語(yǔ)言的重要標(biāo)志,就是它對(duì)后臺(tái)數(shù)據(jù)庫(kù)的訪問(wèn)能力、效率等。
而目前流行的php腳本語(yǔ)言,它的新特性給我們帶來(lái)了新的感覺(jué)。它支持以面向?qū)ο蟮姆绞竭M(jìn)行設(shè)計(jì)開(kāi)發(fā)。同時(shí),為了滿足網(wǎng)頁(yè)獨(dú)特的需要,用模板、XML支持等帶來(lái)了網(wǎng)站開(kāi)發(fā)的新方法。在語(yǔ)言結(jié)構(gòu)上,php具有類(lèi)似于C++語(yǔ)言的結(jié)構(gòu),并引入了類(lèi)的概念,簡(jiǎn)化了開(kāi)發(fā)。
php還具有強(qiáng)大的數(shù)據(jù)庫(kù)支持能力。我們這里就通過(guò)實(shí)例,首先介紹php訪問(wèn)數(shù)據(jù)庫(kù)的一般流程,然后通過(guò)文件的數(shù)據(jù)庫(kù)存儲(chǔ)介紹php訪問(wèn)數(shù)據(jù)庫(kù)的一種高級(jí)應(yīng)用。最后通過(guò)數(shù)據(jù)庫(kù)類(lèi)的使用實(shí)例,介紹真正實(shí)用高效的數(shù)據(jù)庫(kù)開(kāi)發(fā)方法。
圖1
php數(shù)據(jù)庫(kù)功能簡(jiǎn)介
php提供對(duì)10余種常見(jiàn)數(shù)據(jù)庫(kù)的支持,如Oracle、dBase、Informix、SQL Server、Sysbase、MySQL等。正是由于廣泛的數(shù)據(jù)庫(kù)支持,才拓展了php的應(yīng)用范圍, 使得各種應(yīng)用都可以利用php進(jìn)行開(kāi)發(fā)。
在各種數(shù)據(jù)庫(kù)中,MySQL由于其免費(fèi)、跨平臺(tái)、使用方便、訪問(wèn)效率較高,獲得了很大的應(yīng)用。很多中心型網(wǎng)站都使用php+MySQL這一最佳搭檔。
Oracle是典型的大型數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)。如果你設(shè)計(jì)的網(wǎng)站數(shù)據(jù)量大,性能、效率要求高的話,Oracle是個(gè)不錯(cuò)的選擇。
在Win32平臺(tái)上,SQL Server占有較大的市場(chǎng)。php可以訪問(wèn)SQL Server。
php對(duì)各種數(shù)據(jù)庫(kù)的訪問(wèn)方法進(jìn)行封裝,針對(duì)不同數(shù)據(jù)庫(kù)系統(tǒng)的函數(shù)也很相似,增加了使用的方便性。
下面,我們將以一個(gè)簡(jiǎn)單的人才信息交流中心(見(jiàn)圖1)為例子,編程實(shí)現(xiàn)個(gè)人簡(jiǎn)歷的在線提交、瀏覽等功能,講述php數(shù)據(jù)庫(kù)操作的全過(guò)程。數(shù)據(jù)庫(kù)采用最常用的MySQL數(shù)據(jù)庫(kù)。
php數(shù)據(jù)庫(kù)操作基本步驟
我們將在本地機(jī)器創(chuàng)建名為ResumeDB的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)中有名為Resume的表。表中存儲(chǔ)個(gè)人簡(jiǎn)歷的編號(hào)、人員名稱(chēng)、個(gè)人簡(jiǎn)介,以及Word格式的簡(jiǎn)歷文件等。
1.數(shù)據(jù)庫(kù)的創(chuàng)建
切換至/usr/local/mysql/bin目錄,在命令行,執(zhí)行以下語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù):
./mysqladmin-u root-p create ResumeDB
Enter password:
在提示后輸入密碼。如果數(shù)據(jù)庫(kù)是第一次使用,默認(rèn)的密碼為空,直接回車(chē)即可。
然后創(chuàng)建保存?zhèn)€人簡(jiǎn)歷的表。
創(chuàng)建文本文件Resume.sql,內(nèi)容如下:
use ResumeDB;
CREATE TABLE Resume (
ID tinyint(4) NOT NULL auto_increment,
Name varchar(10) NOT NULL,
Intro varchar(255),
ResuFile longblob,
PRIMARY KEY (ID),
KEY ID (ID)
);
將其放到My的可執(zhí)行目錄/usr/local/mysql/bin下,執(zhí)行如下命令:
./mysql-u root-p〈 Resume.sql
Enter password:
輸入數(shù)據(jù)庫(kù)密碼后,表Resume自動(dòng)創(chuàng)建成功。其中,ResuFile字段為longbolb型,用來(lái)存儲(chǔ)二進(jìn)制的Word文檔。
2.數(shù)據(jù)庫(kù)訪問(wèn)流程
php對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)一般包括下列步驟:連接數(shù)據(jù)庫(kù)系統(tǒng)→選擇數(shù)據(jù)庫(kù)→執(zhí)行SQL語(yǔ)句→關(guān)閉結(jié)果集→關(guān)閉數(shù)據(jù)庫(kù)連接→結(jié)束。
(1) 連接數(shù)據(jù)庫(kù)
連接數(shù)據(jù)庫(kù)是建立用戶(hù)程序到數(shù)據(jù)庫(kù)系統(tǒng)的對(duì)話通道的過(guò)程。連接MySQL數(shù)據(jù)庫(kù)的語(yǔ)句如下:
〈?
$LinkID=@mysql_connect("localhost", "root" , "") or die("不能連接到數(shù)據(jù)庫(kù)服務(wù)器!可能是數(shù)據(jù)庫(kù)服務(wù)器沒(méi)有啟動(dòng),或者用戶(hù)名密碼有誤!");
?〉
其中,函數(shù)mysql_connect()用于與數(shù)據(jù)庫(kù)服務(wù)器建立連接。三個(gè)參數(shù)分別為:數(shù)據(jù)庫(kù)服務(wù)器的主機(jī)名(也可以是IP)、數(shù)據(jù)庫(kù)用戶(hù)名和用戶(hù)密碼。函數(shù)返回值用于表示這個(gè)數(shù)據(jù)庫(kù)連接。
從這個(gè)命令可以看到,我們可以指定并非本機(jī)的機(jī)器名作為數(shù)據(jù)庫(kù)服務(wù)器。這樣,就為數(shù)據(jù)的異地存放、數(shù)據(jù)庫(kù)的安全隔離提供了可能。外界用戶(hù)往往具有WWW服務(wù)器的直接訪問(wèn)權(quán)限,如果數(shù)據(jù)庫(kù)系統(tǒng)直接放置在WWW服務(wù)器上,就可能會(huì)帶來(lái)安全隱患。而如果將數(shù)據(jù)庫(kù)系統(tǒng)放置于一臺(tái)防火墻后面的計(jì)算機(jī)上,php可以通過(guò)局域網(wǎng)訪問(wèn)數(shù)據(jù)庫(kù),而局域網(wǎng)內(nèi)部的計(jì)算機(jī)對(duì)外部是不可見(jiàn)的。這樣,就保證了數(shù)據(jù)庫(kù)不受外來(lái)攻擊的可能。
函數(shù)前面的“@”符號(hào),用于限制這個(gè)命令的出錯(cuò)信息的顯示。如果函數(shù)調(diào)用出錯(cuò),將執(zhí)行or后面的語(yǔ)句。die( )函數(shù)表示向用戶(hù)輸出引號(hào)中的內(nèi)容后,程序終止執(zhí)行。這樣做是為了防止數(shù)據(jù)庫(kù)連接出錯(cuò)時(shí),用戶(hù)看到一堆莫名其妙的專(zhuān)業(yè)名詞,而是提示定制的出錯(cuò)信息。不過(guò)在調(diào)試的時(shí)候,我們還是可以不要屏蔽出錯(cuò)信息,免得出錯(cuò)后,難以找到到底哪里有問(wèn)題。
(2) 數(shù)據(jù)庫(kù)選擇
一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)可以包含多個(gè)數(shù)據(jù)庫(kù)。在建立了和數(shù)據(jù)庫(kù)服務(wù)器的連接后,我們就要告訴系統(tǒng),我們將要用到的數(shù)據(jù)庫(kù)是哪個(gè)。選擇數(shù)據(jù)庫(kù)的命令如下:
〈?
@mysql_select_db("ResumeDB",$LinkID) or die("選擇數(shù)據(jù)庫(kù)出錯(cuò),可能是您指定的數(shù)據(jù)庫(kù)不存在!");
?〉
選擇數(shù)據(jù)庫(kù)時(shí),要提供的參數(shù)是數(shù)據(jù)庫(kù)的名稱(chēng)、和服務(wù)器連接號(hào)。
當(dāng)我們只使用一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器時(shí),$LinkID可以省略,系統(tǒng)自動(dòng)查找最近的一個(gè)數(shù)據(jù)庫(kù)連接然后使用它。但是,當(dāng)你要實(shí)現(xiàn)大型站點(diǎn)的時(shí)候,必不可少的要遇到多主機(jī)、多數(shù)據(jù)庫(kù)系統(tǒng)的情況。這時(shí),數(shù)據(jù)庫(kù)連接參數(shù)就不能省略了。
(3) 數(shù)據(jù)庫(kù)訪問(wèn)
好了,我們已經(jīng)建立了到數(shù)據(jù)庫(kù)的連接,選定了數(shù)據(jù)庫(kù),接下了來(lái)的一切就是執(zhí)行SQL語(yǔ)句了。SQL語(yǔ)句的易用而強(qiáng)大的功能,將完成我們絕大部分的數(shù)據(jù)庫(kù)操作動(dòng)作。
我們可以首先向數(shù)據(jù)庫(kù)里寫(xiě)入一條個(gè)人信息記錄,然后把它顯示出來(lái)。
〈?
$Name= "OpenBall"; //實(shí)際操作中,$Name、$Intro為從瀏覽器表單傳來(lái)的值
$Intro = "OpenBall的個(gè)人簡(jiǎn)介……";
$query = "insert into Resume(Name,Intro) values('$Name', '$Intro')"; //生成SQL語(yǔ)句
$result = @mysql_query("$query",$LinkID); //執(zhí)行
if(! $result)
echo "數(shù)據(jù)插入失敗!";
$query= "select ID,Name,Intro from Resume"; //生成SQL語(yǔ)句
$result = mysql_query($query,$LinkID); //執(zhí)行,結(jié)果集保存到變量$result中
$num= mysql_num_rows($result); //取得查詢(xún)返回的記錄行數(shù)
if($num == 0)
{
echo "沒(méi)有找到任何記錄";
exit();
}
while($row=mysql_fetch_array($result)) //取結(jié)果集的下一行數(shù)據(jù)到數(shù)組$row中
{
echo $row["ID"]." ".$row["Name"]." ".$row["Intro"]."〈br〉";
//以字段名為索引訪問(wèn)數(shù)組變量的值
}
?〉
上面的操作,共執(zhí)行了兩次數(shù)據(jù)庫(kù)操作。第一次為插入操作,第二次為查詢(xún)操作。程序首先插入當(dāng)前用戶(hù)的一天記錄,然后,顯示所有數(shù)據(jù)庫(kù)中的個(gè)人情況。
(4)資源釋放
操作的最后,是釋放結(jié)果集,釋放結(jié)果集和數(shù)據(jù)庫(kù)連接資源。
〈?
@mysql_free_result($result);
@mysql_close($LinkID);
?〉
如果在多個(gè)網(wǎng)頁(yè)中都要頻繁進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn),則可以建立與數(shù)據(jù)庫(kù)服務(wù)器的持續(xù)連接來(lái)提高效率。因?yàn)槊看闻c數(shù)據(jù)庫(kù)服務(wù)器的連接需要較長(zhǎng)的時(shí)間和較大的資源開(kāi)銷(xiāo),持續(xù)的連接相對(duì)來(lái)說(shuō)會(huì)更有效。
建立持續(xù)連接的方法,就是在數(shù)據(jù)庫(kù)連接的時(shí)候,調(diào)用函數(shù)mysql_pconnect()代替mysql_connect() 。建立的持續(xù)連接在本程序結(jié)束時(shí),不需要調(diào)用mysql_close()來(lái)關(guān)閉。下次程序在此執(zhí)行mysql_pconnect()時(shí),系統(tǒng)自動(dòng)直接返回已經(jīng)建立的持續(xù)連接的ID號(hào),而不再去真的連接數(shù)據(jù)庫(kù)。
php技術(shù):PHP腳本數(shù)據(jù)庫(kù)功能詳解(上),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。