Score:0

PHP ไม่สามารถระบุฟังก์ชัน sqlsrv_connect() ในขณะที่พยายามเชื่อมต่อกับ SQL Server

ธง cn

ฉันกำลังพยายามเชื่อมต่อกับเซิร์ฟเวอร์ MSSQL ในเครื่องของฉันจากไฟล์ PHP อย่างง่ายโดยใช้ฟังก์ชัน sqlsrv_connect() แต่ทุกครั้งที่ฉันเรียกไฟล์ในเบราว์เซอร์ผ่าน localhost มันจะส่งข้อผิดพลาด 500 (Internal Server Error) ว่า: "ข้อผิดพลาดร้ายแรงของ PHP: ข้อผิดพลาดที่ไม่ได้ตรวจจับ: การเรียกไปยังฟังก์ชันที่ไม่ได้กำหนด sqlsrv_connect() ใน C:\inetpub\wwwroot\AJAX_Tutorial\get_db_data.php:4". get_db_data.php เป็นไฟล์ที่ฉันพยายามเชื่อมต่อเซิร์ฟเวอร์ ดูเหมือนว่า PHP หรือ localhost ไม่สามารถระบุฟังก์ชัน sqlsrv_connect() ได้ แต่เท่าที่ฉันกังวล ฉันทำทุกวิถีทางเพื่อให้แน่ใจว่า PHP เชื่อมต่อกับ SQL Server

สภาพแวดล้อมของฉัน: Windows 10 Pro เวอร์ชัน 21H2 64 บิต

สิ่งที่ฉันได้ทำ:

  1. IIS ที่เปิดใช้งานทำให้มั่นใจได้ว่า CGI/Fast CGI ทำงาน
  2. ติดตั้ง PHP 8.1.1 non-thread safe รุ่น x64 ที่ C:\Program Files\PHP-8.1.1
  3. ใน C:\Program Files\PHP-8.1.1 เปลี่ยนชื่อไฟล์พัฒนา php.ini เป็น php.ini
  4. ในไฟล์ php.ini ให้ยกเลิกการแสดงความคิดเห็นในคำสั่ง extension_dir = "ext"
  5. ดาวน์โหลด php_wincache.dll และเพิ่มไปยังไดเร็กทอรี ext เริ่มต้นของ PHP
  6. เพิ่มบรรทัด extension=php_wincache.dll ที่ส่วน Dynamic Extensions ของไฟล์ php.ini
  7. ติดตั้ง PHPManagerForIIS_V1.5.0 และกำหนดค่า IIS ตามนั้น เพื่อให้ PHP สามารถโฮสต์ผ่าน IIS เปิดใช้งานส่วนขยาย php_wincache.dll ที่นี่ด้วย
  8. ติดตั้ง MSSQL Server 2019 Developer Edition พร้อมกับ Management Studio ที่เกี่ยวข้อง
  9. สร้างฐานข้อมูลและตารางตามลำดับใน SQL Server ที่ฉันต้องการเชื่อมต่อจาก PHP
  10. ตรวจสอบให้แน่ใจว่ามีการติดตั้ง Microsoft ODBC Driver 17 สำหรับ SQL Server ในพีซีของฉัน ซึ่งจำเป็นโดย PHP
  11. ตรวจสอบให้แน่ใจว่ามีการติดตั้ง Microsoft SQL Server 2012 Native Client ในพีซีของฉัน ซึ่งจำเป็นโดย PHP
  12. ดาวน์โหลด Microsoft Drivers สำหรับ PHP สำหรับ SQL Server 5.9 และแยกเนื้อหาออก คัดลอกไฟล์ชื่อ php_sqlsrv_80_nts_x64.dll ในแพ็คเกจและวางลงในไดเร็กทอรี ext เริ่มต้นของ PHP
  13. เพิ่มบรรทัด extension=php_sqlsrv_80_nts_x64.dll ที่ส่วน Dynamic Extensions ของไฟล์ php.ini
  14. ในตัวจัดการ IIS ผ่านตัวจัดการ PHP เปิดใช้งานส่วนขยาย php_sqlsrv_80_nts_x64.dll
  15. สร้างไฟล์ phpinfo.php ในรูทของ IIS ซึ่งทำงานได้สำเร็จ แต่ไม่พบการกล่าวถึง wincache และ sqlsrvin

หลังจากขั้นตอนข้างต้น ฉันรันไฟล์ PHP จริงที่พยายามเชื่อมต่อกับ SQL Server แต่มันแสดงข้อผิดพลาดว่าไม่สามารถระบุฟังก์ชัน sqlsrv_connect() ได้ สมมติว่า php_sqlsrv_80_nts_x64.dll ไม่ถูกโหลดในขณะที่ PHP กำลังเริ่มทำงาน ฉันรัน php --ini ในพรอมต์คำสั่ง นั่นคือเมื่อข้อความต่อไปนี้ถูกส่งออกไป:

คำเตือน PHP: การเริ่มต้น PHP: ไม่สามารถโหลดไลบรารีไดนามิก 'php_wincache.dll' (ลองแล้ว: ext\php_wincache.dll (ไม่พบโมดูลที่ระบุ), ext\php_php_wincache.dll.dll (ไม่พบโมดูลที่ระบุ) ) ใน Unknown บนบรรทัด 0

คำเตือน: การเริ่มต้น PHP: sqlsrv: ไม่สามารถเริ่มต้นโมดูลได้ รวบรวมโมดูลด้วยโมดูล API=20200930 PHP คอมไพล์ด้วยโมดูล API=20210902 ตัวเลือกเหล่านี้ต้องตรงกัน ในไม่ทราบในบรรทัด 0 ไฟล์การกำหนดค่า (php.ini) เส้นทาง: ไฟล์การกำหนดค่าที่โหลด: C:\Program Files\PHP-8.1.1\php.ini สแกนหาไฟล์ .ini เพิ่มเติมใน: (ไม่มี) แยกวิเคราะห์ไฟล์ .ini เพิ่มเติม: (ไม่มี)

อย่างไรก็ตาม PHP ดูเหมือนจะทำงานได้ดี เพราะเมื่อฉันใช้เมธอด jQuerey AJAX get() และ post() จากไฟล์ HTML เพื่อดึงข้อมูลจากไฟล์ PHP อื่น ฉันก็ทำได้สำเร็จ ไม่มีข้อยกเว้นเกิดขึ้นแล้ว

ตอนนี้ฉันขาดอะไรไปซึ่งทั้ง php_wincache.dll และ sqlsrv ดูเหมือนจะไม่โหลดระหว่างการเริ่มต้น PHP และฉันไม่สามารถเชื่อมต่อ SQL Server จากไฟล์ PHP ได้ เนื่องจากฉันเพิ่งเริ่มใช้ jQuery AJAX และ PHP ฉันจึงไม่ค่อยรู้ถึงความซับซ้อนของ jQuery ดังนั้นฉันจึงติดอยู่กับปัญหาในช่วงสี่วันที่ผ่านมา ฉันใช้ทรัพยากรทุกอย่างในมือแล้ว แต่ไม่มีอะไรทำงาน กรุณาช่วย. ฉันไม่สามารถทำงานของฉันไปข้างหน้าได้เพราะเหตุนี้

ขอบคุณและขอแสดงความนับถือ!

รหัส 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.
?>
jp flag
คุณมีเวอร์ชัน API ที่แตกต่างกัน
cn flag
API เวอร์ชันต่างๆ ของอะไร เท่าที่เกี่ยวข้องกับเอกสาร PHP และ MS-SQL Server ฉันใช้ PHP 8.1.1 ซึ่งมี php8.dll และไดรเวอร์ SQL Server ที่เกี่ยวข้อง เช่น SQLSRV59 นี่คือลิงค์สำหรับ PHP https://windows.php.net/download#php-8.1 และนี่คือลิงค์สำหรับ SQL Server Driver ที่แนะนำสำหรับ PHP 8.0 https://docs.microsoft.com/en-us/sql/connect/ php/ข้อกำหนดของระบบ-สำหรับ-php-sql-driver?redirectedfrom=MSDN&view=sql-server-ver15. ข้อแตกต่างเพียงอย่างเดียวคือฉันใช้ PHP 8.1.1
cn flag
แต่ถ้าคุณไปที่ลิงก์สำหรับไดรเวอร์ SQL Server ในส่วน "ไดรเวอร์ Microsoft 5.9 สำหรับ PHP สำหรับ SQL Server" ให้เลื่อนลงไปที่ PHP เวอร์ชัน 8.0 ที่นั่นเขียนไว้ว่า driver dll สามารถใช้กับ php8.dll แบบ 64 บิตได้ และนั่นคือสิ่งที่ PHP 8.1.1 ของฉันใช้ นั่นคือ php8.dll นั่นเป็นเหตุผลที่ฉันดาวน์โหลดไดรเวอร์นี้ แล้วคุณแนะนำให้ฉันทำอะไรตอนนี้ ลบการติดตั้ง PHP 8.1.1 ปัจจุบันของฉันและกลับไปใช้ PHP 8.0 หรือไม่
cn flag
ยิ่งกว่านั้น คำเตือนข้อผิดพลาดที่คุณยกมาข้างต้นยังแสดงสำหรับ php_wincache.dll ที่ "ขาดหายไป" ซึ่งมีอยู่ในไดเร็กทอรี ext ของ PHP เหตุใดจึงมีข้อผิดพลาด "ไม่สามารถโหลดไลบรารีไดนามิก" สำหรับ php_wincache.dll ด้วย ข้อเสนอแนะใด ๆ โปรด?
jp flag
ไม่สามารถโหลดโมดูลได้เนื่องจากไม่ตรงกับเวอร์ชัน API
Score:2
ธง jp

คุณมี ข้อผิดพลาดร้ายแรงของ PHP: ข้อผิดพลาดที่ไม่ได้ตรวจจับ: การเรียกไปยังฟังก์ชันที่ไม่ได้กำหนด sqlsrv_connect() เพราะ sqlsrv ไม่ได้โหลดโมดูล ไม่ได้โหลดโมดูลเนื่องจากเป็น รวบรวมด้วยโมดูล API=20200930 ในขณะที่คุณ PHP คอมไพล์ด้วยโมดูล API=20210902 ตามที่ข้อความแสดงข้อผิดพลาดของคุณระบุไว้อย่างชัดเจน PHP คาดหวังให้โมดูลรวบรวมด้วยเวอร์ชัน API เดียวกันกับ PHP เอง คุณต้องรับ PHP เวอร์ชันเดียวกับที่คอมไพล์โมดูลหรือรับโมดูลที่คอมไพล์สำหรับเวอร์ชัน PHP ของคุณ

cn flag
คุณพูดถูก เวอร์ชันที่ไม่ตรงกันคือปัญหา ขณะที่ฉันใช้ PHP-8.1 ฉันดาวน์โหลด SQLSRV สำหรับ PHP-8.0 เนื่องจากสิ่งนี้ไม่ตรงกัน ไฟล์ไดรเวอร์จึงไม่ถูกโหลดระหว่างการเริ่มต้นของ PHP ในเซิร์ฟเวอร์ การดาวน์เกรดเป็น PHP-8.0 ช่วยแก้ปัญหาได้ ขอบคุณที่ชี้ให้เห็นถึงปมปัญหา
Score:1
ธง in

ฉันคิดว่า https://github.com/microsoft/msphpsql/releases/download/v5.10.0-beta2/Windows-8.1.zip คือสิ่งที่คุณต้องการ

ลองใช้สิ่งเหล่านี้ใน php.ini ของคุณ

ส่วนขยาย=php_pdo_sqlsrv_81_ts.dll
ส่วนขยาย=php_sqlsrv_81_ts.dll
cn flag
เวอร์ชันที่ไม่ตรงกันคือปัญหา ในขณะที่ฉันใช้ PHP-8.1 ไดรเวอร์ SQLSRV เป็น PHP-8.0 เนื่องจาก PHP ไม่สามารถโหลดไดรเวอร์ระหว่างการเริ่มต้น ขอบคุณที่แบ่งปันลิงก์สำหรับ SQLSRV สำหรับ PHP-8.1 ไม่พบในหน้าอย่างเป็นทางการของ Microsoft

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา