9.1 通過PHP操作MySQL資料庫 http://book.csdn.net/ 2007-9-12 18:11:00圖書導讀當前章節:9.1 通過PHP操作MySQL資料庫·目錄·前言·9.2 通過PHP操作SQL Server資料庫·9.3 通過PHP操作Access資料庫·22.1 需求分析·22.2 系統設計PHP最大的一個特點就是和資料庫結合緊密,多數PHP的應用都是通過資料庫實現的。本章主要介紹如何使用PHP來操作MySQL資料庫,同時介紹使用PHP操作SQL Server、Access資料庫的技術。9.1 通過PHP操作MYSQL資料庫要進行資料庫編程,首先需要連接資料庫。在PHP中,提供了大量用於資料庫處理的函數,讀者可以很方便地進行各種資料庫操作。9.1.1 連接MySQL資料庫要進行資料庫操作,首先需要連接資料庫。連接資料庫,也就是PHP客戶端向伺服器端的資料庫發出連接請求,連接成功後就可以進行其他的資料庫操作。如果使用不同的用戶連接,會有不同的操作許可權。為了能夠連接MySQL資料庫,必須修改php.ini文件的設置(在更改文件前首先需要去除該文件的只讀屬性),將「extension- php_mysql.dll」語句前面的分號刪除,如圖9.1所示,然後,重新啟動Apache伺服器。

圖9.1 修改php.ini的配置mssql_connect()函數用於連接MySQL伺服器,該函數的語法如下:resource mysql_connect([string server[,string username[,string password[,bool]]]]其中,server表示MySQL伺服器,可以包括埠號,如果mysql.default_host未定義(默認情況),則默認值為「localhost:3306」;username表示用戶名;password表示密碼。例如,用戶連接本機MySQL伺服器的代碼如下:$link=mssql_connect("localhost","root","root");如果該函數調用成功,則返回句柄。如果失敗,則返回FALSE。9.1.2 關閉MySQL資料庫通常的情況下,在創建一個連接後,如果不再使用,應該關閉資料庫的連接以釋放資源,同時又可避免出現各種意外的錯誤。mysql_close()函數用於關閉與MySQL資料庫伺服器的連接。語法如下:bool mysql_close([resource link_identifier]);其中,link_identifier為MySQL的連接標識符,若不指定參數link_identifier,則會關閉最後的一次連接。如果成功,則返回TRUE,失敗,則返回FALSE。通常並不強制使用mysql_close(),因為已打開的非持久連接會在腳本執行完畢後自動關閉。但是建議讀者養成良好的編程習慣,在使用完畢後關閉連接。例如,關閉資料庫的連接,代碼如下:mysql_close(); //關閉資料庫連接9.1.3 選擇資料庫前面已經成功連接了資料庫伺服器,但是一個資料庫伺服器可能包含了很多的資料庫。通常需要針對某個具體的資料庫進行編程,此時就必須選擇目標資料庫。mysql_select_db()函數用於選擇目標資料庫,語法如下:bool mysql_select_db(string database_name[,resource link_identifier]);mysql_select_db()函數用來選擇MySQL伺服器中的資料庫。如果成功,則返回TRUE,如果失敗,則返回FALSE。示例:選擇DB_Book資料庫,代碼如下:<?php$link=mysql_connect("localhost","root","root") or die("資料庫連接失敗!".mysql_error());if(mysql_select_db("DB_Book",$link))echo"您選擇的資料庫為:DB_Book";elseecho ("資料庫選擇失敗!".mysql_error());?>

實例位置:mrsl 9example01.php9.1.4 使用Insert語句實現用戶註冊對於專門為資料庫設計的語言來講,SQL是一種資料庫操作技術,可以對資料庫進行添加、修改、刪除等一系列操作。當由記錄表示的一個新實體出現時,通常就把一個新的數據記錄添加到關係資料庫中。實現數據的添加操作可使用Insert語句完成,具體的語法請讀者參見本書11.6.1節。數據添加主要應用到如下幾個函數,下面分別進行介紹。1.mysql_query()函數mysql_query()函數用來根據連接標識符向指定資料庫伺服器的當前資料庫發送查詢。語法如下:int mysql_query(string query ,int [link_identifier]);其中,query是查詢字元串;link_identifier是資料庫連接標識符。mysql_query()在執行成功時返回一個結果標識符,失敗時返回FALSE。2.mysql_fetch_array()函數mysql_fetch_array()函數用來從結果集取得的行生成數組。語法如下:arraymysql_fetch_array(int result,int[result_type]);其中,result_type參數是一個常量,可選項,可以接受以下值(默認值為MYSQL_BOTH):MYSQL_ASSOC:只得到關聯索引。MYSQL_NUM:只得到數字索引。MYSQL_BOTH:將得到一個同時包含關聯和數字索引的數組。

注意:mysql_fetch_array()函數返回的欄位名區分大小寫。mysql_fetch_array()函數先提取出查詢結果的第一行的內容,這個函數的參數就是mysql_query()函數返回的整數標誌。而mysql_fetch_array()執行成功後,記錄集指針會自動下移,這樣當再一次執行mysql_fetch_array()時,得到的就是下一行記錄的內容了。下面通過具體的範例來講解Insert語句在PHP中的應用。範例09-01 使用Insert語句實現用戶註冊

範例位置:mrfl 9 1

錄像位置:mrlx 9數據添加是Web程序或網站最基本的功能之一(基本功能為添加、修改、刪除、查詢等),任何一個Web程序或網站的後臺管理頁面都要提供數據添加的功能。向數據表中插入數據可以通過Insert語句實現。本範例通過Insert語句實現了用戶註冊功能,運行結果如圖9.2所示。本範例的設計思路如下。(1)本範例在註冊用戶時,由於不能存在同樣的用戶名,因此需要首先對用戶名進行判斷。在「用戶名」文本框中輸入用戶名稱,單擊「檢測用戶」超鏈接,通過window.open打開一個用戶檢測的用戶對話框,對輸入的用戶進行檢測,並對檢測結果給出相應的提示。代碼如下:<script language="javascript">function openwin(x){if (x==""){alert("請輸入用戶名!"); myform.UserName.focus();return false;}else{window.open("submit_checkuser.php?x="+x,"newframe","width_=300,height=150");}}</script><a href="#" onClick="javascript:openwin(myform.UserName.value)">[檢測用戶]</a>

圖9.2 錄入數據(2)利用$_GET[x]將文本框的值傳遞到數據處理頁(submit_checkuser.php),可檢測用戶名稱是否存在,代碼如下:<?phpinclude "Conn/conn.php";$UserName=$_GET[x];$sql=mysql_query("select * from tb_user where Username = "$UserName"");$result=mysql_fetch_array($sql);if ($result!=false){echo ("[<font color=red>".$UserName."</font>]已被註冊!");}else{echo ("恭喜您!用戶名[<font color=green>".$UserName."</font>]可以註冊!");}?>(3)當用戶按要求填寫用戶信息後,單擊【確定保存】按鈕將數據提交到數據處理頁(register_deal.php)進行數據處理。(4)在數據處理頁register_deal.php中利用include包含文件命令引用資料庫配置文件,訪問資料庫。代碼如下:<? php include "Conn/Conn.php"; ?>(5)將從表單中提取的數據存儲到變數中,使用Insert語句將用戶填寫的數據作為新記錄插入到數據表中,並彈出「用戶註冊成功」提示框。程序代碼如下:<?php$UserName=$_POST[UserName];$TrueName=$_POST[TrueName];$PWD=$_POST[PWD1];$ICO=$_POST[ICO];$Sex=$_POST[Sex];$birthday=$_POST[Birthday];$Email=$_POST[Email];$Tel=$_POST[Tel];$homepage=$_POST[Homepage];$OICQ=$_POST[OICQ];$Address=$_POST[Address];$INS=mysql_query("Insert Into tb_user (Username,Pwd,TrueName,ICO,Sex,birthday,Email,Tel, homepage,OICQ,Address) Values("$UserName","$PWD","$TrueName","$ICO","$Sex","$birthday","$Email"," $Tel", "$homepage","$OICQ","$Address")");$result1=mysql_fetch_array($INS);echo "<script> alert("用戶註冊成功!");</script>";echo "<script> window.location="index.php";</script>";?>9.1.5 使用Update語句實現批量更新用戶狀態批量數據更新在資料庫中的應用是比較廣泛的,而且通過批量數據更改可以達到省時省力、提高效率的目的。批量更新數據主要應用到了Update語句和In子句。Update語句的語法請讀者參見本書11.6.2節。下面介紹一下In子句的用法。In子句用於確定給定的值是否與子查詢或列表中的值相匹配。語法如下:test_expression [ NOT ] IN(subquery| expression [ ,...n ])其中,參數test_expression代表所有有效的Microsoft? SQL Server?表達式;參數subquery包含某列結果集的子查詢;參數expression [,...n]表示一個表達式列表,用來測試是否匹配。所有的表達式必須與test_expression具有相同的類型。下面的範例主要應用Update語句實現批量更新用戶狀態。範例09-02 使用Update語句實現批量更新用戶狀態

範例位置:mrfl 9 2

錄像位置:mrlx 9一般在設計用戶許可權或是更改工資級別時都會用到批量更新,批量更新的好處是速度快、安全性高。在本範例中,利用批量更新更改用戶狀態。選擇要操作的用戶,單擊【激活】或【凍結】按鈕,即可將用戶設為激活或凍結狀態。程序運行結果如圖9.3、圖9.4所示。

圖9.3 選中欲更新的用戶 圖9.4 批量更新用戶狀態本範例的實現過程如下。(1)利用include包含文件命令引用資料庫配置文件,訪問資料庫。代碼如下:<?php include "conn/conn.php"; ?>(2)利用Do…while循環語句輸出用戶信息,將每條記錄前面加上複選框,並進行相關屬性值設置。代碼如下:<form name="form1" method="post" action="index.php" onSubmit="Checker()"><table width_="349" border="1" align="center" cellspacing="0" ><tr align="center" bgcolor="#efefef"><td height="36" colspan="3">用戶列表</td></tr><?php$sql=mysql_query("select * from tb_member");$result=mysql_fetch_array($sql);do {?><tr align="center"><td width_="108"><input name="id" type="checkbox" id="id" value="<?php echo $result[M_ID];?>"></td><td width_="131"><?php echo $result[M_Name]; ?></td><td width_="88"><?php echo $result[Grade]; ?></td></tr><?php}while($result=mysql_fetch_array($sql));?><tr align="center"><input type="hidden" name="items" value="<?php echo $item; ?>"><td colspan="3"><input type="submit" name="Submit" value="激活" ><input type="reset" name="Submit" value="重置"><input type="submit" name="Submit" value="凍結"></tr></table><p>&nbsp;</p></form>(3)PHP接收多個同名複選框信息,不像JSP那樣可以自動轉換成為數組,這給使用者帶來了一定的不便。但是還是有解決辦法的,即利用JavaScript腳本做一下預處理。當提交表單時,調用cheaker()函數,多個同名複選框在JavaScript腳本中還是以數組的形式存在的,所以在表單提交之前,可以利用JavaScript把複選框中的信息組合成一個字元串賦值給表單中的隱藏元素。代碼如下:<script language="javascript">function Checker(){form1.items.value = ""; //設置隱藏域的值為空if ( !form1.id.length ) { //只有一個複選框,form1.item.length = undefinedif ( form1.id.checked ){form1.items.value = form1.id.value;}}else {var temp="";for ( i = 0 ; i < form1.id.length ; i++ ){if ( form1.id(i).checked ){ //複選框中有選中的框temp=temp+form1.id(i).value+","; //使用","分隔符將數組元素組合成一個字元串}}temp=temp.substring(0,temp.length-1); //去除字元串末尾多餘的","form1.items.value = temp; //將變數賦值給隱藏域}}</script>(4)將隱藏域的值賦給變數item,這樣就可以實現複選框信息的傳遞了。再使用Update語句和In子句對選中的用戶進行批量更新。代碼如下:<?php$item = $POST[items];if( $item<>""){if ($_POST[Submit]=="激活"){$sql=mysql_query("update tb_member set Grade="激活" where M_ID in (".$item.")");$result=mysql_fetch_array($sql);}else{$sql=mysql_query("update tb_member set Grade="凍結" where M_ID in (".$item.")");$result=mysql_fetch_array($sql);}}else{echo "<div align="center" style="color:#FF0000; font-size:12px">請選擇一個用戶</div>";}?>9.1.6 使用Delete語句實現批量刪除用戶信息批量數據的刪除在各大中小型網站及管理系統中應用最為廣泛。批量刪除數據是通過Delete語句實現的。例如,批量刪除圖書信息表中圖書名稱包含「PHP」的數據信息,代碼如下:$sql=mysql_query("Delete from tab_book where bookname like "%".php."%"");$result=mysql_fetch_array($sql);下面的範例主要應用複選框實現數據的批量刪除。範例09-03 使用Delete語句實現批量刪除圖書信息

範例位置:mrfl 9 3

錄像位置:mrlx 9在對數據進行刪除時,有很多種方法。本範例主要通過複選框實現數據的批量刪除。運行本範例,選擇要刪除的數據前的複選框,單擊【刪除】按鈕,此時所有被選中的數據將全部被刪除。刪除圖書信息前及刪除圖書後的運行結果如圖9.5、圖9.6所示。

圖9.5 批量刪除數據前

圖9.6 批量刪除數據後本範例主要應用Delete語句和In子句實現批量數據刪除操作。Delete語句的語法請讀者參見本書11.6.3節。本範例的實現過程如下。(1)利用包含文件命令include引用資料庫配置文件,即可訪問資料庫。代碼如下:<?php include "Conn/conn.php"; ?>(2)利用Do…While語句將數據表中的所有記錄顯示出來,並將每條記錄前面加上複選框。添加Form表單及複選框,並進行相關屬性值的設置。代碼如下:<form name="form1" method="post" action="index.php" onSubmit="Checker()"><table width_="770" border="1" align="center" cellpadding="1" cellspacing="1" bordercolor="#73BA08" ><tr><td height="244" colspan="7" background="images/bg.jpg">&nbsp;</td></tr><?php$sql=mysql_query("select * from tab_book");$info=mysql_fetch_array($sql);do {?><tr><td width_="26"><input name="id" type="checkbox" id="id" value="<?php echo $info[id]; ?>"> </td><td width_="161"><?php echo $info[bookname]; ?></td><td width_="72"><?php echo $info[issuDate]; ?></td><td width_="29"><?php echo $info[price]; ?></td><td width_="170"><?php echo $info[synopsis]; ?></td><td width_="73"><?php echo $info[Maker]; ?></td><td width_="89"><?php echo $info[pulisher]; ?></td></tr><?php}while($info=mysql_fetch_array($sql));?><tr align="center"><input type="hidden" name="items" value="<?php echo $item; ?>"><td colspan="7"><input type="submit" name="Submit" value="刪除" ><input type="reset" name="Submit" value="重置"></tr></table></form>(3)當提交表單時,調用cheaker()函數,利用JavaScript腳本把複選框中的信息組合成一個字元串,賦值給表單中的隱藏元素。代碼如下:<script language="javascript">function Checker(){form1.items.value = ""; //設置隱藏域的值為空if ( !form1.id.length ) { //只有一個複選框,form1.item.length = undefinedif ( form1.id.checked ){form1.items.value = form1.id.value;}}else {var temp="";for ( i = 0 ; i < form1.id.length ; i++ ){if ( form1.id(i).checked ){ //複選框中有選中的框temp=temp+form1.id(i).value+","; //將數組中的元素使用","分隔}}temp=temp.substring(0,temp.length-1); //去除字元串末尾多餘的","form1.items.value = temp; //將變數賦值給隱藏域}}</script>(4)將隱藏域的值賦給變數item,這樣就可以實現複選框信息的傳遞了。通過單擊【刪除】按鈕,將複選框選擇的任意一條或多條記錄刪除。代碼如下:<?php$item = $_POST[items];if( $item<>""){if ($_POST[Submit]=="刪除"){$sql=mysql_query("Delete from tab_book where id in (".$item.")");$result=mysql_fetch_array($sql);}}else{echo "<div align="center" style="color:#FF0000; font-size:12px">請選擇欲刪除的圖書項目</div>";}?>9.1.7 通用查詢在資料庫中,數據查詢是通過Select語句完成的。Select語句可以從資料庫中按用戶要求提供的限定條件檢索數據,並將查詢結果以表格的形式返回。例如,查詢圖書信息表中圖書名稱為「PHP資料庫系統開發完全手冊」的圖書信息。代碼如下:$sql=mysql_query("select * from tab_book where bookname="PHP資料庫系統開發完全手冊"");$info=mysql_fetch_array($sql);下面通過具體的範例來講解數據查詢的方法和技巧。範例09-04 通用查詢

範例位置:mrfl 9 4

錄像位置:mrlx 9通用查詢在動態網站開發過程中應用最為廣泛,它支持多種查詢方式,可按不同欄位、不同條件、不同的查詢關鍵字對數據信息進行綜合查詢,且支持模糊查詢。運行本範例,設置查詢條件,單擊【查詢】按鈕,即可將符合條件的圖書信息檢索出來顯示在瀏覽器上。運行結果如圖9.7、圖9.8所示。

圖9.7 設置通用查詢條件

圖9.8 通用查詢結果本範例的實現過程如下。(1)利用include包含文件命令引用資料庫配置文件,即可訪問資料庫。代碼如下:<?php include "conn/conn.php"; ?>(2)創建記錄集。首先通過接收表單傳遞的值賦值給Session變數,然後利用If…Then…Else條件語句判斷用戶當前選擇的操作符,從而執行相對應的SQL語句來檢索商品的相關信息,並判斷記錄集是否為空。如果檢索到記錄尾,沒有找到符合條件的記錄,那麼將彈出提示信息。主要程序代碼如下:php$txt_sel=$_POST[txt_sel];$txt_tj=$_POST[txt_tj];$txt_book=$_POST[txt_book];if ($_POST[Submit]=="查詢"){if($_POST[txt_tj]=="like"){ //如果選擇的條件為"like",則進行模糊查詢$sql=mysql_query("select * from tab_book where ".$txt_sel." like "%".$txt_book."%"");$info=mysql_fetch_array($sql);}if($_POST[txt_tj]=="="){$sql=mysql_query("select * from tab_book where ".$txt_sel." = "".$txt_book.""");$info=mysql_fetch_array($sql);}if($_POST[txt_tj]==">"){$sql=mysql_query("select * from tab_book where ".$txt_sel." > "".$txt_book.""");$info=mysql_fetch_array($sql);}if($_POST[txt_tj]=="<"){$sql=mysql_query("select * from tab_book where ".$txt_sel." < "".$txt_book.""");$info=mysql_fetch_array($sql);}else{if($info==false){ //如果檢索的信息不存在,則輸出相應的提示信息echo "<div align="center" style="color:#FF0000; font-size:12px">對不起,您檢索的圖書信息不存在!</div>";}}}?>

注意:本範例在實現模糊查詢時,使用了通配符「%」。「%」表示任意零個或多個字元。(3)利用Do…While循環語句以表格形式輸出數據信息到瀏覽器中。代碼如下:<?phpdo{?><tr align="left" bgcolor="#FFFFFF"><td height="20" align="center"><?php echo $info[id]; ?></td><td >&nbsp;<?php echo $info[bookname]; ?></td><td>&nbsp;<?php echo $info[issuDate]; ?></td><td align="center"><?php echo $info[price]; ?></td><td>&nbsp;&nbsp;<?php echo $info[synopsis]; ?></td><td>&nbsp;<?php echo $info[Maker]; ?></td><td>&nbsp;<?php echo $info[publisher]; ?></td></tr><?php}while($info=mysql_fetch_array($sql));?>9.1.8 查詢指定時間段的數據在對日期數據進行查詢時,經常需要對某一時間段內的數據進行查詢。首先介紹一個簡單的日期查詢。例如,利用SQL語句查詢採購信息表中指定時間的採購信息,代碼如下:$sql=mysql_query("select * from tb_cgdan where cgdate >"2007-01-12"");$result=mysql_fetch_array($sql);利用SQL語句中的BETWEEN…AND語句可以實現時間段查詢的功能。BETWEEN…AND語句的語法格式如下:test_expression [ NOT ] BETWEEN begin_expression AND end_expressiontest_expression:用來在由begin_expression和end_expression定義的範圍內進行測試的表達式。NOT:指定謂詞的結果被取反。begin_expression:任何有效的表達式。begin_expression為時間段的起始日期。end_expression:任何有效的表達式。test_expression為時間段的終止日期。AND:作為一個佔位符,表示test_expression應該處於由begin_expression和end_expression指定的範圍內。下面詳細介紹對指定時間段內數據記錄進行查詢的方法。範例09-05 查詢指定時間段的數據

範例位置:mrfl 9 5

錄像位置:mrlx 9一些中小型網站經常需要對某一時間段內的數據信息進行查詢。運行本範例,在「查詢日期」文本框中設置要查詢的時間段,單擊【查詢】按鈕,即可將該時間段內的商品採購信息輸出到瀏覽器中。運行結果如圖9.9所示。

圖9.9 查詢指定時間段內的數據本範例的實現過程如下。(1)利用include包含文件命令引用資料庫配置文件訪問資料庫。代碼如下:<?php include "conn/conn.php"; ?>(2)利用複合條件BETWEEN…AND語句檢索指定時間段內的商品採購信息,主要程序代碼如下:<?phpif($_POST["subb"]<>""){$_SESSION["sdate"]=$_POST["sdate"];$_SESSION["edate"]=$_POST["edate"];$sql=mysql_query("select * from tb_cgdan where cgdate between "".$_SESSION["sdate"]."" and "".$_SESSION ["edate"].""");$result=mysql_fetch_array($sql);if($result==false){echo "<div align=center><font color=red>Sorry!該時間段內沒有採購商品!</font></div>";}?>(3)利用Do…While循環輸出語句將符合條件的採購信息輸出到瀏覽器中,代碼如下:<?phpdo{?><tr align="center" bgcolor="#FFFFFF"><td><?php echo $result["id"]; ?></td><td align="left"><?php echo $result["spname"]; ?></td><td align="left"><?php echo $result["cd"]; ?></td><td align="left"><?php echo $result["gg"]; ?></td><td><?php echo $result["dw"]; ?></td><td align="left"><?php echo $result["dj"]; ?></td><td align="left"><?php echo $result["sl"]; ?></td><td align="left"><?php echo $result["je"]; ?></td><td align="left"><?php echo $result["cgdate"]; ?></td></tr><?php}while($result=mysql_fetch_array($sql));}mysql_close();?>9.1.9 查詢暢銷的前5種商品要查詢出最暢銷的商品,必須利用ORDER BY子句根據一個或一個以上的欄位來排序查詢結果,然後再使用LIMIT子句限制Select語句返回的行數。LIMIT取1個或2個參數,如果給定2個參數,第一個參數用於指定要返回的第一行的偏移量,第二個參數用於指定返回行的最大數目。初始行的偏移量是0(不是1)。mysql> select * from table LIMIT 5,10; # Retrieve rows 6-15如果給定一個參數,它指出返回行的最大數目。mysql> select * from table LIMIT 5; # Retrieve first 5 rows即LIMIT n等價於LIMIT 0,n。數據查詢有一項極為重要的功能,那就是它能夠查詢出最前面的或最後的。下面通過具體的範例進行講解。範例09-06 查詢暢銷的前5種商品

範例位置:mrfl 9 6

錄像位置:mrlx 9查詢時不僅可以查詢具有相同欄位信息的記錄,還可以對某一特定範圍內的數據信息進行查詢。運行本範例,如圖9.10所示,默認頁顯示tb_stocks數據表中的全部信息。單擊【查詢】按鈕,即可統計出最暢銷的前5種商品(本範例按銷售總量降序排列,再返回查詢結果的前5條記錄)並將結果輸出到瀏覽器,運行結果如圖9.11所示。

圖9.10 顯示商品的全部信息

圖9.11 查詢暢銷的前5種商品本範例的實現過程如下。(1)利用框架嵌套技術佈局範例頁面,代碼如下:<frameset rows="80,*" cols="*" framespacing="0" frameborder="NO" border="0"><frame src="spxxindex.php" name="topFrame" scrolling="NO" noresize ><frame src="indexdefault.php" name="MainFrame" noresize></frameset>(2)利用include包含文件命令引用資料庫配置文件訪問資料庫。代碼如下:<?php include "conn/conn.php"; ?>(3)創建記錄集。利用LIMIT 5子句返回滿足Where子句的前5條記錄,代碼如下:<?phpif ($_POST[subb]=="查詢"){$sql=mysql_query("select spname,cd,dw,price,sum(xssl) as sum_xssl,sum(xsje) as sum_xsje from tb_ stocks group by spname,cd,dw,price order by sum_xssl desc LIMIT 5");$result=mysql_fetch_array($sql);}?>(4)利用Do…While循環語句輸出查詢結果,代碼如下:<?phpdo{?><tr align="center" bgcolor="#FFFFFF"><td align="left">&nbsp;<?php echo $result[spname]; ?></td><td align="left">&nbsp;<?php echo $result[cd]; ?></td><td align="center"><?php echo $result[dw]; ?></td><td align="center"><?php echo $result[price]; ?></td><td><?php echo $result[sum_xssl]; ?></td><td><?php echo $result[sum_xsje]; ?></td></tr><?php}while($result=mysql_fetch_array($sql));?>9.1.10 多表分組統計商品的銷售情況在查詢統計中經常會遇到對查詢結果進行排序、分組的情況。多表分組統計主要應用了SUM聚集函數,該函數主要用於返回表達式中所有值的和,或只返回DISTINCT值。需要說明的是,SUM聚集函數只能用於數據類型是數字的列,且忽略NULL值。語法如下:SUM ( [ALL|DISTINCT] expression )其中,參數ALL表示對所有的值進行聚集函數運算,是默認值;參數DISTINCT用於指定SUM返回惟一值的和;參數expression是常量、列或函數,或者是算術、按位與字元串等運算符的任意組合。expression是精確數字或近似數字數據類型分類(bit數據類型除外)的表達式。其他情況下不允許使用聚集函數和子查詢。說明:SUM函數在對列中數值相加時忽略NULL值。但是,如果列中的所有值均為NULL,則SUM函數返回NULL作為其結果。下面通過具體的範例詳細講解多表分組統計的應用。範例09-07 多表分組統計商品的銷售情況

範例位置:mrfl 9 7

錄像位置:mrlx 9本範例實現的是在商品銷售信息表和商品庫存信息表中查詢商品的銷售數量和現存數量,並按商品編號進行分組。運行本範例,單擊【統計】按鈕,即可將符合條件的統計結果輸出到瀏覽器中。運行結果如圖9.12、圖9.13所示。

圖9.12 顯示商品的庫存信息

圖9.13 多表分組統計商品的銷售情況本範例的實現過程如下。(1)利用include包含文件命令引用資料庫配置文件訪問資料庫。代碼如下:<?php include "Conn/conn.php";?>(2)創建記錄集。在圖書銷售信息表和圖書庫存信息表中查詢圖書的銷售數量和現存數量,並按圖書編碼、圖書名稱、作者等分組,從而實現從多個表中分組統計數據信息。主要程序代碼如下:<?phpif ($_POST[subb]=="統計"){$sql=mysql_query("select k.spid,k.spname,k.kcsl,sum(x.xssl) as sum_xssl from tb_stocks as k,tb_market as x where k.spid=x.spid group by k.spid,k.spname,k.kcsl");$result=mysql_fetch_array($sql);}?>(3)利用Do…While語句循環輸出統計後的商品庫存信息和銷售信息。代碼如下:<?php do{ ?><tr align="center" bgcolor="#FFFFFF"><td align="left">&nbsp;<?php echo $result[spid]; ?></td><td align="left">&nbsp;<?php echo $result[spname]; ?></td><td align="left">&nbsp;<?php echo $result[kcsl]; ?></td><td align="left">&nbsp;<?php echo $result[sum_xssl]; ?></td></tr><?php}while($result=mysql_fetch_array($sql));mysql_close();?>9.1.11 應用存儲過程實現登錄身份驗證

存儲過程是資料庫編程中最重要的內容。從MySQL 5.0以上版本開始支持存儲過程。這樣可以大大提高數據的處理速度,同時也可以提高數據編程的靈活性。使用存儲過程時,首先,需要將php_mysqli.dll文件拷貝到php5下的ext文件夾下,然後必須修改php.ini文件的設置(在更改文件前需要去除該文件的只讀屬性),添加「extension=php_mssqli.dll」命令,如圖9.14所示,最後,重新啟動Apache伺服器。下面介紹如何創建存儲過程。(1)首先聲明一個存儲過程,語法如下:CREATE PROCEDURE proc_name([proc_parameter[,…]])[characteristic…] routine_body其中,CREATE PROCEDURE是創建存儲過程的關鍵字;proc_name表示存儲過程的名稱;proc_parameter表示存儲過程的參數。存儲過程的參數有3種類型,即in、out、inout。其中參數in表示輸入參數;out表示輸出參數;inout表示該參數既可以輸入也可以輸出。(2)其次,必須在創建的存儲過程的SQL語句中使用BEGIN…END。(3)最後,利用「Call proc_name(@a);」調用存儲過程。其中,@a是傳入的參數,用來保存統計結果。使用存儲過程具有以下優點。(1)存儲過程被創建後,可以在程序中被多次調用,而不必重新編寫該存儲過程的MySQL語句,在對存儲過程進行更改時,對程序的源碼毫無影響。(2)存儲過程的執行速度要比執行批處理的速度快得多。(3)系統管理員可以對執行某一存儲過程的許可權進行限制,從而保證數據的安全。調用存儲過程的語法如下:{CALL procname (?,?)}其中,procname表示存儲過程的名稱;?表示傳遞的參數。下面通過具體的範例來講解存儲過程的應用。範例09-08 應用存儲過程實現登錄身份驗證

範例位置:mrfl 9 8

錄像位置:mrlx 9目前,驗證用戶登錄身份的方法有多種,而通過調用存儲過程來實現用戶身份驗證是目前最好的解決方案之一。因為存儲過程在創建時即在伺服器上進行編譯,所以執行起來要比單個MySQL語句快得多。運行本範例,在「用戶名」和「密碼」文本框中輸入正確的用戶名和密碼,單擊【登錄】按鈕即可進行用戶身份驗證。運行結果如圖9.15所示。

本範例的開發過程如下。(1)在MySQL資料庫中建立存儲過程user_ login,語句如下:mysql>delimiter //mysql>CREATE PROCEDURE user_login(inout name varchar(20),inout pwd varchar(20))mysql>Beginmysql>select * from tb_admin username=name and pwd=pwd;->END->//

注意:在上面的語句中,"delimiter //"表示將當前的語句結束符號從「:」改成"//",這樣就可以在存儲過程的內部使用分號";"了;而「//」表示MySQL語句的結束符,即建立存儲過程。(2)建立數據源的連接,使用存儲過程時與建立其他的數據源有所區別,需要創建一個MySQL對象,代碼如下:<?php$link=new mysqli("localhost","root","root","db_admin");$link->query("set names gb2312",MYSQLI_USE_RESULT);?>(3)利用Call語句調用存儲過程,對傳遞的參數進行驗證,並對驗證結果給出相應的信息提示。關鍵程序代碼如下:<?phpif($_POST["submit"]<>""){$result=$link->query("call user_login("".$_POST[username]."","".$_POST[pwd]."")",MYSQLI_USE_RESULT);$info=mysqli_fetch_array($result);if($info==true){echo "<script>alert("恭喜您,登錄成功!");</script>";}else{echo "<script>alert("對不起,您輸入的用戶名或密碼錯誤,請您重新輸入!");</script>";}}?>9.1.12 應用事務添加留言信息事務是資料庫高級編程的一個重要內容。在編程中,經常需要使用事務。所謂事務,就是一系列必須都成功的操作,只要有一步操作失敗,所有其他的操作也必須撤銷。下面就來講解事務在MySQL中的應用。在默認的情況下,MySQL對於普通的SQL語句都是自動提交的,即當SQL語句執行完畢後會立刻在資料庫中得到提交。在MySQL中,如果要關閉自動提交,可以使用以下語句:set autocommit=0;自動提交被關閉之後,執行SQL語句則會自動啟動事務處理,所有的SQL語句都被當作事務來執行。在自動提交打開的時候,系統是不會自動進入事務處理階段的,必須使用如下語句才能啟動事務處理:start transaction;在執行完事務塊的所有語句後,如果要真正提交到資料庫,必須調用以下語句:commit;如果在事務的執行過程中出現意外或者發生錯誤,可以取消所有執行的SQL語句,調用以下語句即可:rollback;當真正調用commit語句後,執行結果纔能夠被其他用戶看見。下面通過具體的範例來介紹事務處理在MySQL中的實現。範例09-09 應用事務添加留言信息

範例位置:mrfl 9 9

錄像位置:mrlx 9本範例主要應用事務添加留言信息。運行本範例,在留言信息頁面添加留言信息,如圖9.16所示,單擊【提交留言】按鈕,提交留言信息到數據處理頁應用事務進行處理,如果留言信息正確,則進行輸出,運行結果如圖9.17所示。

圖9.16 應用事務添加留言信息

圖9.17 查看留言信息本範例的實現過程如下。(1)利用包含文件命令include引用資料庫配置文件「conn.php」,代碼如下:<?php include "conn/conn.php"; ?>(2)首先需要在查詢語句前應用「start transaction」命令啟動事務,然後利用Insert into語句向數據表中添加用戶留言信息(中間的各個操作都按普通順序書寫,而不用考慮數據回滾的問題,在程序最後判斷是否有錯誤)。如果數據有誤,則使用「rollback」語句進行事務回滾;如果數據正確,使用「commit」命令提交留言信息,當前事務即結束。再使用「echo」語句輸出添加留言信息成功的信息。程序代碼如下:<?phpsession_start();$Author=$_SESSION[UserName];$Face="face".$_POST[emote].".gif";$content=$_POST[content];$Createtime=date("y-m-d h:i:s");$IP=getenv(REMOTE_ADDR);if ($_POST[content]!="" ) {$myquery="start transaction"; //啟動事務$result=mysql_query($myquery); //執行啟動事務sql語句$myquery=mysql_query("Insert Into tb_topic (Author,Face,content,CreateTime,IP) values ("$Author"," $Face","$content","$Createtime","$IP")"); //執行插入sql語句$result=mysql_fetch_array($myquery);if(!$myquery){mysql_query("rollback"); //調用rollback取消事務,這樣會導致前面的一條記錄插入也失敗echo "插入失敗!事務被取消!<br>";}else{mysql_query("commit");echo "事務提交成功!<br>";}}?>(3)利用For循環語句輸出tb_topic數據表中的信息,來查看提交留言信息的結果是否正確。代碼如下:<?php//檢索判斷是否新數據已經插入成功$result = mysql_query("select * from tb_topic") or die("<br>查詢表items失敗: " . mysql_error());$rows=mysql_num_rows($result); //取得記錄數量echo "<br>";echo "<table border=1 align=center ><tr align=center bgcolor=#9cA6C6><td>編號</ td> <td>用戶名</ td><td>頭像</td><td>留言信息</td><td>留言時間</td><td>用戶IP</td></tr>";for ($i=0;$i<$rows;$i++){$row=mysql_fetch_array($result);echo "<tr><td> $row[0] </td> <td> $row[1] </td> <td> $row[2] </td><td> $row[3] </td><td> $row[4] </td><td> $row[5] </td></tr>";}echo "</table>";echo " <br><table align=center><tr><td>總記錄數: $rows </td></tr></table><br>";?>
推薦閱讀:

查看原文 >>
相關文章