21. august 2023 - 15:56Der 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.
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)
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?
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?
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?
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
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
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.
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>
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
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.
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å.
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$'. ) )
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?
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.
Synes godt om
Ny brugerNybegynder
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.