[PHP] Kan niet verbinden met Microsoft SQL Server

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • D3F
  • Registratie: Mei 2016
  • Laatst online: 07-10 14:50
Mijn vraag
Momenteel ben ik bezig om een simpele applicatie te maken, maar wanneer ik connectie wil maken naar de Microsoft SQL-server, loopt het script vast. Alles draait op PHP. Zie onderaan de code, het script lijkt vast te lopen nadat de dikgedrukte $conn uitgevoerd wordt. Bijvoorbeeld, als ik een simpele echo erachter zet, laat het script de echo niet zien.

De parameters hebben we al diverse keren bekeken, gewijzigd, gecontroleerd.

Relevante software en hardware die ik gebruik
Windows 2012, Microsoft SQL Server.
De applicatie is aanvankelijk geschreven die verbindt naar een MySQL-database, maar mijn werk heeft liever Microsoft SQL omdat daar al een server van in gebruik is.

Wat ik al gevonden of geprobeerd heb
Diverse methodes geprobeerd, diverse websites geraadpleegt (inclusief PHP).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$servername = "<server>"; 
$username = "<username>";
$password = "<password>";
$database = "<databasenaam>";

echo "test";

// Create connection
$connectionInfo = array( "Database"=>"<databasenaam>", "UID"=>"<username>", "PWD"=>"<password>");
$conn = sqlsrv_connect( $servername, $connectionInfo); <--- hier loopt het script vast, zo lijkt het

echo "test2"; <--- deze wordt namelijk niet weergegeven.


if( $conn ) {
     echo "Connection established.<br />";
}
else{
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));
}
echo "Connected successfully";

<rest  van de code>


Alvast bedankt voor de hulp!

[ Voor 3% gewijzigd door D3F op 03-11-2017 17:05 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:56
Heeft de user die je specifieert in de connectionstring toegang tot die databank ?

Wat stuur je mee als Database parameter ? Zoals ik jouw code zie, vermoed ik dat je daar een tabelnaam meegeeft ipv een databank-naam ?

Kan je de exception niet opvangen en zien wat de foutmelding is ?

[ Voor 32% gewijzigd door whoami op 03-11-2017 16:50 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • hellum
  • Registratie: Oktober 2007
  • Laatst online: 07-10 10:47
Welk os draait het op? Heeft PHP wel de drivers voor MS SQL? Zitten niet standaard in PHP. Check dat eens mbv phpinfo()

Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Regel 10:

$connectionInfo = array( "Database"=>"<tabel>", "UID"=>"<username>", "PWD"=>"password>");

Die pseudo-code kan niet werken; en waar <tabel> staat moet het uiteraard <database> zijn en ook je PWD waarde klopt niet. Dubbelcheck of je echte connectionInfo wel klopt.

Een andere mogelijke oorzaak is $servername; misschien gebruik je SQL Server Express; dan is het: "serverName\sqlexpress" (serverName\instanceName) ipv alleen "serverName"...

Ten derde; is die SQL Server wel geconfigureerd met expliciete SQL users, of werkt ie alleen met Trusted Connections ? Want dan is het een config-issue aan de serverkant of dien je de ConnectionInfo aan te passen.

En je moet sowieso een PHP foutmelding krijgen (kan in theorie 30s duren bij een connection-failure, maar toch); zet die ff aan :)

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:56
SKiLLa schreef op vrijdag 3 november 2017 @ 16:59:

Een andere mogelijke oorzaak is $servername; misschien gebruik je SQL Server Express; dan is het: "serverName\sqlexpress" (serverName\instanceName) ipv alleen "serverName"...
Dat heeft niets persé met Sql Express te maken.
Je kan een gewone SQL Server instance ook een instancenaam geven.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • D3F
  • Registratie: Mei 2016
  • Laatst online: 07-10 14:50
Heeft de user die je specifieert in de connectionstring toegang tot die databank ?

Wat stuur je mee als Database parameter ? Zoals ik jouw code zie, vermoed ik dat je daar een tabelnaam meegeeft ipv een databank-naam ?

Kan je de exception niet opvangen en zien wat de foutmelding is ?
Bedankt voor je bericht, ik heb een typfoutje gemaakt in mijn voorbeeld. Er staat <tabelnaam>, maar is inderdaad de database die ik mee geef. Ik pas het gelijk aan. De user heeft wel toegang tot de database, dat is zeker.
hellum schreef op vrijdag 3 november 2017 @ 16:57:
Welk os draait het op? Heeft PHP wel de drivers voor MS SQL? Zitten niet standaard in PHP. Check dat eens mbv phpinfo()
Bedankt voor je bericht. Het OS is Windows Server 2012 R2 Datacenter, wel handig om te vermelden inderdaad. Als het goed is heb ik die wel geïnstalleerd, ga ik maandag even achteraan mailen, wil niet teveel op de server gaan wijzigen!

Acties:
  • 0 Henk 'm!

  • D3F
  • Registratie: Mei 2016
  • Laatst online: 07-10 14:50
SKiLLa schreef op vrijdag 3 november 2017 @ 16:59:
Regel 10:

$connectionInfo = array( "Database"=>"<tabel>", "UID"=>"<username>", "PWD"=>"password>");

Die pseudo-code kan niet werken; en waar <tabel> staat moet het uiteraard <database> zijn en ook je PWD waarde klopt niet. Dubbelcheck of je echte connectionInfo wel klopt.
Wat is er precies fout aan dan? Heb het van de pagina van PHP zelf.
SKiLLa schreef op vrijdag 3 november 2017 @ 16:59:
Een andere mogelijke oorzaak is $servername; misschien gebruik je SQL Server Express; dan is het: "serverName\sqlexpress" (serverName\instanceName) ipv alleen "serverName"...
Gekeken, maar volgens mij is het wel de volledige versie. Heb \sqlexpress erachter gezet, maar ook dat heeft niet geholpen.
SKiLLa schreef op vrijdag 3 november 2017 @ 16:59:
Ten derde; is die SQL Server wel geconfigureerd met expliciete SQL users, of werkt ie alleen met Trusted Connections ? Want dan is het een config-issue aan de serverkant of dien je de ConnectionInfo aan te passen.

En je moet sowieso een PHP foutmelding krijgen (kan in theorie 30s duren bij een connection-failure, maar toch); zet die ff aan :)
De user heeft wel toegang, hebben we inderdaad geprobeerd. Hoe kan ik dit aanzetten? Ben meer hobbyist dan professional. De applicatie is daar ook uit ontstaan haha.

Bedankt voor je reactie!

[ Voor 3% gewijzigd door D3F op 03-11-2017 17:10 ]


Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

whoami schreef op vrijdag 3 november 2017 @ 17:01:
[...]
Dat heeft niets persé met Sql Express te maken.
Je kan een gewone SQL Server instance ook een instancenaam geven.
Dat klopt (daarom ook de generiekere aanvulling tussen haakjes in de orginele post); maar bij default settings van een reguliere SQL server is dat niet nodig (en je ziet het dan ook bijna nooit op produktie-omgevingen); bij een default installatie van SQL Express is het wel weer vereist. Ik denk niet dat we het de TS meteen onnodig complex moeten maken :)

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

D3F schreef op vrijdag 3 november 2017 @ 17:09:
[...]

Wat is er precies fout aan dan? Heb het van de pagina van PHP zelf.

[...]
Op de PHP site staat:
code:
1
$connectionInfo = array( "Database"=>"dbName", "UID"=>"userName", "PWD"=>"password");


Jij hebt:
code:
1
$connectionInfo = array( "Database"=>"<databasenaam>", "UID"=>"<username>", "PWD"=>"<password>");


Moet dat niet zijn:
code:
1
$connectionInfo = array( "Database" => $databasenaam, "UID" => $username, "PWD" => $password);


PS: In je oorspronkelijke post had je nog <tabel> ipv <databasenaam> staan en een > teveel achter password staan.

'Political Correctness is fascism pretending to be good manners.' - George Carlin


Acties:
  • +1 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je zal sowieso altijd een error krijgen. Als je die niet hebt, zorg dan dat error_reporting op E_ALL | E_STRICT staat tijdens het developen en dat display_errors aan staat op je developmentomgeving. Op productie wil je beide dingen natuurlijk niet doen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • +1 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 23:53
volgens mij is het wel de volledige versie. Heb \sqlexpress erachter gezet, maar ook dat heeft niet geholpen.
Dat je het al probeert toont aan dat je geen idee hebt wat je aan het doen bent...
Zet gewoon error reporting tijdelijk aan, dan komt er waarschijnlijk gewoon een fout uit waar je iets mee kan in plaats van dat we allemaal wat gokken.

[ Voor 41% gewijzigd door sig69 op 04-11-2017 01:11 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
NMe schreef op vrijdag 3 november 2017 @ 17:21:
zorg dan dat error_reporting op E_ALL | E_STRICT staat tijdens het developen en dat display_errors aan staat op je developmentomgeving.
Sinds 5.4 kun je gewoon enkel E_ALL gebruiken... of -1 wat ik zelf voorheen altijd handiger vond.

Acties:
  • +1 Henk 'm!

  • scosec
  • Registratie: Februari 2016
  • Laatst online: 07-10 12:10
1. Zorg dat error reporting aan staat.
2. Als je ontwikkeld vanaf een eigen systeem. Zorg dat je webserver/PHP de sql server drivers heeft: https://www.microsoft.com...oad/details.aspx?id=20098
3. Controleer of er een instance naam gegeven is in SQL.
4. Log als user zijnde in via SSMS om te checken dat je voldoende rechten hebt.

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 15:13

ElCondor

Geluk is Onmisbaar

Ik zie inderdaad nog steeds geen foutmelding. Alleen daarvandaan kun je effectief gaan troubleshooten. Dit is zoiets als de helpdesk bellen met alleen de klacht: "Het werkt niet!"

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • +1 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
scosec schreef op zaterdag 4 november 2017 @ 09:46:
2. Als je ontwikkeld vanaf een eigen systeem. Zorg dat je webserver/PHP de sql server drivers heeft: https://www.microsoft.com...oad/details.aspx?id=20098
Ik gok dat dit het probleem zal zijn, mssql werkt niet zonder extensions. Volgens mij moet je op t systeem zelf ook nog iets installeren qua devtools van Microsoft ervoor.

Acties:
  • +1 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

scosec schreef op zaterdag 4 november 2017 @ 09:46:
1. Zorg dat error reporting aan staat.
2. Als je ontwikkeld vanaf een eigen systeem. Zorg dat je webserver/PHP de sql server drivers heeft: https://www.microsoft.com...oad/details.aspx?id=20098
3. Controleer of er een instance naam gegeven is in SQL.
4. Log als user zijnde in via SSMS om te checken dat je voldoende rechten hebt.
Voor de duidelijkheid: puntje 2-4 zijn tijdverspilling totdat puntje 1 afgewerkt is. Debuggen zonder foutmelding is als naar de dokter gaan met niet meer dan de melding "ik ben ziek!" en verwachten dat hij je beter maakt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 15:13

ElCondor

Geluk is Onmisbaar

NMe schreef op zaterdag 4 november 2017 @ 12:28:
[...]

Voor de duidelijkheid: puntje 2-4 zijn tijdverspilling totdat puntje 1 afgewerkt is. Debuggen zonder foutmelding is als naar de dokter gaan met niet meer dan de melding "ik ben ziek!" en verwachten dat hij je beter maakt.
Da zei ik dus! :P

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • PageFault
  • Registratie: April 2002
  • Laatst online: 07-10 13:02
Check ook of sql authentication voor je database aan staat en niet alleen windows authentication.

Acties:
  • +1 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Wat @NMe en @Cartman! zeggen...

Hier kun je de benodigde dll's downloaden om e.e.a. op windows te draaien + een apt-get handleiding voor Linux/Apache. Als je trouwens IIS gebruikt (wat niet geheel ondenkelijk is omdat je ook MSSQL gebruikt) kun je vanuit IIS gewoon compleet PHP installeren preconfigured voor MSSQL.

Als je de losse DLL's download zul je even in de juiste directory moeten zetten (php/ext) en vervolgens in je php.ini een regeltje toe moeten voegen

code:
1
extension=php_pdo_sqlsrv_71_ts_86.dll


Als dat allemaal gebeurd is (en je hebt de server gerestart) kun je connecten. Misschien is dit ook gelijk de uitgelezen kans om gebruik te maken van PDO zodat je ook in de toekomst makkelijker kunt switchen van MySQL naar MSSQL (of een ander dialect)

PHP:
1
2
$dbcon = new PDO( "sqlsrv:server=".$mssqlserver." ; Database=".$dbname, $dbuser, $dbpass);
$dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

[ Voor 14% gewijzigd door Harrie_ op 05-11-2017 11:12 ]

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • D3F
  • Registratie: Mei 2016
  • Laatst online: 07-10 14:50
Iedereen bedankt voor de antwoorden, ik ga dit allemaal doornemen en rapporteer later deze week terug!

Acties:
  • 0 Henk 'm!

  • Marber
  • Registratie: Juni 2014
  • Laatst online: 08-10 14:45
Als deze SQL server in een groter netwerk hangt, denk dan ook eens aan firewall routes. Meestal staan deze default dicht.

MS SQL gebruikt default de ports 1433 en 1434. (dit hangt natuurlijk af van je inrichting)
Pagina: 1