數據庫問題
本節包括 PHP 和數據庫之間關係的常見問題。 事實上, PHP 可以訪問如今現有的任何數據庫。
- 聽說 PHP 有可能訪問 Microsoft SQL Server,怎樣訪問?
- 能訪問 Microsoft Access 數據庫嗎?
- 為什麼我已經使用了十多年的 MySQL 擴充套件(ext/mysql) 不建議繼續使用了? 它被廢棄了嗎?我應該選擇什麼替代方案?如何遷移到新的方案?
- 為什麼我得到類似如下的錯誤: “Warning: 0 is not a MySQL result index in <file> on line <x>” 或者 “Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>”?
- 聽說 PHP 有可能訪問 Microsoft SQL Server,怎樣訪問?
-
在 Unix 機器中,你可以使用 PDO_ODBC 或者 Unified ODBC API 來訪問 Microsoft SQL Server 數據庫。
在 Windows 機器中,你可以使用 PDO_SQLSRV 或 SQLSRV 來訪問 Microsoft SQL Server 數據庫。
同時,也可以參考下一個問題。
- 能訪問 Microsoft Access 數據庫嗎?
-
可以。如果完全在 Windows 9x/Me/NT/2000 下執行,那已經有了所有所需的工具, 可以用 ODBC 和 Microsoft's ODBC drivers for Microsoft Access database。
如果在 Unix 下執行 PHP 而想訪問 Windows 中的 MS Access, 那需要 Unix ODBC 驅動程式。 » OpenLink Software 有一個基於 Unix 的 ODBC 驅動程式可以做這件事。
另外一個替代方案是用帶 Windows ODBC 驅動的 SQL Server 並用它來儲存數據, 可以通過 Microsoft Access(用 ODBC)和 PHP(用內建驅動)來訪問, 或者用一個 Access 和 PHP 都識別的中間檔案格式, 例如 flat 檔案或者 dBase 數據庫。 關於這一點 OpenLink Software 的 Tim Hayes 寫道:
當可以通過 ODBC 直接從 PHP 訪問數據庫時——例如用 OpenLink 的驅動程式, 使用其它數據庫做中間媒介不是一個好主意。 如果確實需要一個中間檔案格式, OpenLink 已經發布了對應于 Windows NT,Linux 和其它 Unix 平臺的 Virtuoso(一個虛擬數據庫引擎)。 請訪問我們的 » 網站來免費下載。
還有一個已被證實有效的選擇是在 Windows 下用 MySQL 和它的 MyODBC 驅動來同步數據庫。 Steve Lawrence 寫道:
- 根據 MySQL 的說明在你的平臺上安裝 MySQL。可以從 » http://www.mysql.com/得到最新版。 除了設定數據庫和配置使用者帳號以外不需要特殊的配置, 應該在 host 欄位中放一個 % 或者要用來訪問 MySQL 的 Windows 機器名。 記下自己的伺服器名, 使用者名稱和密碼。
- 從 MySQL 網站下載 MyODBC for Windows 驅動程式。 在你的 Windows 機器中安裝它。 可以用此程式中包括的工具來測試其操作。
- 用控制面板中的 ODBC 管理器新建一個使用者或系統 dsn, 設定 dsn 名稱, 輸入你在第一步中配置的 MySQL 數據庫的主機名,使用者名稱,密碼,埠等。
- 完整安裝 Access, 這樣可以確保得到適當的外掛... 至少需要安裝 ODBC 支援和連線表管理器。
- 新建一個 Access 數據庫。 在 Table 視窗點選右鍵並選擇 Link Tables, 或者在 File 菜單下選擇 Get External Data -> Link Tables。 當檔案瀏覽視窗打開后,選擇檔案型別為:ODBC。 接著選擇 System dsn 以及在第三步建立的 dsn 的名字。 再選擇要連線的表,點選 OK。 現在你可以在你的 MySQL 伺服器中打開表並新建/刪除/編輯數據了! 也可以構造查詢,匯入/導出表到 MySQL,構造表單和報告等。
提示與技巧:
- 可以在 Access 中構造表並導出到 MySQL 中, 再把它們連線回來。 這樣可以使表的建立更快。
- 在 Access 中建立表時, 必需定義一個基本鍵名來取得表的寫許可權。 確認在把表連線到 Access 之前在 MySQL 中建立了基本鍵名。
- 如果在 MySQL 中修改了表, 必須重新連線到 Access。 打開 Tools>Add-ins>Linked table manager, 找到你的 ODBC DSN,然後在這裡選擇要重新連線的表。 也可以在這裡移動 dsn 源, 在點選 OK 之前選中 「always prompt for new location」。
- 為什麼我已經使用了十多年的 MySQL 擴充套件(ext/mysql) 不建議繼續使用了? 它被廢棄了嗎?我應該選擇什麼替代方案?如何遷移到新的方案?
-
在 選擇一種 MySQL API 一節中 描述了 3 中 MySQL 擴充套件。 不應該繼續使用舊的 API 了,可能將來的某一天舊 API 就會被廢棄甚至從 PHP 中移除。 當然,舊的 API 曾經是非常主流的,很多使用者都用了它,所以這個被廢棄及移除的過程不會太快。 但是仍然強烈建議使用 mysqli 或 PDO_MySQL 來訪問 MySQL 數據庫。
自動遷移指令碼目前還沒有。 mysqli API 包括了程序導向和麵向對象的兩種風格的呼叫方式,並且程序導向的版本中提供的 API 和 ext/mysql 是非常相似的。
不可以同時混合使用這幾種 MySQL API。 例如,你不可以把一個 mysqli 的連線資源傳入到 PDO_MySQL 或者 ext/mysql 中去使用。
- 為什麼我得到類似如下的錯誤: 「Warning: 0 is not a MySQL result index in <file> on line <x>」 或者 「Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>」?
-
你試圖用一個值為 0 的結果資源號。 0 表示你的查詢由於某原因失敗了, 需要在提交查詢之後 和在使用返回結果資源號之前檢查錯誤。 正確的方法是用類似如下的程式碼:
<?php
$result = mysql_query("SELECT * FROM tables_priv");
if (!$result) {
echo mysql_error();
exit;
}
?><?php
$result = mysql_query("SELECT * FROM tables_priv")
or die("Bad query: " . mysql_error());
?>