LXXXVII. MySQL 函數

簡介

可以使用本類函數訪問 MySQL 資料庫伺服器。有關 MySQL 的詳細訊息可以到 http://www.mysql.com/ 查詢。

MySQL 的文件可以在 http://dev.mysql.com/doc/ 找到。

需求

為了能夠順利的使用本類函數,必須在編譯 PHP 的時候增加 MySQL 的支援。

安裝

編譯時,只要使用 --with-mysql[=DIR] 配置選項即可,其中可選的 [DIR] 指向 MySQL 的安裝目錄。

本 MySQL 增加庫不支援 MySQL 4.1.0 以上版本全部功能。對此,可用 MySQLi

若果要同時安裝 mysql 增加庫和 mysqli 增加庫,必須使用同一個用戶端庫以避免任何衝突。

在 Linux 系統下安裝

PHP 4

預設開啟了 --with-mysql 選項。此預設行為可以用 --without-mysql 配置選項來禁止。若果啟用 MySQL 而不指定安裝目錄的話,PHP 將使用綁定的 MySQL 用戶端連線庫。

還有其它套用程式使用 MySQL(例如 auth-mysql)的會員不要用綁定的庫,而要指定 MySQL 的安裝目錄,如這樣:--with-mysql=/path/to/mysql。這將強制 PHP 使用隨 MySQL 安裝的用戶端連線庫,就可以避免任何衝突。

PHP 5+

MySQL 預設未啟用,也沒有綁定的 MySQL 庫。其原因見此 FAQ。使用 --with-mysql[=DIR] 配置選項來加入 MySQL 的支援。可以從 MySQL 下載標頭檔和庫

在 Windows 系統下安裝

PHP 4

PHP MySQL 增加已經編譯入 PHP。

PHP 5+

MySQL 預設未啟用,因此必須在 php.ini 中啟動 php_mysql.dll 動態連線庫。此外,PHP 還需要訪問 MySQL 用戶端連線庫。PHP 的 Windows 發行版內含了一個 libmysql.dll,為了讓 PHP 能和 MySQL 對話,此檔案必須放在 Windows 的系統路徑 PATH 中。怎樣做見 FAQ 中的「怎樣把 PHP 目錄加入到 Windows 路徑中」。儘管將 libmysql.dll 複製到 Windows 系統目錄中也可以(因為系統目錄預設在系統路徑 PATH 中),但不推薦這樣做。

要啟動任何 PHP 增加庫(例如 php_mysql.dll),PHP 指令 extension_dir 要被設為 PHP 增加庫所在的目錄。參見手動 Windows 安裝指南。PHP 5 下 extension_dir 取值的一個例子是 c:\php\ext

注: 若果啟動 web 伺服器時出現類似如下的錯誤:"Unable to load dynamic library './php_mysql.dll'",這是因為系統找不到 php_mysql.dll 和/或 libmysql.dll

MySQL 安裝注意事項

警示

當同時加在本增加庫和 recode 增加庫時 PHP 可能會崩潰。更多訊息見 recode 增加庫。

注: 若果需要不同於 latin(預設值)的字集,必須安裝外部的(非綁定的)已編譯入所需字集支援的 libmysql。

運行時配置

這些函數的行為受 php.ini 的影響。

表格 1. MySQL 配置選項

選項名稱預設值可修改範圍更新記錄
mysql.allow_persistent"1"PHP_INI_SYSTEM 
mysql.max_persistent"-1"PHP_INI_SYSTEM 
mysql.max_links"-1"PHP_INI_SYSTEM 
mysql.trace_mode"0"PHP_INI_ALL自 PHP 4.3.0 起可用
mysql.default_portNULLPHP_INI_ALL 
mysql.default_socketNULLPHP_INI_ALL自 PHP 4.0.1 起可用
mysql.default_hostNULLPHP_INI_ALL 
mysql.default_userNULLPHP_INI_ALL 
mysql.default_passwordNULLPHP_INI_ALL 
mysql.connect_timeout"60"PHP_INI_ALL自 PHP 4.3.0 起可用。在 PHP <= 4.3.2 時為 PHP_INI_SYSTEM
有關 PHP_INI_* 常量進一步的細節與定義參見附錄 G

以下是配置選項的簡要解釋。

mysql.allow_persistent boolean

是否容許 MySQL 的持久連線

mysql.max_persistent integer

每個程式中最大的持久連線數目。

mysql.max_links integer

每個程式中最大的連線數,內含持久連線。

mysql.trace_mode boolean

追蹤模式。當啟動 mysql.trace_mode 時,將會顯示 table/index 掃瞄的警示,未釋放的結果集以及 SQL 錯誤。(PHP 4.3.0 引進)

mysql.default_port string

指定預設連線資料庫的 TCP 埠號。若果沒有指定預設埠號,則按順序從 MYSQL_TCP_PORT 環境變量,/etc/services 檔案中的 mysql-tcp 項或是編譯時特殊的 MYSQL_PORT 常量中取得。Win32 環境下只會使用 MYSQL_PORT 常量。

mysql.default_socket string

當使用本地連線的時候,預設的 socket 名稱。

mysql.default_host string

預設連線的資料庫伺服器位址。不適用於 SQL 安全模式

mysql.default_user string

預設連線資料庫時使用的會員名。不適用於 SQL 安全模式

mysql.default_password string

預設連線資料庫時使用的密碼。不適用於 SQL 安全模式

mysql.connect_timeout integer

連線逾時秒數。在 Linux 中,此參數設定了等候來自伺服器的響應的時長。

資源類型

在 MySQL 模組中使用了兩種資源類型。第一種是資料庫的連線識別碼,第二種是 SQL 查詢返回的結果集。

預定義常量

以下常量由本增加模組定義,因此只有在本增加模組被編譯到 PHP 中,或是在運行時被動態加載後才有效。

在 PHP 4.3.0 以後的版本中,容許在 mysql_connect() 函數和 mysql_pconnect() 函數中指定更多的用戶端旗標。下面列出所定義的常量:

表格 2. MySQL 用戶端常量

常量說明
MYSQL_CLIENT_COMPRESS使用壓縮的通信協定
MYSQL_CLIENT_IGNORE_SPACE容許在函數名後留空格位
MYSQL_CLIENT_INTERACTIVE容許設定中斷連線之前所閒置等候的 interactive_timeout 時間(代替 wait_timeout)。
MYSQL_CLIENT_SSL 使用 SSL 加密。本標誌僅在 MySQL 用戶端庫版本為 4.x 或更高版本時可用。在 PHP 4 和 Windows 版的 PHP 5 安裝包中綁定的都是 3.23.x。

mysql_fetch_array() 函數使用一個常量來表示所返回陣列的類型。下面是常量的定義:

表格 3. MySQL fetch 常量

常量說明
MYSQL_ASSOC 返回的資料列使用欄位名作為陣列的索引名。
MYSQL_BOTH 返回的資料列使用欄位名及數字索引作為陣列的索引名。
MYSQL_NUM 返回的資料列使用數字索引作為陣列的索引名。索引從 0 開始,表示返回結果的第一個欄位。

注解

注: 大多數 MySQL 函數都接受 link_identifier 作為最後一個可選參數。若果未提供此參數,則使用最後一個開啟的連線。若果不存在連線,則會用 php.ini 中定義的預設參數去嘗試建立連線。若果連線不成功,函數返回 FALSE

範例

下面的簡單例子演示如何連線資料庫,執行查詢語句,列印返回結果集和中斷資料庫等一系列基本的 MySQL 動作。

例子 1. MySQL 例子

<?php
// 連線,選取資料庫
$link mysql_connect('mysql_host''mysql_user''mysql_password')
    or die(
'Could not connect: ' mysql_error());
echo 
'Connected successfully';
mysql_select_db('my_database') or die('Could not select database');

// 執行 SQL 查詢
$query 'SELECT * FROM my_table';
$result mysql_query($query) or die('Query failed: ' mysql_error());

// 用 HTML 顯示結果
echo "<table>\n";
while (
$line mysql_fetch_array($resultMYSQL_ASSOC)) {
    echo 
"\t<tr>\n";
    foreach (
$line as $col_value) {
        echo 
"\t\t<td>$col_value</td>\n";
    }
    echo 
"\t</tr>\n";
}
echo 
"</table>\n";

// 釋放結果集
mysql_free_result($result);

// 關閉連線
mysql_close($link);
?>

目錄
mysql_affected_rows -- 取得前一次 MySQL 動作所影響的記錄行數
mysql_change_user -- 改變活動連線中登入的會員
mysql_client_encoding -- 返回字集的名稱
mysql_close -- 關閉 MySQL 連線
mysql_connect -- 開啟一個到 MySQL 伺服器的連線
mysql_create_db -- 新增一個 MySQL 資料庫
mysql_data_seek -- 搬移內定結果的指標
mysql_db_name -- 取得結果資料
mysql_db_query -- 傳送一條 MySQL 查詢
mysql_drop_db -- 丟棄(移除)一個 MySQL 資料庫
mysql_errno --  返回上一個 MySQL 動作中的錯誤訊息的數字編碼
mysql_error --  返回上一個 MySQL 動作產生的文字錯誤訊息
mysql_escape_string --  轉義一個字串用於 mysql_query
mysql_fetch_array --  從結果集中取得一行作為關聯陣列,或數字陣列,或二者兼有
mysql_fetch_assoc --  從結果集中取得一行作為關聯陣列
mysql_fetch_field --  從結果集中取得列訊息並作為物件返回
mysql_fetch_lengths --  取得結果集中每個輸出的長度
mysql_fetch_object -- 從結果集中取得一行作為物件
mysql_fetch_row -- 從結果集中取得一行作為枚舉陣列
mysql_field_flags --  從結果中取得和指定欄位關聯的標誌
mysql_field_len --  返回指定欄位的長度
mysql_field_name --  取得結果中指定欄位的欄位名
mysql_field_seek --  將結果集中的指標設定為制定的欄位偏移量
mysql_field_table --  取得指定欄位所在的表名
mysql_field_type --  取得結果集中指定欄位的類型
mysql_free_result -- 釋放結果記憶體
mysql_get_client_info -- 取得 MySQL 用戶端訊息
mysql_get_host_info -- 取得 MySQL 主電腦訊息
mysql_get_proto_info -- 取得 MySQL 協定訊息
mysql_get_server_info -- 取得 MySQL 伺服器訊息
mysql_info --  取得最近一條查詢的訊息
mysql_insert_id --  取得上一步 INSERT 動作產生的 ID
mysql_list_dbs --  列出 MySQL 伺服器中所有的資料庫
mysql_list_fields -- 列出 MySQL 結果中的欄位
mysql_list_processes -- 列出 MySQL 程式
mysql_list_tables -- 列出 MySQL 資料庫中的表
mysql_num_fields -- 取得結果集中欄位的數目
mysql_num_rows -- 取得結果集中行的數目
mysql_pconnect --  開啟一個到 MySQL 伺服器的持久連線
mysql_ping -- Ping 一個伺服器連線,若果沒有連線則重新連線
mysql_query -- 傳送一條 MySQL 查詢
mysql_real_escape_string --  轉義 SQL 語句中使用的字串中的特殊字元,並考慮到連線的現用的字集
mysql_result -- 取得結果資料
mysql_select_db -- 選取 MySQL 資料庫
mysql_stat -- 取得現用的系統狀態
mysql_tablename -- 取得表名
mysql_thread_id -- 返回現用的執行緒的 ID
mysql_unbuffered_query --  向 MySQL 傳送一條 SQL 查詢,並不取得和暫存結果的行