Điểm:0

PHP không thể xác định chức năng sqlsrv_connect() trong khi cố gắng kết nối SQL Server

lá cờ cn

Tôi đang cố gắng kết nối với Máy chủ MSSQL cục bộ của mình từ một tệp PHP đơn giản bằng cách sử dụng hàm sqlsrv_connect(), nhưng mỗi khi tôi gọi tệp trong trình duyệt thông qua máy chủ cục bộ, nó sẽ báo lỗi 500 (Lỗi Máy chủ Nội bộ): "Lỗi nghiêm trọng của PHP: Lỗi chưa được xử lý: Gọi hàm không xác định sqlsrv_connect() trong C:\inetpub\wwwroot\AJAX_Tutorial\get_db_data.php:4". get_db_data.php là tệp mà tôi đang cố gắng kết nối máy chủ. Có vẻ như PHP hoặc máy chủ cục bộ không thể xác định chức năng sqlsrv_connect(). Nhưng theo như tôi quan tâm, tôi đã làm tất cả những gì cần thiết để đảm bảo PHP kết nối Máy chủ SQL.

Môi trường của tôi: Windows 10 Pro, Phiên bản 21H2, 64-bit.

Những gì tôi đã làm xong:

  1. Đã bật IIS để đảm bảo CGI/Fast CGI đang hoạt động.
  2. Đã cài đặt phiên bản x64 không an toàn theo luồng PHP 8.1.1 tại C:\Program Files\PHP-8.1.1
  3. Trong C:\Program Files\PHP-8.1.1, đổi tên tệp phát triển php.ini thành php.ini
  4. Trong tệp php.ini, bỏ ghi chú extension_dir = "ext" chỉ thị.
  5. Đã tải xuống php_wincache.dll và thêm nó vào thư mục ext mặc định của PHP.
  6. Đã thêm dòng extension=php_wincache.dll vào phần Tiện ích mở rộng động của tệp php.ini.
  7. Đã cài đặt PHPManagerForIIS_V1.5.0 và định cấu hình IIS phù hợp để PHP có thể được lưu trữ thông qua IIS. Đồng thời bật tiện ích mở rộng php_wincache.dll tại đây.
  8. Đã cài đặt MSSQL Server 2019 Developer Edition cùng với Management Studio tương ứng.
  9. Đã tạo cơ sở dữ liệu và bảng tương ứng trong SQL Server mà tôi muốn kết nối từ PHP.
  10. Đảm bảo Microsoft ODBC Driver 17 dành cho SQL Server được cài đặt trong PC của tôi, điều này được yêu cầu bởi PHP.
  11. Đảm bảo Máy khách bản địa Microsoft SQL Server 2012 được cài đặt trong PC của tôi, yêu cầu của PHP.
  12. Đã tải xuống Trình điều khiển Microsoft cho PHP dành cho SQL Server 5.9 và trích xuất nội dung của nó. Sao chép tệp có tên php_sqlsrv_80_nts_x64.dll trong gói và dán tệp đó vào thư mục ext mặc định của PHP.
  13. Đã thêm dòng extension=php_sqlsrv_80_nts_x64.dll tại phần Tiện ích mở rộng động của tệp php.ini.
  14. Trong Trình quản lý IIS, thông qua trình quản lý PHP, đã bật tiện ích mở rộng php_sqlsrv_80_nts_x64.dll.
  15. Đã tạo tệp phpinfo.php trong thư mục gốc của IIS, tệp này đã chạy thành công nhưng không thấy đề cập đến wincache và sqlsrvin.

Sau các bước trên, tôi đã chạy tệp PHP thực tế để cố gắng kết nối Máy chủ SQL, nhưng nó báo lỗi cho biết nó không thể xác định hàm sqlsrv_connect(). Giả sử php_sqlsrv_80_nts_x64.dll không được tải trong khi PHP đang khởi động, tôi đã chạy php --ini trong dấu nhắc lệnh. Đó là khi các thông báo sau được đưa ra:

Cảnh báo PHP: Khởi động PHP: Không thể tải thư viện động 'php_wincache.dll' (đã thử: ext\php_wincache.dll (Không thể tìm thấy mô-đun được chỉ định), ext\php_php_wincache.dll.dll (Không thể tìm thấy mô-đun được chỉ định) ) trong Unknown trên dòng 0

Cảnh báo: Khởi động PHP: sqlsrv: Không thể khởi tạo mô-đun Mô-đun được biên dịch với API mô-đun=20200930 PHP được biên dịch với API mô-đun=20210902 Các tùy chọn này cần phù hợp trong Unknown trên dòng 0 Đường dẫn tệp cấu hình (php.ini): Tệp cấu hình đã tải: C:\Program Files\PHP-8.1.1\php.ini Quét các tệp .ini bổ sung trong: (không có) Các tệp .ini bổ sung đã phân tích cú pháp: (không có)

Tuy nhiên, PHP dường như đang chạy tốt, bởi vì khi tôi sử dụng phương thức jQuerey AJAX get() và post() từ một tệp HTML để tìm nạp dữ liệu từ một tệp PHP khác, tôi đã thực hiện thành công. Không có ngoại lệ đã được ném sau đó.

Vì vậy, bây giờ tôi đang thiếu điều gì khi cả php_wincache.dll và sqlsrv dường như không tải trong khi khởi động PHP, tôi cũng không thể kết nối Máy chủ SQL từ tệp PHP? Vì tôi là người mới sử dụng jQuery AJAX và PHP nên tôi không biết nhiều về sự phức tạp của chúng và do đó, tôi đã gặp khó khăn với vấn đề này trong bốn ngày qua. Tôi đã sử dụng mọi tài nguyên trong tay, nhưng không có gì hiệu quả. Hãy giúp tôi. Tôi không thể hoàn thành nhiệm vụ của mình vì điều này.

Cảm ơn và Trân trọng!

mã 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.
?>
lá cờ jp
Bạn có các phiên bản API khác nhau
lá cờ cn
Các phiên bản API khác nhau của cái gì? Đối với các tài liệu về Máy chủ PHP và MS-SQL, tôi đang sử dụng PHP 8.1.1 chứa php8.dll và Trình điều khiển Máy chủ SQL tương ứng, tức là SQLSRV59. Đây là liên kết dành cho PHP https://windows.php.net/download#php-8.1 và đây là liên kết dành cho Trình điều khiển máy chủ SQL được đề xuất cho PHP 8.0 https://docs.microsoft.com/en-us/sql/connect/ php/system-requirements-for-the-php-sql-driver?redirectedfrom=MSDN&view=sql-server-ver15. Sự khác biệt duy nhất là tôi đang sử dụng PHP 8.1.1.
lá cờ cn
Nhưng nếu bạn truy cập liên kết dành cho Trình điều khiển máy chủ SQL, trong phần "Trình điều khiển Microsoft 5.9 cho PHP cho SQL Server", hãy cuộn xuống phiên bản PHP 8.0. Ở đó, nó viết trình điều khiển dll có thể được sử dụng với 64-bit php8.dll, và đó chính xác là những gì PHP 8.1.1 của tôi sử dụng, tức là, php8.dll. Đó là lý do tại sao tôi đã tải xuống trình điều khiển này. Vì vậy, những gì bạn đề nghị tôi làm bây giờ? Xóa bản cài đặt PHP 8.1.1 hiện tại của tôi và quay lại PHP 8.0?
lá cờ cn
Ngoài ra, cảnh báo lỗi mà bạn đã trích dẫn ở trên cũng được hiển thị cho php_wincache.dll "bị thiếu" thực sự có trong thư mục ext của PHP. Vậy tại sao nó cũng báo lỗi "không thể tải thư viện động" cho php_wincache.dll? Bất cứ đề nghị, xin vui lòng?
lá cờ jp
Không thể tải mô-đun vì nó không khớp với phiên bản API
Điểm:2
lá cờ jp

Bạn có PHP Fatal error: Uncaught Error: Gọi hàm không xác định sqlsrv_connect() bởi vì sqlsrv mô-đun không được tải. Mô-đun không được tải vì nó là được biên dịch với mô-đun API=20200930 trong khi bạn PHP được biên dịch với API mô-đun=20210902 như thông báo lỗi của bạn nói rõ ràng. PHP hy vọng các mô-đun sẽ được biên dịch với cùng một phiên bản API như chính PHP. Bạn cần lấy PHP cùng phiên bản với mô-đun đã được biên dịch hoặc lấy một mô-đun được biên dịch cho phiên bản PHP của bạn.

lá cờ cn
Bạn đã đúng, phiên bản không phù hợp là vấn đề. Khi tôi đang sử dụng PHP-8.1, tôi đã tải xuống SQLSRV cho PHP-8.0. Do sự không khớp này, tệp trình điều khiển không tải trong khi khởi động PHP trong máy chủ. Việc hạ cấp xuống PHP-8.0 đã giải quyết được sự cố. Cảm ơn bạn đã chỉ ra mấu chốt của vấn đề.
Điểm:1
lá cờ in

tôi nghĩ https://github.com/microsoft/msphpsql/releases/download/v5.10.0-beta2/Windows-8.1.zip là những gì bạn cần.

hãy thử những thứ này trong php.ini của bạn

tiện ích mở rộng = php_pdo_sqlsrv_81_ts.dll
tiện ích mở rộng = php_sqlsrv_81_ts.dll
lá cờ cn
Phiên bản không phù hợp là vấn đề. Trong khi tôi đang sử dụng PHP-8.1, trình điều khiển SQLSRV dành cho PHP-8.0, do đó PHP không thể tải trình điều khiển trong khi khởi động. Cảm ơn bạn đã chia sẻ liên kết cho SQLSRV cho PHP-8.1. Không thể tìm thấy nó trong trang chính thức của Microsoft.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.