Avatar billede dane022 Seniormester
21. august 2023 - 15:56 Der er 30 kommentarer og
1 løsning

PHP server kan ikke connecte til sql server

Hej

IT-afdelingen på min arbejdsplads har oprettet en PHP server til mig, hvortil jeg har uploadet de php sider jeg har oprettet i den sidste stykke tid via XAMPP på egen maskine. Siderne fungerer fint hos mig selv, men når de tilgås fra serveren, returneres "500 internal server".
Lige så snart der er en connection til sql server (som nedenstående), så fejler det. Fjerner man alt kode der har med sql at gøre, så fejler det ikke mere.

Der er lagt 2 dll 8.2 sqlsrv filer i php\ext mappen og i php.ini er der refereret til dem. Før dette blev gjort, blev der returneret en uncaught error. I PHPinfo fremgår der "Loaded Configuration File: C:\PHP\php.ini"

Jeg har ikke selv adgang til selve serveren, men kan kun lægge dokumenter på så jeg kan ikke dobbelttjekke andet end det jeg kan trække ud fra phpinfo.

$serverName = 'Sql2019srv1';
        $connectionOptions = array(
            "Database" => 'Lonforhandlinger',
            "UID" => '',
            "PWD" => '',
            "CharacterSet" => "UTF-8"
        );
        $conn = sqlsrv_connect($serverName, $connectionOptions);

Har I nogle løsningsforslag?
Avatar billede arne_v Ekspert
21. august 2023 - 16:11 #1
Er det de rigtige DLL til den server?

De skal matche:
* 32 bit vs 64 bit
* PHP version
* ts vs nts
Avatar billede dane022 Seniormester
21. august 2023 - 16:17 #2
Det er "php_sqlsrv_82_ts.dll" og "php_pdo_sqlsrv_82_ts.dll". Serveren har version 8.2.9 og x64 arkitektur. Håber jeg besvarer det du spørger om (er ikke ekspert)
Avatar billede arne_v Ekspert
21. august 2023 - 16:25 #3
"php_sqlsrv_82_ts.dll" burde hedde enten "php_sqlsrv_82_ts_x86.dll" for 32 bit eller "php_sqlsrv_82_ts_x64.dll" for 64 bit.

Er det de samme DLL som er brugt på din udviklings PC?

Og hvis ja - er den 32 eller 64 bit?

Vigtigt: det er ligegyldigt om Windows er 64 bit - det afgørende er om Apache og PHP er 64 bit.
Avatar billede dane022 Seniormester
21. august 2023 - 17:34 #4
Ja, det er samme DLL'er som er brugt på egen klientmaskine. Synes ikke jeg kan se om Apache og PHP er 32 eller 64 bit.

Har hentet DLL filer og det ser ud til der er 4 til sqlsrv (ligner ikke der er noget med 32): "php_sqlsrv_82_nts_x64.dll", "php_sqlsrv_82_nts_x86.dll", "php_sqlsrv_82_ts_x64.dll" og "php_sqlsrv_82_ts_x86.dll". Går ud fra jeg skal holde mig til ts?

Synes det er svært at vide om jeg skal bruge 64 eller 86 når de DLL filer jeg har brugt, ikke indeholder noget med bit. Giver det mening i morgen at afprøve hhv. først 64 bit og evt. derefter 86 med it-afdelingen?
Avatar billede arne_v Ekspert
21. august 2023 - 17:46 #5
Du kan prøve at spørge IT afdelingen om Apache og PHP er 32 bit (x86) eller 64 bit (x64).

Og så prøve med de rigtige DLL.

ts bør være fint nok.
Avatar billede dane022 Seniormester
22. august 2023 - 09:29 #6
64-bit er nu afprøvet uden succes. Jeg har nu fået at vide, at PHP serveren ikke kører Apache, men IIS. Kan det have en betydning?

Både IIS og PHP skulle iflg. IT-afdelingen være 64-bit.
Avatar billede dane022 Seniormester
22. august 2023 - 09:58 #7
Og lige en opfølgning. Når jeg kigger på phpinfo'en, så kan jeg se en sektion med Mysql men ikke en sektion omhandlende sql server. Kan det betyde noget?
Avatar billede arne_v Ekspert
22. august 2023 - 15:07 #8
Det skal naturligvis også virke med IIS. Det er bare lidt mere usædvaneligt.

Du har nu forsøgt med SQLServer PHP driver 5.11 og del er en SQLServer 2019?

Per https://learn.microsoft.com/en-us/sql/connect/php/microsoft-php-drivers-for-sql-server-support-matrix?view=sql-server-ver16#sql-server-version-certified-compatibility så burde det virke.

Men der er et andet krav: SQLServer ODBC driver 13.1 eller nyere per https://learn.microsoft.com/en-us/sql/connect/php/system-requirements-for-the-php-sql-driver?view=sql-server-ver16#odbc-driver - er den der?
Avatar billede dane022 Seniormester
22. august 2023 - 15:48 #9
Der er hentet drivers til PHP version 5.11, hvor filerne "php_sqlsrv_82_ts_x64.dll" og "php_pdo_sqlsrv_82_ts_x64.dll" er lagt i mappen php\ext og skrevet ind i php.ini filen. Sql serveren er 2019. PHP er version 8.2.9.

ODBC er version 10, så måske der er noget der. Det får jeg IT til at opdatere

Når man klikker ind på ODBC linket, står der at de 2 DLL filer skal bruges sammen med 64-bit php8ts.dll. Den fil siger mig ikke noget. Ved du om det er noget der mangler?
Avatar billede arne_v Ekspert
22. august 2023 - 16:08 #10
Vi kan håbe at den opdatering løser problemet.

Det gode ved link til MS sider er at IT afdelingen normalt er rimleigt villigt til at følge anbefalingen.

php8ts.dll kommer med PHP, så den skulle gerne være der. Al funkctionalitet i PHP som ikke loades via en extension er i den fil!!
Avatar billede dane022 Seniormester
22. august 2023 - 17:20 #11
Kan en forkert version af ODBC virkelig give en error 500?
Avatar billede arne_v Ekspert
22. august 2023 - 17:47 #12
Godt spørgsmål.

Men der er et problem og MS dokumentation siger at 5.11 kræver 13.1 eller nyere.

Hvad gør man så? Man opdaterer til 13.1 eller nyere og krydser fingre for at det løser problemet.

Min vurdering er at det er 50%-50% om det løser problemet,
Avatar billede arne_v Ekspert
22. august 2023 - 17:48 #13
Hvis det ikke løser problemet så vil jeg mene at næste skridt bør være:
- lav et lille PHP script som connecter og disconnecter til databasen
- kør dette PHP script i et CMD vindue og se om der kommer en fejl-besked
Avatar billede dane022 Seniormester
22. august 2023 - 18:09 #14
Kan lige supplere med ved ODBC installationen, at der blev lavet en connection test til databasen som var en succes. Ikke fordi det ændrer på det du skriver, men måske det kan indsnævre problematikken
Avatar billede dane022 Seniormester
22. august 2023 - 19:52 #15
Har prøvet kommandoprompt testen. Det ser ud til at jeg godt kan connecte. Prøvede for testens skyld at skrive en forkert database og så fik jeg fejl. Ingen fejl ved den rigtige database.

Til gengæld kan jeg ikke hive noget data ud. Når jeg skriver en query, f.eks. SELECT * FROM Kategorier;, kommer der ingenting frem og cmd hopper bare en linje ned.
Samme med disconnect, der sker heller ikke noget. Selv hvis jeg skriver en query med forkert tabel navn, så kommer der ingen fejl.
Avatar billede arne_v Ekspert
22. august 2023 - 20:06 #16
Ingen fejl besked?

Ingen fejl kode?
Avatar billede arne_v Ekspert
22. august 2023 - 20:07 #17
Eksempel #1 i https://www.php.net/manual/en/function.sqlsrv-fetch.php viser hvordan men henter data og tester på fejl.
Avatar billede dane022 Seniormester
22. august 2023 - 20:34 #18
Her er print fra kommandoprompten. Først prøver jeg at connecte til forkert database (Lonforhandlinger2 giver fejl), derefter til den rigtige database (Lonforhandlinger, ingen fejl)

Så prøver jeg at udtrække alt fra en forkert tabel (kategorier2, ingen fejl selvom tabellen ikke eksisterer). Så vil jeg udtrække fra en rigtig tabel (Kategorier, ingen fejl)

N:\>sqlcmd -S Sql2019srv1 -d Lonforhandlinger2 -E
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Login failed for user 'HVIDOVRE.DK\brx'..
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Cannot open database "Lonforhandlinger2" requested by the login. The login failed..

N:\>sqlcmd -S Sql2019srv1 -d Lonforhandlinger -E
1> Select * from kategorier;
2> select * from kategorier2;
3>
Avatar billede arne_v Ekspert
22. august 2023 - 20:45 #19
Ah. Ikke fra et PHP script med fra SQL prompt.

Det var nok bedre at teste med et lille PHP script, da PHP og sqlcmd muligvis tilgår databasen forskelligt.

Med hensyn til hvorfor der ikke kommer noget ud saa prøv og erstat:

Select * from kategorier;
Select * from kategorier2;

med:

Select * from kategorier
Go
Select * from kategorier2
Go
Avatar billede dane022 Seniormester
22. august 2023 - 21:11 #20
Med php script, mener du så kode i en php fil?
Jeg har denne kode i en testfil hvor det eneste kode er logindelen. Og det er nok til at give error 500. Hvis du mener noget helt andet med php script, er jeg nødt til at få det udspecificeret

        $serverName = 'Sql2019srv1';
        $connectionOptions = array(
            "Database" => $databaseName,
            "Authentication" => SQLSRV_AUTH_WINDOWS, // Use Windows Authentication
            "CharacterSet" => "UTF-8"
        );
        $conn = sqlsrv_connect($serverName, $connectionOptions);
Avatar billede arne_v Ekspert
22. august 2023 - 22:20 #21
Jeg mener at du skal uploade den fil til serveren og køre den fra CMD prompten.

Hvis du uploader den som test.php til C:\Dane og PHP ligger i C:\PHP-8.2 så hører du med:

C:\Dane> C:\PHP-8.2\php.exe test.php
Avatar billede arne_v Ekspert
22. august 2023 - 22:21 #22
Fejl 500 er fra IIS og betyder bare "noget gik galt".

Ovenstående bør give en mere brugbar fejl.
Avatar billede dane022 Seniormester
22. august 2023 - 22:52 #23
Her kommandoen og fejlen
C:\>C:\temp> C:\PHP\php.exe test4.php
Access is denied.

Jeg har fået adgang til IIS serveren og prøvede at køre siden fra dens browser. Her får jeg ikke 500 error, men den tidligere: PHP Fatal error:  Uncaught Error: Call to undefined function sqlsrv_connect() in C:\inetpub\wwwroot\lonforhandlinger\Index.php:59
Stack trace:
#0 {main}
  thrown in C:\inetpub\wwwroot\lonforhandlinger\Index.php on line 59

Hvor linje 59 er: $conn = sqlsrv_connect($serverName, $connectionOptions);

Har tjekket rigtig mange gange nu at der er overensstemmelse mellem DLL filerne og det der står i php.ini. Og det er både afprøvet med x64 og x86. Ved godt at ODBC mgl. opdatering, men her bruger jeg jo slet ikke ODBC til at connecte med.
Avatar billede arne_v Ekspert
22. august 2023 - 23:00 #24
"Access is denied" kunne vel fixes. Men nok ikke nødvendigt.

"Uncaught Error: Call to undefined function sqlsrv_connect()" betyder "sqlsrv extension er ikke loadet"
Avatar billede dane022 Seniormester
23. august 2023 - 15:32 #25
Dagens føljeton. ODBC skulle nu være opdateret til version 18. Jeg spottede derudover ved en tilfældighed at Thread security i php var disabled og det sikkert passede dårligt med at der blev brugt TS DLL. Så jeg skiftede DLL til NTS og det gør nu at selve siden loader, men login bliver afvist fordi jeg ikke genkendes som bruger xxx, men som selve webserveren. Det arbejder IT på.

Men man må sige at vi kommer nærmere
Avatar billede arne_v Ekspert
23. august 2023 - 15:47 #26
Fremskridt. Jubii.

Med hensyn til login så er der to måde er logge ind på en SQLServer:

Windows authentication

den checker om det brugernavn du er logget ind på Windows med har adgang

og for PHP under IIS er det sikkert et eller andet IIS brugernavn

der skal ikke angives:

"UID" => '',
"PWD" => '',

hvis man vil bruge det.

SQLServer authentication

den checker om det angivne brugernavn og password har adgang

det skal aktivt enables i SQLServer

nogle meget MS centrerede steder ved ikke engang at den mulighed eksisterer

andre steder er det helts tandard fordi SQLServer skal tilgaaes fra diverse Linux og andet servere

så skal der angives:

"UID" => 'noget',
"PWD" => 'noget',
Avatar billede dane022 Seniormester
23. august 2023 - 17:06 #27
Det bliver windows authentication hvor adgang til sql gives via brugerrolle i AD. Pt. får jeg denne fejl og det tænker jeg ikke jeg kan gøre noget ved (opgave for IT): [message] => [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Login failed for user 'HVIDOVRE.DK\WEBSRV01$'. ) )

Connection kode: $connectionOptions = array(
            "Database" => 'Lonforhandlinger',
            "CharacterSet" => "UTF-8",
            "TrustServerCertificate" => true
        );
Avatar billede arne_v Ekspert
23. august 2023 - 17:18 #28
Ja. De skal have givet det Windows brugernavn (som ligner det IIS kører under) adgang i SQLServer.
Avatar billede dane022 Seniormester
23. august 2023 - 17:28 #29
I dette tilfælde bliver det en løsning tilrettet det decentrale område, dvs. mange brugere (med forskellige AD grupper) som skal tilgå databasen men som via row level security kun skal se egne data. Vil det sige at alle disse brugere/AD-grupper skal tildeles adgang i IIS?
Avatar billede arne_v Ekspert
23. august 2023 - 17:58 #30
Normalt er at:
* web applikation checker brugerens adgang til data
* database checker kun web serverens adgang til data

I dit tilfælde skal databasen give WEBSRV01 adgang og det dækker alle brugere.

Så er det vistnok en mulighed for at bruge impersonation, hvor web server tilgår databasen som den bruger der tilgår web applikationen.

Jeg har aldrig prøvet det og ved ikke hvordan det foregår.

Og det lyder også uhensigtsmæssigt i dette tilfælde.
Avatar billede dane022 Seniormester
29. august 2023 - 19:18 #31
Der er kommet hul igennem nu. Der blev oprettet en servicebruger, som der bliver logget på som i php koden. Næste issue, er at den rigtige bruger hver gang bliver identificeret som webserver brugeren og det duer ikke hvis man skal kunne se hvem der har gjort hvad og opsætte sikkerhed, så det kræver en loginløsning via LDAP.
Det opretter jeg et nyt spørgsmål på.

Men i hvert fald tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester