函數名 | 返回值 |
mysql_ f e t c h _ r o w ( ) | 一個數組,由數字索引訪問其元素 |
mysql_ f e t c h _ a r r a y ( ) | 一個數組,由數字索引或相關索引訪問其元素 |
mysql_ f e t c h _ o b j e c t ( ) | 一個對象,作為屬性訪問其元素 |
最基本的調用是mysql_ f e t c h _ r o w ( ),它返回結果集的下一行作為一個數組。數組的元素通過從0 到mysql_ n um _ f i e l d s ( )-1范圍內的數字索引訪問。下面的實例說明了如何在每一行都提取和打印值的簡單循環中使用mysql_ f e t c h _ r o w ( ):
變量$row 是一個數組。可用$row[$i] 訪問它, $ i在這里是數字列索引。如果熟悉php count() 函數,可以試著用它而不要用mysql_num_fields() 來確定每一行的列數。count() 只計算這個數組中已設置值的元素的數量, php 不是與null 列值相對應的元素設置值。count ( ) 對返回列數的度量是不可靠的,因為那不是它想要的。它還用于另外兩種提取行的函數。
第二個提取行的函數mysql_fetch_array() 在表8 - 1中列出,它與mysql_fetch_row() 相類似,但是由數字索引和相關索引返回的數組元素都是可靠的。換句話說,可以通過數字或名稱訪問元素:
由mysql_fetch_array() 返回的信息是mysql_fetch_row() 返回的信息的擴展集。除此之外,兩個函數之間的不同性能是可以忽略不記的,調用mysql_ f e t c h _ a r r a y ( )可以無特殊性能損耗。
第三個提取行的函數mysql_ f e t c h _ o b j e c t ( ),返回結果集的下一行作為對象,這意味著用$row->col_name 語法訪問行的元素。例如,如果從president 表中檢索last_name 和first_name 值,可以用$row->last_name 和$row->first_name 訪問那些列:
在查詢結果中測試null 值
可以使用isset() 函數測試select 查詢返回的列值是否為null。例如,如果行包含在$row 數組中,那么如果$row[$i] 對應于null 值,則isset($row[$i]) 就為fa l s e,如果$row[$i] 為非null 值,則isset($row[$i]) 就為t r u e。相關的函數是e m p t y ( ),但是對于null 和空字符串,empty() 返回的結果都是一樣的,因此作為null 值測試而言,這個函數是無用的。
如果查詢包括計算的列怎么辦?例如,發布一個作為表達式結果計算的返回值的查詢:
select concat(first_name," ",lsat_last_name)from president
這樣編寫的查詢不適于使用mysql_ f e t c h _ o b j e c t ( )。選擇的列名本身就是表達式,它不是合法的屬性名。然而,可以通過給列賦予一個別名來提供合法的名稱。下面的查詢將列的別名命名為f ul l _ name,如果用mysql_fetch_object() 提取結果,就允許它以$row->full_name 形式來訪問:
select concat(first_name," ",lsat_last_name) as full_name from president
處理錯誤
php提供了三種處理錯誤的方法:
■ 用‘@’取消錯誤消息??梢詫σ恍╋@示消息的函數使用‘ @’。當我們調用mysql_pconnect() 阻止來自于函數的錯誤消息不在發送到客戶機的頁面上出現時,就已經在做這一點了。
使用error_reporting() 函數。這個函數按下列級別將錯誤報告打開或者關閉:
錯誤級別 | 錯誤報告類型 |
1 | 正常函數錯誤 |
2 | 正常警告 |
4 | 分析程序錯誤 |
8 | 請注意 |
為了控制錯誤報告,可調用error_reporting() 函數,且參數為想要激活的級別的總和。關閉級別1和級別2警告應該完全能夠取消來源于mysql的消息:
error_reporting(4+8);
你可能不想關閉有關分析錯誤的級別4警告,如果關掉了,可能要有一段艱難的時間用來調試它對腳本造成的改動!級別8警告常常被忽略,但有時它指出腳本中應該注意的問題,因此您可能也想把它激活。還有16和3 2錯誤級別,它們都來自于php 核心發動機,而非函數,因此通常情況下不必考慮它們。
使用mysql_error() 和mysql_er r n o ( )。這些函數報告了mysql服務器返回的錯誤信息。它們與相應的c api 調用相類似。mysql_error() 以字符串形式返回錯誤信息(如果不發生錯誤就返回空字符串)。mysql_errno() 返回一個錯誤數字(如果不發生錯誤就返回0)。兩個函數都有指定與mysql服務器連接的連接標識符參數,在返回狀態的連接上都返回最近調用的mysql函數的錯誤信息。連接標識符是可選的,如果缺失,就使用最近打開的連接。例如,可以這樣報告mysql_query() 的錯誤:
mysql_error() 和mysql_errno() 的php 版本在一個重要方面與c api 中對應的部分不同。在c 中,即使試圖連接服務器失敗,也會得到錯誤信息。相反, php 調用直到連接建立成功,才返回有用的連接信息。換句話說,如果連接失敗,就不能用mysql_error() 和mysql_er r n o ( ) 報告失敗原因。如果要報告連接失敗的特殊原因而不是普通原因,則必須做特殊的考慮。請參閱附錄h“php api 參考”,其中詳細介紹了如何去做。
當檢測到錯誤時,本章的腳本打印了相當普通的錯誤信息,如“查詢失敗”。然而在開發腳本時,您會發現:加入一個mysql_error() 調用對幫您發現錯誤的特殊原因是很有用的。
引用問題
在php 中構造查詢字符串時,知道引用問題是必要的,就像在c 和perl 中一樣。雖然函數名在各種語言中是不同的,但處理引用問題的方法卻是類似的。假設正在構造一個,將新的記錄插入到表中的查詢,可以在值的前后加上引號插入到字符串列中:
這里的問題是引用值的本身還包含著引號(“o’m a l l e y”),如果將查詢發送到mysql服務器會導致語法錯誤。在c 中我們調用mysql_escape_string() 解決這個問題。在perl dbi腳本中則使用quote( ) 。php 有一個addslashes( ) 函數可以完成同樣的事情。例如,調用a d d s l a s h e s(“o’ malley”)返回“o’ malley” 值。將前面的實例做如下編寫來解決引用問題:
dbi quote( ) 方法是把前后的引號加到字符串中。addslashes( ) 則不是,因此我們仍需在查詢字符串中要插入值的周圍將那些引號顯式地指定出來。
當編寫信息出現在web 頁面上時也將發生引用問題。如果正在編寫一個將作為html 或u r l的部分出現的字符串,而且這個字符串包含html 或url 內部的特殊字符,最好將它編碼。php 函數htmlspecialchars( ) 和urlencode( ) 可以做到這點,它們與c g i . p m
escapehtml( ) 和escape( ) 方法相類似。
新聞熱點
疑難解答