PHP 在嘗試連接 SQL Server 時無法辨識 sqlsrv_connect() 函式
我正在嘗試使用 sqlsrv_connect() 函式從一個簡單的 PHP 文件連接到我的本地 MSSQL Server,但是每次我通過 localhost 在瀏覽器中呼叫該文件時,它都會拋出 500(內部伺服器錯誤)說:“ PHP 致命錯誤:未擷取的錯誤:呼叫 C:\inetpub\wwwroot\AJAX_Tutorial\get_db_data.php:4" 中的未定義函式 sqlsrv_connect()。get_db_data.php 是我試圖連接伺服器的文件。似乎 PHP 或 localhost 無法辨識 sqlsrv_connect() 函式。但就我而言,我做了所有必要的工作來確保 PHP 連接 SQL Server。
我的環境:Windows 10 Pro,版本 21H2,64 位。
我做了什麼:
- 啟用 IIS 以確保 CGI/Fast CGI 正常工作。
- 在 C:\Program Files\PHP-8.1.1 安裝 PHP 8.1.1 非執行緒安全 x64 版本
- 在 C:\Program Files\PHP-8.1.1 中,將 php.ini-development 文件重命名為 php.ini
- 在 php.ini 文件中,取消註釋 extension_dir = “ext” 指令。
- 下載 php_wincache.dll 並將其添加到 PHP 的預設 ext 目錄中。
- 在 php.ini 文件的動態擴展部分添加了行 extension=php_wincache.dll。
- 安裝 PHPManagerForIIS_V1.5.0 並相應地配置 IIS,以便 PHP 可以通過 IIS 託管。還在這裡啟用了 php_wincache.dll 擴展。
- 安裝了 MSSQL Server 2019 Developer Edition 以及相應的 Management Studio。
- 在我想從 PHP 連接到的 SQL Server 中創建了相應的數據庫和表。
- 確保 Microsoft ODBC Driver 17 for SQL Server 已安裝在我的 PC 中,這是 PHP 所必需的。
- 確保 Microsoft SQL Server 2012 Native Client 安裝在我的 PC 中,這是 PHP 所必需的。
- 下載 Microsoft Drivers for PHP for SQL Server 5.9 並提取其內容。複製包中名為php_sqlsrv_80_nts_x64.dll的文件,粘貼到PHP預設的ext目錄下。
- 在 php.ini 文件的動態擴展部分添加了行 extension=php_sqlsrv_80_nts_x64.dll。
- 在 IIS 管理器中,通過 PHP 管理器,啟用 php_sqlsrv_80_nts_x64.dll 擴展。
- 在IIS的根目錄下創建了一個phpinfo.php文件,執行成功但是發現沒有提到wincache和sqlsrvin。
在上述步驟之後,我執行了實際的 PHP 文件來嘗試連接 SQL Server,但它拋出了一個錯誤,說它無法辨識 sqlsrv_connect() 函式。假設 PHP 啟動時未載入 php_sqlsrv_80_nts_x64.dll,我在命令提示符下執行 php –ini。那是拋出以下消息的時候:
PHP Warning: PHP Startup: Unable to load dynamic library ‘php_wincache.dll’ (試過: ext\php_wincache.dll (找不到指定的模組), ext\php_php_wincache.dll.dll (找不到指定的模組) ) 在第 0 行的未知中
警告:PHP 啟動:sqlsrv:無法初始化模組 使用模組 API=20200930 編譯的模組 使用模組 API=20210902 編譯的 PHP 這些選項需要在第 0 行配置文件 (php.ini) 上的未知中匹配 路徑:載入的配置文件:C: \Program Files\PHP-8.1.1\php.ini 在以下位置掃描其他 .ini 文件:(無)解析的其他 .ini 文件:(無)
但是,PHP 似乎執行良好,因為當我使用 HTML 文件中的 jQuerey AJAX get() 和 post() 方法從另一個 PHP 文件中獲取數據時,我成功地這樣做了。那時沒有拋出異常。
那麼我現在缺少什麼,因為在 PHP 啟動期間似乎既沒有 php_wincache.dll 和 sqlsrv 載入,也無法從 PHP 文件連接 SQL Server?由於我是 jQuery AJAX 和 PHP 的新手,我不太了解它們的複雜性,因此在過去的四天裡一直在糾結這個問題。我已經使用了我手中的所有資源,但沒有任何效果。請幫忙。因此,我無法完成我的任務。
謝謝並恭祝安康!
get_db_data.php 程式碼:
<?php $serverName = "(local)"; // Optionally use port number (1433 by default). $connectionString = array("Database"=>"TestDB"); // Connection string. $conn = sqlsrv_connect($serverName, $connectionString); // Connect using Windows Authentication. if($conn === false) { echo "Connection could not be established.<br/>"; die(print_r(sqlsrv_errors(), true)); } else { echo "Connection established successfuly.<br/>"; } sqlsrv_close($conn); // Close connection resources. ?>
你有
PHP Fatal error: Uncaught Error: Call to undefined function sqlsrv_connect()
因為sqlsrv
模組沒有載入。該模組未載入,因為compiled with module API=20200930
您PHP compiled with module API=20210902
的錯誤消息清楚地說明了它。PHP 期望使用與 PHP 本身相同的 API 版本來編譯模組。您需要獲得與編譯模組相同的版本的 PHP,或者獲得為您的 PHP 版本編譯的模組。
我認為https://github.com/microsoft/msphpsql/releases/download/v5.10.0-beta2/Windows-8.1.zip是您所需要的。
在你的 php.ini 中試試這些
extension=php_pdo_sqlsrv_81_ts.dll extension=php_sqlsrv_81_ts.dll