數(shù)據(jù)庫(kù)問題

本節(jié)包括 PHP 和數(shù)據(jù)庫(kù)之間關(guān)系的常見問題。 事實(shí)上, PHP 可以訪問如今現(xiàn)有的任何數(shù)據(jù)庫(kù)。

聽說 PHP 有可能訪問 Microsoft SQL Server,怎樣訪問?

在 Unix 機(jī)器中,你可以使用 PDO_ODBC 或者 Unified ODBC API 來訪問 Microsoft SQL Server 數(shù)據(jù)庫(kù)。

在 Windows 機(jī)器中,你可以使用 PDO_SQLSRVSQLSRV 來訪問 Microsoft SQL Server 數(shù)據(jù)庫(kù)。

同時(shí),也可以參考下一個(gè)問題。

能訪問 Microsoft Access 數(shù)據(jù)庫(kù)嗎?

可以。如果完全在 Windows 9x/Me/NT/2000 下運(yùn)行,那已經(jīng)有了所有所需的工具, 可以用 ODBC 和 Microsoft's ODBC drivers for Microsoft Access database。

如果在 Unix 下運(yùn)行 PHP 而想訪問 Windows 中的 MS Access, 那需要 Unix ODBC 驅(qū)動(dòng)程序。 ? OpenLink Software 有一個(gè)基于 Unix 的 ODBC 驅(qū)動(dòng)程序可以做這件事。

另外一個(gè)替代方案是用帶 Windows ODBC 驅(qū)動(dòng)的 SQL Server 并用它來儲(chǔ)存數(shù)據(jù), 可以通過 Microsoft Access(用 ODBC)和 PHP(用內(nèi)置驅(qū)動(dòng))來訪問, 或者用一個(gè) Access 和 PHP 都識(shí)別的中間文件格式, 例如 flat 文件或者 dBase 數(shù)據(jù)庫(kù)。 關(guān)于這一點(diǎn) OpenLink Software 的 Tim Hayes 寫道:

當(dāng)可以通過 ODBC 直接從 PHP 訪問數(shù)據(jù)庫(kù)時(shí)——例如用 OpenLink 的驅(qū)動(dòng)程序, 使用其它數(shù)據(jù)庫(kù)做中間媒介不是一個(gè)好主意。 如果確實(shí)需要一個(gè)中間文件格式, OpenLink 已經(jīng)發(fā)布了對(duì)應(yīng)于 Windows NT,Linux 和其它 Unix 平臺(tái)的 Virtuoso(一個(gè)虛擬數(shù)據(jù)庫(kù)引擎)。 請(qǐng)?jiān)L問我們的 ? 網(wǎng)站來免費(fèi)下載。

還有一個(gè)已被證實(shí)有效的選擇是在 Windows 下用 MySQL 和它的 MyODBC 驅(qū)動(dòng)來同步數(shù)據(jù)庫(kù)。 Steve Lawrence 寫道:

  • 根據(jù) MySQL 的說明在你的平臺(tái)上安裝 MySQL。可以從 ? http://www.mysql.com/得到最新版。 除了設(shè)定數(shù)據(jù)庫(kù)和配置用戶帳號(hào)以外不需要特殊的配置, 應(yīng)該在 host 字段中放一個(gè) % 或者要用來訪問 MySQL 的 Windows 機(jī)器名。 記下自己的服務(wù)器名, 用戶名和密碼。
  • 從 MySQL 網(wǎng)站下載 MyODBC for Windows 驅(qū)動(dòng)程序。 在你的 Windows 機(jī)器中安裝它。 可以用此程序中包括的工具來測(cè)試其操作。
  • 用控制面板中的 ODBC 管理器新建一個(gè)用戶或系統(tǒng) dsn, 設(shè)定 dsn 名稱, 輸入你在第一步中配置的 MySQL 數(shù)據(jù)庫(kù)的主機(jī)名,用戶名,密碼,端口等。
  • 完整安裝 Access, 這樣可以確保得到適當(dāng)?shù)牟寮?.. 至少需要安裝 ODBC 支持和連接表管理器。
  • 新建一個(gè) Access 數(shù)據(jù)庫(kù)。 在 Table 窗口點(diǎn)擊右鍵并選擇 Link Tables, 或者在 File 菜單下選擇 Get External Data -> Link Tables。 當(dāng)文件瀏覽窗口打開后,選擇文件類型為:ODBC。 接著選擇 System dsn 以及在第三步建立的 dsn 的名字。 再選擇要連接的表,點(diǎn)擊 OK。 現(xiàn)在你可以在你的 MySQL 服務(wù)器中打開表并新建/刪除/編輯數(shù)據(jù)了! 也可以構(gòu)造查詢,導(dǎo)入/導(dǎo)出表到 MySQL,構(gòu)造表單和報(bào)告等。

提示與技巧:

  • 可以在 Access 中構(gòu)造表并導(dǎo)出到 MySQL 中, 再把它們連接回來。 這樣可以使表的建立更快。
  • 在 Access 中建立表時(shí), 必需定義一個(gè)基本鍵名來取得表的寫權(quán)限。 確認(rèn)在把表連接到 Access 之前在 MySQL 中建立了基本鍵名。
  • 如果在 MySQL 中修改了表, 必須重新連接到 Access。 打開 Tools>Add-ins>Linked table manager, 找到你的 ODBC DSN,然后在這里選擇要重新連接的表。 也可以在這里移動(dòng) dsn 源, 在點(diǎn)擊 OK 之前選中 “always prompt for new location”。

為什么我已經(jīng)使用了十多年的 MySQL 擴(kuò)展(ext/mysql) 不建議繼續(xù)使用了? 它被廢棄了嗎?我應(yīng)該選擇什么替代方案?如何遷移到新的方案?

選擇一種 MySQL API 一節(jié)中 描述了 3 中 MySQL 擴(kuò)展。 不應(yīng)該繼續(xù)使用舊的 API 了,可能將來的某一天舊 API 就會(huì)被廢棄甚至從 PHP 中移除。 當(dāng)然,舊的 API 曾經(jīng)是非常主流的,很多用戶都用了它,所以這個(gè)被廢棄及移除的過程不會(huì)太快。 但是仍然強(qiáng)烈建議使用 mysqliPDO_MySQL 來訪問 MySQL 數(shù)據(jù)庫(kù)。

自動(dòng)遷移腳本目前還沒有。 mysqli API 包括了面向過程和面向?qū)ο蟮膬煞N風(fēng)格的調(diào)用方式,并且面向過程的版本中提供的 API 和 ext/mysql 是非常相似的。

不可以同時(shí)混合使用這幾種 MySQL API。 例如,你不可以把一個(gè) mysqli 的連接資源傳入到 PDO_MySQL 或者 ext/mysql 中去使用。

為什么我得到類似如下的錯(cuò)誤: “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>”?

你試圖用一個(gè)值為 0 的結(jié)果資源號(hào)。 0 表示你的查詢由于某原因失敗了, 需要在提交查詢之后 和在使用返回結(jié)果資源號(hào)之前檢查錯(cuò)誤。 正確的方法是用類似如下的代碼:

<?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());
?>