1
2
3
4
5
6
7
8
9
10
11

PHP操作MySQL方法詳解

發(fā)布時間:2017-07-20 07:59   發(fā)布人:毛書朋   浏覽次數:9308


關聯課件: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所示。

5-1.1.png

5-1.2.png

       這(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.jpg

圖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.jpg

圖5-5  程序5-2.php正确運行的結果

5-6.jpg

圖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.png

圖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.jpg

圖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.jpg

圖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)的編程習慣。



  • 孫淑平 2018-01-07 16:13:23
    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
  • 劉鑫蕊 2018-01-09 16:13:04
    老師講的很詳細,從中學(xué)到了很多。
  • 馬文琦 2018-01-09 16:17:15
    函數與數據庫之間密切聯系
  • 嶽猛 2018-01-09 16:28:43
    經(jīng)過(guò)學(xué)習自己試了一下學(xué)會了好(hǎo)多的知識
  • 魏德旺 2018-01-09 16:30:33
    内容很多,很詳細,慢慢細細品味就知道(dào)其中的意義了 ,雖然總是出錯,但學(xué)會的感覺很爽