關聯課件:5子項目五 -PHP操作MySQL方法詳解(點擊在線預覽)
5.3.3 PHP操作MySQL方法詳解
5.3.3.1 PHP提供的MySQL操作函數
PHP提供了大量函數,使用戶可以方便地使用PHP連接到MySQL數據庫,并對(duì)數據進(jìn)行操作。學(xué)習PHP+MySQL數據庫編程,首先要了解這(zhè)些函數,明确具體的步驟,然後(hòu)才能(néng)進(jìn)入實質性開(kāi)發(fā)階段。
PHP中可以用來操作MySQL數據庫的函數如表5-1所示。
這(zhè)些函數中,最常用的有mysql_connect()、mysql_select_db()、mysql_query()、mysql_ fetch_array()、mysql_num_rows()、mysql_close()等,下面(miàn)就着重介紹這(zhè)幾個函數的使用。
5.3.3.2 在PHP中操縱MySQL
1.mysql_connect()函數
根據圖5-3中的流程,要在PHP中操作MySQL中的數據,第一步就是連接到數據庫服務器,也就是建立一條PHP程序到MySQL數據庫之間的通道(dào)。這(zhè)樣PHP才能(néng)通過(guò)這(zhè)個通道(dào)來向(xiàng)MySQL服務器發(fā)送各種(zhǒng)指令,并取得指令執行的結果,將(jiāng)這(zhè)些結果應用于PHP程序中。mysql_connect()函數就是用來建立和MySQL數據庫的連接。
mysql_connect()函數有5個參數,但是通常情況下隻用前3個參數,其格式如下:
resource mysql_connect (string server, string username, string password)
該函數返回類型爲resource型,即資源型。3個參數分别爲MySQL服務器地址、MySQL用戶名、密碼。這(zhè)裡(lǐ)的用戶名可以用超級管理員的,也可以用用戶表中存在的其他用戶。如下面(miàn)的語句將(jiāng)用超級管理員身份建立一個到本地服務器的連接:
$id=mysql_connect ("localhost","root","root");
其中“localhost”換成(chéng)“127.0.0.1”或本地機器的實際IP地址,效果都(dōu)是相同的。另外服務器地址後(hòu)面(miàn)可以指定MySQL服務的端口号,如果是采用默認的3306端口,則不必指定。如果采用了其他端口,則需要指定,如“127.0.0.1:88”表示MySQL服務于本地機器的88端口。用戶名和密碼均需指定(如密碼爲空,則直接用兩(liǎng)個引号即可)。
將(jiāng)以上代碼寫在一個PHP程序中,寫法如下:
<?php
$id=mysql_connect("localhost","root","root");
echo $id;
?>
此程序運行之後(hòu),如果執行成(chéng)功,則會輸出一個資源型變量$id的編号,類似于“Resource id #2”。如果執行失敗,則有多種(zhǒng)可能(néng)。如果出現下列提示:
Fatal error: Call to undefined function mysql_connect in [……]
則說明本地服務器的MySQL擴展庫尚未被載入,因此PHP解釋器無法識别MySQL函數。請參照本章第一節的内容進(jìn)行重新設置。
如果出現下列提示:
Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL server host […]
則說明MySQL服務器地址錯誤,可能(néng)是輸入有錯誤,或服務器沒(méi)有啓動,或端口号不對(duì)。這(zhè)時可以檢查函數的第一個參數是否提供正确,MySQL是否已成(chéng)功啓動。
還(hái)有可能(néng)出現下列提示:
Warning: mysql_connect() [function.mysql-connect]: Access denied for user […]
這(zhè)說明用戶名或密碼有錯誤。或者本帳号沒(méi)有在MySQL服務器上登錄的權限。
這(zhè)裡(lǐ)之所以如此詳細地講解該函數,就是因爲這(zhè)是連接到MySQL數據庫的第一步。隻要這(zhè)一步成(chéng)功了,下面(miàn)的函數便都(dōu)能(néng)運行。連接到數據庫是一切工作的起(qǐ)點,因此必須保證此步驟成(chéng)功,才能(néng)繼續下面(miàn)的内容。
2.mysql_select_db()函數
連接到數據庫以後(hòu),還(hái)不能(néng)直接操作某個表,因爲表都(dōu)存儲在各個數據庫中,需要首先選擇要操作的數據庫,才能(néng)對(duì)這(zhè)個數據庫中的表進(jìn)行操作。mysql_select_db()函數就用來指定操作的數據庫。前面(miàn)的例子中曾在MySQL中創建了一個student數據庫,下面(miàn)的代碼將(jiāng)連接到數據庫服務器,并把student數據庫作爲當前要操作的數據庫。
1: <!--文件5-1.php:連接數據庫服務器,選擇數據庫-->
2: <HTML>
3: <HEAD>
4: <TITLE>連接數據庫服務器,選擇數據庫</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $id=mysql_connect("localhost","root","root");
9: if ($id){
10: echo "OK,數據庫連接成(chéng)功!<br>";
11: $ok=mysql_select_db("student",$id);
12: if($ok){
13: echo "OK,選擇數據庫成(chéng)功!";
14: }else{
15: echo "OH,選擇數據庫失敗,請确認數據庫是否存在。";
16: }
17: }else{
18: echo "OH,數據庫連接失敗!請檢查服務器地址、用戶名和地址是否正确!
<br>";
19: }
20: ?>
21: </BODY>
22: </HTML>
本程序第8行建立了一個到本地MySQL數據庫服務器的連接。第11行用mysql_select_ db()函數來指定要操作的數據庫。函數第一個參數爲數據庫的名字,第二個參數爲應用于哪個連接。第二個參數可以省略,省略時默認使用當前連接。一般來說,此參數可以直接省略。
mysql_select_db()函數返回一個布爾型值。如果執行成(chéng)功返回true,失敗則返回false。函數沒(méi)有任何錯誤信息提示。因此即使提供的數據庫名有錯誤或數據庫不存在,本函數也不會報錯。程序將(jiāng)返回結果存放在$ok中,通過(guò)判斷$ok的值來判斷是否執行成(chéng)功。程序5-1.php正确執行的效果如圖5-4所示。
圖5-4 程序5-1.php的運行結果
3.mysql_query()函數
連接到數據庫服務器,并選擇了要操作的數據庫之後(hòu),下一步就向(xiàng)服務器發(fā)送操作指令,也就是SQL語句了。第7章講過(guò)的SQL語句,在這(zhè)裡(lǐ)可以派上用場了。現在來看一個例子,用PHP程序在MySQL中創建一個數據庫newdata,并在這(zhè)個數據庫中創建一個表testtable,表的字段可以随意設置幾個。
1: <!--文件5-2.php:用PHP創建新數據庫和表-->
2: <HTML>
3: <HEAD>
4: <TITLE>用PHP創建新數據庫和表</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: if (!$id=mysql_connect("localhost","root","root")){
9: echo "數據庫服務器連接錯誤!";
10: exit; //如果數據庫服務器連接不成(chéng)功,退出程序執行
11: }
12: echo "數據庫服務器連接成(chéng)功!<br>";
13: if (!mysql_query("CREATE DATABASE newdata",$id)){
14: echo"數據庫創建不成(chéng)功,請檢查賬号權限和數據庫是否已經(jīng)存在!";
15: exit; //如果數據庫創建不成(chéng)功,退出程序執行
16: }
17: echo "數據庫創建成(chéng)功!<br>";
18: if (!mysql_select_db("newdata",$id)){
19: echo "數據庫選擇不成(chéng)功!";
20: exit; //如果數據庫選擇不成(chéng)功,退出程序執行
21: }
22: echo "數據庫選擇成(chéng)功!<br>";
23: if (!mysql_query("CREATE TABLE testtable (name varchar(10), age int(4))",$id)){
24: echo "數據表創建不成(chéng)功,請檢查SQL語句是否正确!";
25: exit; //如果SQL執行不成(chéng)功,退出程序執行
26: }
27: echo "數據表創建成(chéng)功!<br>";
28: if (mysql_close($id)){
29: echo "數據服務器連接關閉成(chéng)功!";
30: }
31: ?>
32: </BODY>
33: </HTML>
本程序正确執行的效果如圖5-5所示,再次刷新後(hòu)的執行效果如圖5-6所示。
圖5-5 程序5-2.php正确運行的結果
圖5-6 程序5-2.php第二次運行的結果
程序5-2.php的輸出結果已經(jīng)詳細說明了創建數據庫和數據表的基本步驟,程序中注釋也說明了每條語句的作用,這(zhè)裡(lǐ)就不再多說了。如果用phpMyAdmin或第7章講過(guò)的命令提示符進(jìn)入MySQL控制台,就會發(fā)現已經(jīng)成(chéng)功創建了一個名爲newdata的數據庫。打開(kāi)此數據庫,可以看到數據庫中有一個testtable表。這(zhè)也就是說程序執行的不僅僅是輸出結果成(chéng)功,而是真正的成(chéng)功。
通過(guò)程序可以看出mysql_query()函數的使用十分簡單,隻需要將(jiāng)一條SQL語句作爲參數傳遞過(guò)去,即可執行此SQL語句。第二個參數$id在一般情況下同樣可以省略。
使用mysql_query()函數可以向(xiàng)數據庫服務器發(fā)送任何合法的SQL指令(前提是數據庫要支持該指令)。程序5-2.php隻是測試了CREATE指令,實際上第7章講的INSERT、SELECT、UPDATE、DELETE等指令同樣可以用mysql_query()來執行。下面(miàn)就利用循環向(xiàng)服務器發(fā)送多次INSERT指令,向(xiàng)剛才創建的testtable表中插入多條記錄。
1: <!--文件5-3.php:用PHP向(xiàng)表中插入數據-->
2: <HTML>
3: <HEAD>
4: <TITLE>用PHP向(xiàng)表中插入數據</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $id=mysql_connect("localhost","root","root");
9: mysql_select_db("newdata",$id);
10: for($i=1;$i<6;$i++){
11: $nl=20+$i;
12: $xm="姓名".$i;
13: $sql="INSERT INTO testtable VALUES('".$xm."',".$nl.")";
14: $excu=mysql_query($sql,$id);
15: if($excu){
16: echo $sql;
17: echo "第".$i."條數據插入成(chéng)功!<br>";
18: }else{
19: echo "數據插入失敗,錯誤信息:<br>";
20: echo mysql_error(); //輸出上一次MySQL執行的錯誤信息
21: }
22: }
23: mysql_close($id);
24: ?>
25: </BODY>
26: </HTML>
爲了節省程序代碼,程序5-3.php的第8~9行的數據庫服務器的連接、數據庫的選擇就沒(méi)有再進(jìn)行正确性驗證。程序5-3.php的運行結果如圖5-7所示。
圖5-7 程序5-3.php的運行結果
要驗證5條記錄是否都(dōu)已确實插入到了數據庫中,可以用命令提示符登錄控制台,用“SELECT * FROM testtable”命令來浏覽表中的所有數據,也可以用phpMyAdmin來浏覽。
控制台中顯示的數據如下:
mysql> select * from testtable;
+-------+------+
| name | age |
+-------+------+
| 姓名1 | 21 |
| 姓名2 | 22 |
| 姓名3 | 23 |
| 姓名4 | 24 |
| 姓名5 | 25 |
+-------+------+
5 rows in set (0.00 sec)
可見數據确實已經(jīng)成(chéng)功插入到數據庫中。
程序5-3.php看起(qǐ)來行數較多,但是其結構卻很簡單。讀者可以根據所學(xué)知識分析一下。在這(zhè)裡(lǐ)僅指出3點。
1)第11~12行將(jiāng)要插入的兩(liǎng)個字段的值放在兩(liǎng)個變量中,然後(hòu)在第13行構造一個SQL語句,第14行執行這(zhè)個語句。這(zhè)裡(lǐ)之所以采用變量存放字段值和SQL語句,一是爲了使程序更加易讀,另外可以避免寫成(chéng)一條綜合語句過(guò)于複雜而容易出錯。讀者要尤其注意的是第13行,在構造SQL語句(其實就是一個普通字符串)時,不同數據類型的變量用不同的引号連接。其實這(zhè)個問題應該是一個PHP基本語法的問題,很多初學(xué)者在這(zhè)個地方容易犯迷糊,因此請讀者多加揣摩,仔細體會。
2)第20行首次使用mysql_error()函數。這(zhè)個函數可以返回上一次MySQL返回的錯誤信息。當程序出錯時輸出這(zhè)些錯誤信息對(duì)于程序的調試很有幫助。讀者可以試着故意寫錯SQL語句,或者故意發(fā)送一條非法指令到MySQL服務器,然後(hòu)調用此函數查看返回的錯誤信息。
3)如果插入數據後(hòu)出現了亂碼,則需要設置相關的編碼,因爲這(zhè)裡(lǐ)采用的是默認編碼,即Latin1字符集,所以就省略了向(xiàng)數據庫發(fā)送SET CHARACTER指令。如果數據庫服務器設置的是gb2312字符集,必須在第9行後(hòu)加入“mysql_query("SET CHARACTER SET gb2312");”進(jìn)行字符設置。這(zhè)條指令與程序功能(néng)無關。這(zhè)條語句是否加入以及具體設置什麼(me)樣的字符集與服務器采用的MySQL版本以及安裝MySQL時的設置有關。而且值得注意的是,插入時進(jìn)行了字符的設置,從數據庫中讀出數據時也必須進(jìn)行同樣的設置,否則就會出現亂碼。
下面(miàn)再來看一個從數據庫中讀取數據并用表格顯示在網頁上的例子。還(hái)是用mysql_ query()函數,向(xiàng)數據庫發(fā)送SELECT指令來查詢數據。
1: <!--文件5-4.php:用PHP從表中讀取數據-->
2: <HTML>
3: <HEAD>
4: <TITLE>用PHP從表中讀取數據</TITLE>
5: </HEAD>
6: <BODY>
7: <?php
8: $id=mysql_connect("localhost","root","root");
9: mysql_select_db("newdata",$id);
10: $query="SELECT * FROM testtable";
11: $result=mysql_query($query,$id);
12: $datanum=mysql_num_rows($result);
13: echo "表testtable中共有".$datanum."條數據<br>";
14: ?>
15: <table width="228" height="34" border="1">
16: <?php while ($info=mysql_fetch_array($result,MySQL_ ASSOC)){ ?>
17: <tr>
18: td width="99" height="28"><?php echo $info["name"]?> </td>
19: <td width="113"><?php echo $info["age"]?></td>
20: </tr>
21: <?php }?>
22: </table>
23: <?php mysql_close($id);?>
24: </BODY>
25: </HTML>
程序5-4.php的輸出結果如圖5-8所示。
圖5-8 程序5-4.php在Dreamweaver的顯示
序5-4.php在代碼中加入了一些HTML代碼,用來産生一個表格。程序又用到了幾個新的函數,下面(miàn)就來一一介紹。
1)第11行中,向(xiàng)服務器發(fā)送了一條SELECT指令。這(zhè)條指令將(jiāng)返回所有滿足條件的記錄。注意返回的記錄是一個資源類型,其内容是若幹條記錄的集合,可以成(chéng)爲一個記錄集。不能(néng)直接用來輸出,先將(jiāng)返回的數據存放在$result中。
2)第13行,用mysql_num_rows()函數來統計一個記錄集中記錄的條數。注意此函數專用于統計MySQL查詢結果記錄數,不能(néng)用來統計其他數據類型的元素個數。
3)第16~21行,充分說明了PHP是一種(zhǒng)嵌入式腳本語言,而且要養成(chéng)一個好(hǎo)的習慣,就是當有PHP和HTML代碼混合時盡量把PHP代碼嵌入到HTML中,這(zhè)樣在網頁可視化的編輯工具如Dreamweaver中就可以很好(hǎo)地把PHP代碼和網頁界面(miàn)分離開(kāi),便于編輯,如圖5-9所示。
圖5-9 程序5-4.php的運行結果
4)第16行是關鍵。這(zhè)一行用到了mysql_fetch_array()函數。此函數是PHP+MySQL編程中最常用的函數之一。此函數的格式如下:
array mysql_fetch_array (resource result [, int result_type])
該函數的作用是讀取記錄集result中的當前記錄,將(jiāng)記錄的各個字段的值存入一個數組中,并返回這(zhè)個數組,然後(hòu)將(jiāng)記錄集指針移動到下一條記錄。如果記錄集已經(jīng)到達末尾,則返回false。
第2個參數result_type爲可選,此參數用來設置返回的數組采用什麼(me)樣的下标。有3個備選值:MySQL_ASSOC、MySQL_NUM、MySQL_BOTH,其含義如下:
①MySQL_ASSOC:返回的數組將(jiāng)以該記錄的字段名稱作爲下标。如在本例中要輸出此數組中的“姓名”字段,可以用$info[‘name’]。這(zhè)裡(lǐ)$info是數組名,“name”是存放姓名的字段名。
②MySQL_NUM:返回的數組以從0開(kāi)始的數字爲下标。在本例中,返回的每條記錄隻有兩(liǎng)個字段,那麼(me)數組也就隻有兩(liǎng)個元素,分别用$info[0]、$info[1]來引用。
③MySQL_BOTH:返回的數組既可以用字段名爲下标,也可以用數字爲下标。在本例中,既可以用$info[0]來取得姓名,也可以用$info[‘name’]來取得。
讀者可以自行修改程序,對(duì)上述3個參數進(jìn)行測試。
此外,PHP中還(hái)有mysql_fetch_row()、mysql_fetch_assoc()、mysql_fetch_object()等函數,這(zhè)些函數的作用與用法都(dōu)和mysql_fetch_array()函數相似,讀者可以參考PHP手冊,了解這(zhè)幾個函數的使用。
用mysql_query()函數,結合第8章講過(guò)的SQL語句,還(hái)可以輕松實現對(duì)表内數據的删除和修改,如:
<?php
$id=mysql_connect(“localhost”,”root”,”1234”);
mysql_select_db(“newdata”,$id);
mysql_query(“DELETE FROM testtable”,$id);
mysql_close($id);
?>
這(zhè)段程序執行後(hòu),會删除表testtable中的全部數據。
此外,用UPDATE語句可以實現對(duì)表内數據的修改,這(zhè)裡(lǐ)不再舉例,讀者可以自行編寫程序練習。
4.mysql_close()函數
此函數用來關閉一個數據庫連接,其格式如下;
bool mysql_close ( [resource link_identifier] )
本函數隻有一個可選參數link_identifier。此參數表示要關閉的連接的ID。也就是mysql_connect()函數執行成(chéng)功後(hòu)返回的一個連接标記。參數爲空時表示關閉當前連接。該函數返回一個布爾型結果。當關閉成(chéng)功時返回true,關閉失敗是返回false。
<?php
$id=mysql_connect("localhost","root","1234");
if(mysql_close($id)){
echo"關閉數據庫連接成(chéng)功!";
}else{
echo"關閉數據庫連接失敗!";
}
?>
上面(miàn)的例子演示了mysql_close()函數的使用。事(shì)實上,當一個PHP腳本(也就是一個PHP頁面(miàn)以及它的包含文件)執行結束時,這(zhè)個腳本中打開(kāi)的PHP連接也會同時被關閉。因此一般情況下即使忘記了手工關閉也沒(méi)有關系。但是數據庫使用完畢後(hòu)關閉連接是一個很好(hǎo)的編程習慣。
mysql_query()-查詢MySQL 格式: resource mysql_query (string query, [resource link_id]) 例: $linkId = @mysql_connect("localhost", "username", "password") or die("不能(néng)連接到Mysql Server"); @mysql_select_db("MyDatabase") or die("不能(néng)選擇這(zhè)個數據庫,或者數據庫不存在"); $query = "select * from MyTable"; $result = mysql_query($query); mysql_close(); 說明:若SQL查詢執行成(chéng)功,則返回資源标識符,失敗時返回FALSE。若執行更新成(chéng)功,則返回TRUE,否則返回FALSE
老師講的很詳細,從中學(xué)到了很多。
函數與數據庫之間密切聯系
經(jīng)過(guò)學(xué)習自己試了一下學(xué)會了好(hǎo)多的知識
内容很多,很詳細,慢慢細細品味就知道(dào)其中的意義了 ,雖然總是出錯,但學(xué)會的感覺很爽