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