Puncte:0

PHP nu poate identifica funcția sqlsrv_connect() în timp ce încearcă să se conecteze la SQL Server

drapel cn

Încerc să mă conectez la serverul meu local MSSQL dintr-un fișier PHP simplu folosind funcția sqlsrv_connect(), dar de fiecare dată când apelez fișierul în browser prin localhost, emite un 500 (Eroare internă a serverului) care spune: „Eroare fatală PHP: eroare neprinsă: apel la funcția nedefinită sqlsrv_connect() în C:\inetpub\wwwroot\AJAX_Tutorial\get_db_data.php:4”. get_db_data.php este fișierul de la care încerc să conectez serverul. Se pare că PHP sau localhost nu pot identifica funcția sqlsrv_connect(). Dar în ceea ce mă privește, am făcut tot ce era necesar pentru a mă asigura că PHP conectează serverul SQL.

Mediul meu: Windows 10 Pro, versiunea 21H2, pe 64 de biți.

Ce am facut:

  1. IIS activat, asigurând funcționarea CGI/Fast CGI.
  2. S-a instalat versiunea PHP 8.1.1 non-thread safe x64 la C:\Program Files\PHP-8.1.1
  3. În C:\Program Files\PHP-8.1.1, a fost redenumit fișierul php.ini-development în php.ini
  4. În fișierul php.ini, a decomentat directiva extension_dir = „ext”.
  5. S-a descărcat php_wincache.dll și l-a adăugat la directorul ext implicit al PHP.
  6. S-a adăugat extensia de linie=php_wincache.dll la secțiunea Extensii dinamice a fișierului php.ini.
  7. S-a instalat PHPManagerForIIS_V1.5.0 și am configurat IIS în consecință, astfel încât PHP să poată fi găzduit prin IIS. De asemenea, ați activat aici extensia php_wincache.dll.
  8. S-a instalat MSSQL Server 2019 Developer Edition împreună cu Studioul de management respectiv.
  9. Am creat baza de date și tabelele respective în SQL Server la care vreau să mă conectez din PHP.
  10. M-am asigurat că Microsoft ODBC Driver 17 pentru SQL Server este instalat pe computerul meu, ceea ce este cerut de PHP.
  11. M-am asigurat că Microsoft SQL Server 2012 Native Client este instalat pe computerul meu, ceea ce este cerut de PHP.
  12. Am descărcat driverele Microsoft pentru PHP pentru SQL Server 5.9 și am extras conținutul acestuia. Am copiat fișierul numit php_sqlsrv_80_nts_x64.dll în pachet și l-am lipit în directorul ext implicit al PHP.
  13. S-a adăugat extensia de linie=php_sqlsrv_80_nts_x64.dll la secțiunea Extensii dinamice a fișierului php.ini.
  14. În Manager IIS, prin managerul PHP, a fost activată extensia php_sqlsrv_80_nts_x64.dll.
  15. Am creat un fișier phpinfo.php în rădăcina IIS, care a rulat cu succes, dar nu a găsit nicio mențiune despre wincache și sqlsrvin.

După pașii de mai sus, am rulat fișierul PHP real încercând să conectez serverul SQL, dar trimite o eroare care spune că nu poate identifica funcția sqlsrv_connect(). Presupunând că php_sqlsrv_80_nts_x64.dll nu este încărcat în timp ce PHP pornește, am rulat php --ini în promptul de comandă. Atunci sunt trimise următoarele mesaje:

Avertisment PHP: Pornirea PHP: Nu se poate încărca biblioteca dinamică „php_wincache.dll” (încercat: ext\php_wincache.dll (Modulul specificat nu a putut fi găsit), ext\php_php_wincache.dll.dll (Modulul specificat nu a putut fi găsit) ) în Necunoscut pe linia 0

Avertisment: Pornire PHP: sqlsrv: Imposibil de inițializat modulul Modul compilat cu modulul API=20200930 PHP compilat cu modulul API=20210902 Aceste opțiuni trebuie să se potrivească în Necunoscut pe linia 0 Calea fișierului de configurare (php.ini): Fișier de configurare încărcat: C:\Program Files\PHP-8.1.1\php.ini Scanați pentru fișiere .ini suplimentare în: (niciunul) Fișiere .ini suplimentare analizate: (niciunul)

Cu toate acestea, PHP pare să funcționeze bine, deoarece când am folosit metoda jQuerey AJAX get() și post() dintr-un fișier HTML pentru a prelua date dintr-un alt fișier PHP, am reușit să fac acest lucru. Nu s-a făcut nicio excepție atunci.

Deci, ce îmi lipsește acum că nici php_wincache.dll și sqlsrv nu par să se încarce în timpul pornirii PHP și nici nu pot conecta serverul SQL din fișierul PHP? Deoarece sunt nou în jQuery AJAX și PHP, nu sunt prea conștient de complexitatea lor și, prin urmare, am rămas blocat cu problema în ultimele patru zile. Am folosit toate resursele din mână, dar nimic nu funcționează. Te rog ajuta-ma. Nu pot să-mi fac sarcinile din cauza asta.

Multumesc si Salutari!

cod 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.
?>
drapel jp
Aveți diferite versiuni API
drapel cn
Diferite versiuni API de ce? În ceea ce privește documentațiile PHP și MS-SQL Server, folosesc PHP 8.1.1 care conține php8.dll și driverul SQL Server respectiv, adică SQLSRV59. Iată linkul pentru PHP https://windows.php.net/download#php-8.1 și aici este linkul pentru driverul SQL Server recomandat pentru 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. Singura diferență este că folosesc PHP 8.1.1.
drapel cn
Dar dacă vizitați linkul pentru SQL Server Driver, în secțiunea „Microsoft Drivers 5.9 for PHP for SQL Server”, derulați în jos până la PHP versiunea 8.0. Acolo, este scris că dll-ul driverului poate fi folosit cu php8.dll pe 64 de biți și exact asta folosește PHP 8.1.1 al meu, adică php8.dll. De aceea am descărcat acest driver. Deci ce îmi sugerați să fac acum? Ștergeți instalarea mea actuală de PHP 8.1.1 și revin la PHP 8.0?
drapel cn
Mai mult, avertismentul de eroare pe care l-ați citat mai sus este afișat și pentru „lipsă” php_wincache.dll care este de fapt prezent în directorul ext al PHP. Deci, de ce aruncă eroarea „nu se poate încărca biblioteca dinamică” și pentru php_wincache.dll? O sugestie, te rog?
drapel jp
Nu poate încărca modulul deoarece nu se potrivește cu versiunea API
Puncte:2
drapel jp

Tu ai Eroare fatală PHP: Eroare neprinsă: Apel la funcția nedefinită sqlsrv_connect() deoarece sqlsrv modulul nu a fost încărcat. Modulul nu a fost încărcat pentru că este compilat cu modulul API=20200930 în timp ce dvs PHP compilat cu modulul API=20210902 așa cum spune clar mesajul dvs. de eroare. PHP se așteaptă ca modulele să fie compilate cu aceeași versiune API ca și PHP-ul însuși. Trebuie fie să obțineți PHP aceeași versiune pentru care a fost compilat modulul, fie să obțineți un modul compilat pentru versiunea dvs. PHP.

drapel cn
Ai avut dreptate, nepotrivirea versiunilor a fost problema. În timp ce foloseam PHP-8.1, am descărcat SQLSRV pentru PHP-8.0. Din cauza acestei nepotriviri, fișierul driverului nu s-a încărcat în timpul pornirii PHP-ului pe server. Trecerea la PHP-8.0 a rezolvat problema. Vă mulțumesc că ați subliniat miezul problemei.
Puncte:1
drapel in

cred https://github.com/microsoft/msphpsql/releases/download/v5.10.0-beta2/Windows-8.1.zip este ceea ce ai nevoie.

încercați acestea în php.ini

extensie=php_pdo_sqlsrv_81_ts.dll
extensie=php_sqlsrv_81_ts.dll
drapel cn
Nepotrivirea versiunii a fost problema. În timp ce foloseam PHP-8.1, driverul SQLSRV era pentru PHP-8.0, din cauza căruia PHP nu a putut încărca driverul în timpul pornirii. Vă mulțumim pentru partajarea linkului pentru SQLSRV pentru PHP-8.1. Nu l-am găsit pe pagina oficială Microsoft.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.