PHP 與資料庫互動常見問題
本節討論 PHP 與資料庫間最常見的問題。誇張地說,PHP 幾乎能操作市面上所有資料庫。
1. PHP 能操作 Microsoft SQL Server 嗎?如何做?
- Windows 平台:直接使用內建的 ODBC 驅動程式即可。
- Unix 平台:可使用 Sybase-CT 驅動操作 Microsoft SQL Server,因其協定(至少絕大多數產品)完全相容。Sybase 有免費的 Linux 版本。其他 Unix 系統可能需聯繫 Sybase 取得正確程式庫。
2. 能操作 Microsoft Access 資料庫嗎?
- Windows 9x/Me, NT/2000:已具備所有必要工具,可使用 ODBC 及 Microsoft Access ODBC 驅動。
- Unix 連接 Windows MS Access:需 Unix ODBC 驅動。OpenLink Software 提供 Unix-based ODBC 驅動,可下載試用版,商業版約 $675。
另一種做法是用帶 Windows ODBC 驅動的 SQL Server 儲存資料,再用 Microsoft Access (ODBC) 和 PHP (內建 SQL Server 驅動) 操作。或使用 Access 和 PHP 皆可開啟的檔案格式(如 dBase)。OpenLink 的 Tim Hayes 指出:若 PHP 能直接操作資料庫,用中間層資料庫非好主意。若確需中間層,OpenLink 發布了 Virtuoso (虛擬資料庫引擎),可在 NT, Linux 等 Unix 平台運行。
成功案例:使用 Windows 下的 MySQL (透過 MySQL ODBC) 同步 Access 資料庫。步驟:安裝 MySQL、建立資料庫與帳號(主機域設為 %)、安裝 MyODBC 驅動、在 ODBC 管理器建立系統 DSN、完整安裝 Access、在 Access 中「連結資料表」選擇 ODBC 並選擇建立的 DSN,即可在 Access 操作 MySQL 資料。
3. 升級 PHP 4 後 MySQL 出現 "Warning: MySQL: Unable to save result set in ..."
主因是 PHP 4 編譯選項 --with-mysql 未指定 MySQL 路徑,導致 PHP 使用內建 MySQL 函式庫。若系統運行 PHP 3 作為 Apache 模組或 auth-mysql,它們使用不同版本的 MySQL 客戶端驅動,造成衝突。
解決:重新編譯 PHP 4,加入 MySQL 路徑:--with-mysql=/your/path/to/mysql,通常即可解決。
4. 安裝共享 MySQL 支援後,載入 libphp4.so 導致 Apache 當機 (dumps core)
若 MySQL 使用 pthreads 連結會發生此情況。請用 ldd 檢查。若已使用,請取得 MySQL 原始碼重新編譯,或從原始碼 rpm 編譯,移除相關檔案中開啟 threaded client 程式碼的開關。若上述無效,則重新編譯支援新 MySQL 的 PHP 函式庫。
5. 為何總出現 "Warning: 0 is not a MySQL result index..." 或 "Warning: Supplied argument is not a valid MySQL result resource..."?
結果集變數值為 0,代表查詢失敗。在取得結果集前,必須檢查查詢失敗原因。正確寫法:
$result = mysql_query("SELECT * FROM tables_priv");
if (!$result) {
echo mysql_error();
exit;
}
或簡寫:
$result = mysql_query("SELECT * FROM tables_priv") or die("Bad query: ".mysql_error());