PHP訪問MySQL數(shù)據(jù)庫服務(wù)器的流程
MySQL采用的是“客戶機/服務(wù)器”體系結(jié)構(gòu)蜗字〉欤可以使用PHP腳本去處理數(shù)據(jù)庫中的數(shù)據(jù),則PHP充當(dāng)了MySQL“客戶機”的角色晴楔。因為通過PHP程序再去結(jié)合一些前臺技術(shù)開發(fā)的圖形界面摆昧,就可以很輕松的管理數(shù)據(jù)庫了。
PHP訪問MySQL數(shù)據(jù)庫服務(wù)器是通過安裝相應(yīng)的擴展模塊完成的蜒程,本章重點是介紹使用mysql擴展模塊中的函數(shù)去訪問MySQL绅你。要想使用這個功能擴展模塊,PHP的Linux版本必須在編譯時加上一個--with-mysql選項昭躺。PHP的Windows版本則通過一個DLL文件提供了相應(yīng)的擴展忌锯。無論使用的是哪一種操作系統(tǒng),都必須在php.ini文件里啟用這個擴展以確保PHP能夠找到所有必要的DLL领炫∨伎澹可以通過查看phpinfo()確認(rèn)mysql模塊是否安裝。
使用PHP安裝的mysql擴展函數(shù)帝洪,和直接使用客戶端軟件去訪問MySQL數(shù)據(jù)庫服務(wù)器似舵,原理及操作步驟是相同的。
在PHP腳本中操作MySQL數(shù)據(jù)庫
1. 連接MySQL數(shù)據(jù)庫服務(wù)器
通過PHP腳本程序去管理MySQL服務(wù)器中的數(shù)據(jù)葱峡,也必須先建立連接砚哗,然后才能通過PHP中的函數(shù)向服務(wù)器中發(fā)送SQL查詢語句。PHP可以通過MySQL功能模塊去連接MySQL服務(wù)器砰奕,辦法是調(diào)用mysql_connect()函數(shù)蛛芥,和使用MySQL客戶機程序連接MySQL服務(wù)器類似。
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]] )
如果連接成功军援,這個函數(shù)將返回一個資源類型的標(biāo)識符號($link)仅淑。如果與MySQL服務(wù)器建立了不只一條的連接,在以后的操作中就必須使用它們的標(biāo)識符號來區(qū)分它們胸哥。而如果只與MySQL服務(wù)器建立了一條連接涯竟,這條連接就會成為與MySQL服務(wù)器之間的默認(rèn)連接,也就無須在調(diào)用各種與MySQL操作相關(guān)的函數(shù)中給出這個標(biāo)識符號了烘嘱。如果連接失敗昆禽,這個函數(shù)將返回FALSE,并向Web服務(wù)器發(fā)送一條出錯消息蝇庭∽肀睿可以通過下面的代碼檢查與MySQL服務(wù)器建立的連接是否成功,并輸出與當(dāng)前連接有關(guān)的詳細(xì)信息哮内。
2. 判斷是否連接正確
我們也可以使用兩個函數(shù)來判斷盗棵,mysql_errno()
和mysql_error()
壮韭,這兩個函數(shù)分別返回上次MySQL發(fā)生的錯誤號和錯誤信息,如果未發(fā)生任何錯誤,mysql_errno()
函數(shù)將返回0
.所以纹因,我們可以使用判斷來進行處理:
int mysql_errno ([ resource $link_identifier ] )
string mysql_error ([ resource $link_identifier ] )
if(mysql_errno()){
exit(‘?dāng)?shù)據(jù)庫連接錯誤喷屋!’.mysql_error());
}
3. 選擇數(shù)據(jù)庫
通常數(shù)據(jù)庫的創(chuàng)建工作都是先由數(shù)據(jù)庫管理員(DBA)建立,再由PHP程序員在腳本中使用瞭恰。在使用PHP腳本建立起與MySQL服務(wù)器的連接之后屯曹,為了避免每次調(diào)用PHP的mysql擴展函數(shù)時都指定目標(biāo)數(shù)據(jù)庫,最好先用mysql_select_db()
函數(shù)為后續(xù)操作選定一個默認(rèn)數(shù)據(jù)庫惊畏,這個函數(shù)和SQL命令“USE bookstore”功能相似恶耽。
bool mysql_select_db ( string $database_name [, resource $ link_identifier ] )
4. 設(shè)置字符集
為了避免讀取和寫入數(shù)據(jù)時發(fā)生數(shù)據(jù)亂碼,除了要將文件格式設(shè)置為utf-8無bom頭格式颜启,還要將數(shù)據(jù)庫客戶端字讀集設(shè)置為utf8偷俭,所以我們需要在發(fā)送sql語句之前,使用mysql_set_charset()
函數(shù)來完成數(shù)據(jù)庫字符集的設(shè)定缰盏!
bool mysql_set_charset ( string $charset [, resource $link_identifier = NULL ] )
5. 準(zhǔn)備SQL語句
設(shè)置字符集完畢之后涌萤,我們需要為讀取或?qū)懭霐?shù)據(jù)設(shè)計SQL語句字符串,
例如:
$sql = “select username,password from bbs_user”;
6. 發(fā)送SQL語句到MySQL服務(wù)器
設(shè)計好SQL語句之后口猜,我們使用函數(shù)mysql_query()
函數(shù)负溪,將SQL語句發(fā)送到MySQL數(shù)據(jù)庫服務(wù)器,由MySQL數(shù)據(jù)庫服務(wù)器來執(zhí)行此SQL語句
這里注意暮的,我們之所以將SQL語句賦值給一個變量是為了出現(xiàn)錯誤的時候便于排錯笙以,我們可以直接輸出$sql這個變量。
int/resource mysql_query ( string $query [, resource $link_identifier ] )
7. 處理結(jié)果集
將SQL語句發(fā)送到MySQL服務(wù)器之后冻辩,MySQL服務(wù)器會將執(zhí)行SQL語句之后的結(jié)果返回給PHP端猖腕,這里的結(jié)果分為兩種:
1.布爾型
2.結(jié)果集資源類型
當(dāng)我們執(zhí)行的SQL語句是DML語句,也就是增恨闪,刪倘感,改三種語句,這時mysql_query()
返回的類型是布爾類型咙咽,執(zhí)行成功返回真老玛,失敗返回假,但有時SQL語句執(zhí)行成功钧敞,但不一定有受影響行數(shù)蜡豹,所以我們可以使用mysql_affected_rows()
函數(shù)返回受影響行數(shù);
當(dāng)我們執(zhí)行的是DQL語句溉苛,也就是查詢語句镜廉,mysql_query()
函數(shù)將返回的是結(jié)果集資源類型,我們可以使用mysql_num_rows($result)
函數(shù)來獲取結(jié)果集當(dāng)中的記錄條數(shù)愚战,但是我們無法將結(jié)果集資源當(dāng)中的數(shù)據(jù)得到娇唯,因此PHP為我們提供了4個函數(shù)齐遵,來解析此結(jié)果集資源:
- mysql_fetch_array() 返回索引和關(guān)聯(lián)的混合數(shù)組
- mysql_fetch_assoc() 返回關(guān)聯(lián)數(shù)組
- mysql_fetch_row() 返回索引數(shù)組
- mysql_fetch_object() 返回一個對象
如果沒有特殊要求,盡量不要去使用mysql_fetch_array()方法塔插。使用mysql_fetch_row()或mysql_fetch_assoc()函數(shù)實現(xiàn)相同的功能梗摇,效率會更高一些。上述四個函數(shù)每執(zhí)行一次想许,結(jié)果集資源的指針都將向后移動一位伶授,直到最后一位,將返回布爾類型的FALSE流纹,因此谎砾,我們可以使用條件型循環(huán)while配合上述四個函數(shù)來使用,以mysql_fetch_assoc()函數(shù)為例捧颅,如下所示:
while($row=mysql_fetch_assoc($result)){
//$row為一條記錄的數(shù)組
}
從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組,或數(shù)字?jǐn)?shù)組较雕,或二者兼有
array mysql_fetch_array ( resource $result [, int $ result_type ] )
從結(jié)果集中取得一行作為關(guān)聯(lián)數(shù)組
array mysql_fetch_assoc ( resource $result )
從結(jié)果集中取得一行作為對象
object mysql_fetch_object ( resource $result )
從結(jié)果集中取得一行作為枚舉數(shù)組
array mysql_fetch_row ( resource $result )
取得結(jié)果集中行的數(shù)目
int mysql_num_rows ( resource $result )
除此之外碉哑,我們還可以使用mysql_insert_id()
來獲取插入的上一條記錄的主鍵ID的值,可以使用mysql_num_fileds()
來獲取結(jié)果集中字段的個數(shù)亮蒋,mysql_fetch_field()
函數(shù)將取得具體字段的信息扣典,mysql_result()
獲取查詢記錄的第n條信息。
取得前一次 MySQL 操作所影響的記錄行數(shù)
int mysql_affected_rows ([ resource $link_identifier ] )
取得上一步 INSERT 操作產(chǎn)生的 ID
int mysql_insert_id ([ resource $link_identifier ] )
取得結(jié)果集中字段的數(shù)目
int mysql_num_fields ( resource $result )
取得結(jié)果數(shù)據(jù)
mixed mysql_result ( resource $result , int $row [, mixed $field ] )
從結(jié)果集中取得列信息并作為對象返回
object mysql_fetch_field ( resource $result [, int $field_offset ] )
8.釋放結(jié)果集資源慎玖,關(guān)閉數(shù)據(jù)庫連接
PHP會把結(jié)果數(shù)據(jù)表一直保存到PHP腳本執(zhí)行結(jié)束贮尖,如果必須提前釋放某次查詢的結(jié)果數(shù)據(jù)表,就可使用mysql_free_result()
函數(shù)提前釋放它趁怔,最后將數(shù)據(jù)庫連接關(guān)閉掉湿硝,我們使用mysql_close()
函數(shù)來完成。
bool mysql_free_result ( resource $result )
bool mysql_close ([ resource $link_identifier ] )
使用mysql函數(shù)實現(xiàn)一套留言表信息的增刪改查練習(xí)