Php

PHP 在嘗試連接 SQL Server 時無法辨識 sqlsrv_connect() 函式

  • January 5, 2022

我正在嘗試使用 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 位。

我做了什麼:

  1. 啟用 IIS 以確保 CGI/Fast CGI 正常工作。
  2. 在 C:\Program Files\PHP-8.1.1 安裝 PHP 8.1.1 非執行緒安全 x64 版本
  3. 在 C:\Program Files\PHP-8.1.1 中,將 php.ini-development 文件重命名為 php.ini
  4. 在 php.ini 文件中,取消註釋 extension_dir = “ext” 指令。
  5. 下載 php_wincache.dll 並將其添加到 PHP 的預設 ext 目錄中。
  6. 在 php.ini 文件的動態擴展部分添加了行 extension=php_wincache.dll。
  7. 安裝 PHPManagerForIIS_V1.5.0 並相應地配置 IIS,以便 PHP 可以通過 IIS 託管。還在這裡啟用了 php_wincache.dll 擴展。
  8. 安裝了 MSSQL Server 2019 Developer Edition 以及相應的 Management Studio。
  9. 在我想從 PHP 連接到的 SQL Server 中創建了相應的數據庫和表。
  10. 確保 Microsoft ODBC Driver 17 for SQL Server 已安裝在我的 PC 中,這是 PHP 所必需的。
  11. 確保 Microsoft SQL Server 2012 Native Client 安裝在我的 PC 中,這是 PHP 所必需的。
  12. 下載 Microsoft Drivers for PHP for SQL Server 5.9 並提取其內容。複製包中名為php_sqlsrv_80_nts_x64.dll的文件,粘貼到PHP預設的ext目錄下。
  13. 在 php.ini 文件的動態擴展部分添加了行 extension=php_sqlsrv_80_nts_x64.dll。
  14. 在 IIS 管理器中,通過 PHP 管理器,啟用 php_sqlsrv_80_nts_x64.dll 擴展。
  15. 在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=20200930PHP 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

引用自:https://serverfault.com/questions/1088947