[PHP/MS SQL 2005]Verbinding kan niet opgezet worden

Pagina: 1
Acties:
  • 1.116 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo allemaal,

Mijn PHP script krijgt geen verbinding met m'n MS SQL 2005 database en ik heb geen flauw idee waarom niet. Ik heb 2 servers. Een development en een productie server. Beide servers draaien windows 2003. Beide servers draaien ook IIS 6 met PHP 5.2.3. Beide servers verbinden met dezelfde (externe) MS SQL 2005 database.Op beide servers staat dezelfde versie van ntwdblib.dll (2000.2.8.0). Op beide servers draait hetzelfde script. Op de developmentserver werkt het script probleemloos, op de productieserver niet. Het PHP script op de productieserver krijgt geen verbinding met MS SQL Server 2005. Ik heb al geprobeerd om naar IP te verbinden ipv hostname, maar ik kreeg toen hetzelfde probleem. Ik heb nslookup gedraaid op de productieserver, en hij werd ook goed geresolved. Ik heb toen Management Studio geinstalleerd op de productieserver om te kijken of er misschien een firewall probleem was, maar met Management Studio kon ik probleemloos verbinding maken. Het is dus echt een PHP probleem, maar niet in de code verwacht ik. Ik denk dat er ergens nog een file oid niet gevonden kan worden, maar ik heb totaal geen idee meer welke.
De developmentserver staat in het kantoor van m'n werk in Goirle. De productieserver hangt in het rack bij Redbus (Amsterdam dus). De MS SQL database wordt gewoon gehuurd bij een bedrijf. Die server is dus niet van ons en daar hebben we ook alleen maar 1 database. Dat bedrijf is hetzelfde bedrijf als waar de productieserver bij is weggehangen. Als ik tracert draai van de productieserver naar de databaseserver, dan hebben we het over 1 hop :).
Tenslotte nog een klein, ranzig, testscriptje wat perfect werkt op de development server maar niet op de productieserver:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<head>
<title>Een lijst met alle films in de database</title>
</head>
<body>
<?php
mssql_connect('hostname,1433', 'user', 'pass') or die('Geen verbinding. MSSQL retouneerde: '.mssql_get_last_message());
mssql_select_db('database') or die('Kon geen database selecteren. MSSQL retouneerde: '.mssql_get_last_message());
$result = mssql_query('SELECT naam FROM tabel') or die('Query klopt niet. MSSQL retouneerde: '.mssql_get_last_message());
while($rij = mssql_fetch_assoc($result))
{
    echo $rij['naam']."<br>\n";
}
?>
</body>
</html>

Op de development server krijg ik netjes alle namen te zien. Op de productie server krijg ik alleen maar de tekst die ik zelf in or die() heb getikt. mssql_get_last_message() geeft totaal geen output. De foutmelding van PHP die er in m'n errorlog staat is de volgende (het is een productieserver, dus foutmeldingen komen in een log en niet op het scherm ;)):
code:
1
[16-Jul-2007 15:54:14] PHP Warning:  mssql_connect() [<a href='function.mssql-connect'>function.mssql-connect</a>]: Unable to connect to server:  hostname,1433 in C:\Inetpub\test\test.php on line 7


Wie heeft er nog een idee wat er fout kan zijn op de productieserver?

Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Accepteert de MSSQL productie server wel TCP/IP verbindingen? Welk protocol gebruik je als je verbinding maakt met behulp van Management Studio?

[ Voor 11% gewijzigd door jelmervos op 16-07-2007 16:23 ]

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Bij mijn weten staat de TCP/IP connectie mogelijkheid default uit in MSSQL server 2005. Kijk daar eens naar in de SQL Server Configuration manager -> SQL Server 2005 Network Configuration -> Protocols... -> TCP/IP?
edit:

Wat jelmervos dus zegt ;)

[ Voor 40% gewijzigd door RobIII op 16-07-2007 16:24 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Even voor de duidelijkheid: er zijn 3 servers in het spel betrokken:
1. development win 2k3 server, deze heeft alleen een IIS server, geen MS SQL
2. productie win 2k3 server, deze heeft alleen een IIS server, geen MS SQL
3. MS SQL 2005 Server, waarop ik alleen toegang heb tot 1 database dmv een MS SQL usertje. Deze server is dus niet in mijn beheer. Deze server draait dan weer geen IIS.

Het zijn alle 3 fysiek andere machines met elk een eigen IP adres. De development machine komt dus via TCP/IP gewoon bij de MS SQL 2005 Server. Daar zit het probleem dus niet.
Ik heb net ook nog met Management Studio geprobeerd om vanaf te productie server bij de SQL Server te komen via TCP/IP. Dit ging probleemloos.

Acties:
  • 0 Henk 'm!

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 20-09 23:24

BoAC

Memento mori

Met welke rechten (gebruiker enz) connect je met management-console?
En hoe is dat op je development server?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
zowel development, management studio als productie gebruikt dezelfde user om te verbinden naar de MS SQL 2005 Server. Dat is dus exact hetzelfde.
De IIS instance draait natuurlijk wel onder een andere user dan waarmee ik inlog op de productie server. En onder die user draait dan Management Studio. Maar het lijkt me sterk dat IIS niet iets over het netwerk mag doen ofzo :p

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 16 juli 2007 @ 16:55:
Maar het lijkt me sterk dat IIS niet iets over het netwerk mag doen ofzo :p
Zegt het spreekwoord "assumptions are the mother of all ..." je iets? ;)

Het lijkt me overigens nog steeds een rechten danwel tcp/ip probleem. Ik zou het daar nog even ergens in zoeken.

[ Voor 33% gewijzigd door RobIII op 16-07-2007 17:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mja, als IIS niets op het netwerk mag doen, is dan het idee van IIS niet een beetje weg? :p En IIS werkt best goed erop. De websites die nu op die IIS server draaien zijn van buiten af te bereiken, dus IIS mag TCP/IP praten :)
Maar misschien mag PHP zelf dat niet. Ik zal eens kijken of ik die kan laten praten met een externe MySQL server, dan weet ik dat ook meteen :)

Verder heb je wel een puntje hoor ;). Je moet niets aannemen, je moet dingen zeker weten :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
OK. Ik heb net een test gedaan. Op de productieserver draait ook een MySQL deamon. Daar heb ik verbinding mee gemaakt (vanaf de productie server). Dat is helemaal succesvol gelukt. Ik heb verbinding kunnen maken met die deamon als ik mysql_connect('localhost', 'user', 'pass'); deed en als ik mysql_connect('extern_ip_productie_server', 'user', 'pass'); deed. Is dat idd een correcte test dat IIS via TCP/IP verbinding mag maken met andere servers? En als dat het geval is, wat zou dan de oorzaak kunnen zijn dat PHP geen verbinding kan krijgen met MS SQL Server?

[ Voor 2% gewijzigd door Verwijderd op 17-07-2007 11:02 . Reden: bericht vollediger en duidelijker maken ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Wat ik me trouwens ook bedacht: er draait ook een VB ASP.NET website op de productieserver. Die website maakt verbinding naar exact dezelfde SQL Server, naar exact dezelfde database met exact dezelfde user. En die site kan er probleemloos bij komen. Het wijst echt op een PHP icm IIS probleem.

Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 19:46
Domme vraag?

php_mssql includen?


Edit: dom, hij herkent de functie dus hij is geinclude

[ Voor 47% gewijzigd door jvdmeer op 17-07-2007 14:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

check ook eens: Windows Authentication vs. SQL Server Authentication
Misschien moet je connectie maken met een speciale MS SQL server instance?
Hoe ziet de connectiestring van de ASP.NET applicatie eruit?
Vergelijk de connectie poging van je PHP applicatie t.o.v. de ASP.NET applicatie met MS SQL Profiler.

Acties:
  • 0 Henk 'm!

  • Preaper
  • Registratie: September 2003
  • Laatst online: 16:33

Preaper

...

Dit lijkt sterk op een probleem dat ik heb. Ik werk echter met ASP. Ik kan geen verbinding maken met de MSSQL server:

Microsoft OLE DB Provider for SQL Server error '80004005'

[DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied.

/ORCA/inc/OISImporter/test.asp, line 20


Maar een al bestaand ASP.NET script dat dezelfde connectionstring gebruikt kan wel verbinden. Ik zit met het handen in het haar. Hoe kan dit toch?

Het betreffende ASP script is als volgt:
<%

cst = "Provider=SQLOLEDB;" & _
"Data Source=172.11.32.91;" & _
"Initial Catalog=OrderRegistration;" & _
"Network=DBMSSOCN;" & _
"User Id=usrnm;" & _
"Password=<<pass>">

set conn = CreateObject("ADODB.Connection")
conn.open cst
%>

Ik objecteer, u eer.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@jvdmeer: idd. de functie wordt herkend, dus hij is geladen. Het heeft ook wel wat moeite gekost hoor, voordat die module geladen was. Veel gezeik met rechten gehad.
Verwijderd schreef op dinsdag 17 juli 2007 @ 15:29:
check ook eens: Windows Authentication vs. SQL Server Authentication
Misschien moet je connectie maken met een speciale MS SQL server instance?
Hoe ziet de connectiestring van de ASP.NET applicatie eruit?
Vergelijk de connectie poging van je PHP applicatie t.o.v. de ASP.NET applicatie met MS SQL Profiler.
Ik moet verbinden met SQL Server Authentication. Dat dwing je af door in php.ini de optie mssql.secure_connection op false te zetten. Die optie staat zowel op productie als development op false.


Ik heb ook nog even met WireShark gekeken waar de verbinding nu precies mislukt. Als ik kijk naar de dump op productieserver dan lijkt het wel alsof de SQL Server meteen de verbinding sluit. Bij de developmentserver krijg ik wel netjes een reactie terug.
Bij de productie server zie je bij pakket 4043 en 4044 dat dat TCP pakketten zijn met de flags FIN en ACK aan. Dat zijn dus acknolegements op een pakket met de FIN flag. Het pakketje met alleen de FIN flag moet dus van de SQL Server afkomen (althans, volgens mij wel, voor zover ik het TCP Protocol begrijp). Dit pakketje heb ik alleen niet gezien in mijn dump.
Als je kijkt naar de dump van de developmentserver dan kun je zien aan pakket 3177 tot 3183 dat er netjes een reactie terug komt van de SQL Server.

De dumps zijn op de volgende URL te vinden: http://www.directmovie.nl/tijn/wiresharkdumps.zip

Misschien hebben die dumps een extra hint voor het probleem.

[ Voor 22% gewijzigd door Verwijderd op 17-07-2007 15:58 . Reden: Reactie op bericht toevoegen wat er nog niet stond toen ik deze post maakte. ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 17 juli 2007 @ 15:54:
@jvdmeer: idd. de functie wordt herkend, dus hij is geladen. Het heeft ook wel wat moeite gekost hoor, voordat die module geladen was. Veel gezeik met rechten gehad.


[...]

Ik moet verbinden met SQL Server Authentication. Dat dwing je af door in php.ini de optie mssql.secure_connection op false te zetten. Die optie staat zowel op productie als development op false.
...
Verwijderd schreef op dinsdag 17 juli 2007 @ 15:54:

Misschien hebben die dumps een extra hint voor het probleem.
Nee, SQL Profiler is een onderdeel van de SQL Server management tools. Ga hier mee aan de slag.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat lees ik niet erg positief. Wat bedoel je hier precies mee? De 2 dingen die je quote hebben ook vrij weinig met elkaar te maken. In het bovenste stukje heb ik het over leesrechten op bepaalde dlls, dus echt OS security, en bij het 2e stuk geef ik aan dat ik afdwing dat er van SQL Server Autentication gebruik gemaakt moet worden. Als je die optie op true zet, dan wordt er gebruik gemaakt van Windows Authenticatie en dan werkt het helemaal niet meer. Die dingen hebben imo niets met elkaar te maken.
Verwijderd schreef op dinsdag 17 juli 2007 @ 16:43:
Nee, SQL Profiler is een onderdeel van de SQL Server management tools. Ga hier mee aan de slag.
Hmm, en waar kan ik SQL Profiler dan vinden op de Microsoft website? Ik heb hem echt afgezocht, maar kan hem niet vinden. Even dacht ik dat dat gewoon in Microsoft SQL Server Management Studio Express moest zitten, maar daar kon ik de optie niet vinden. Kan je dus misschien een URL geven waar ik die kan downloaden? Dan kan ik even kijken of ik daarmee nuttige resultaten kan verkrijgen.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
heb je de user waaronder iis draait (en waaronder je webapp dus evt draait) toegang gegeven tot die DB ? (iusr_wpg of whatever) ? (als je gebruikt maakt van Integrated security, that is).

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op dinsdag 17 juli 2007 @ 17:23:
[...]

Dat lees ik niet erg positief. Wat bedoel je hier precies mee? De 2 dingen die je quote hebben ook vrij weinig met elkaar te maken. In het bovenste stukje heb ik het over leesrechten op bepaalde dlls, dus echt OS security, en bij het 2e stuk geef ik aan dat ik afdwing dat er van SQL Server Autentication gebruik gemaakt moet worden. Als je die optie op true zet, dan wordt er gebruik gemaakt van Windows Authenticatie en dan werkt het helemaal niet meer. Die dingen hebben imo niets met elkaar te maken.
Dan is dat waarschijnlijk toch gewoon goed en kun je dat doorstrepen... Ik had gewoon het hele bericht gequote en sowieso niet relevante info met ... vervangen ofzo.
Verwijderd schreef op dinsdag 17 juli 2007 @ 17:23:
Hmm, en waar kan ik SQL Profiler dan vinden op de Microsoft website? Ik heb hem echt afgezocht, maar kan hem niet vinden. Even dacht ik dat dat gewoon in Microsoft SQL Server Management Studio Express moest zitten, maar daar kon ik de optie niet vinden. Kan je dus misschien een URL geven waar ik die kan downloaden? Dan kan ik even kijken of ik daarmee nuttige resultaten kan verkrijgen.
http://technet.microsoft.com/en-us/library/ms173757.aspx

"Use Use SQL Profiler to:
...
Audit and review activity that occurred on an instance of SQL Server. This allows a security administrator to review any of the auditing events, including the success and failure of a login attempt and the success and failure of permissions in accessing statements and objects"

Aha, als ik naar dit lijstje kijk dan staat er ongeveer: "This edition can be profiled from a Standard or Enterprise Edition of SQL Server 2005."
Lijkt er dus op dat bij de Microsoft SQL Server Management Tools van de Standard en Enterprise editie de profiler wel bij zit.... Die dus installeren als je die hebt... good luck.


edit:
Misschien heb je helemaal niets aan SQL Server Profiler, omdat de database op een aparte server staat en de security hiervan waarschijnlijk op een hoog niveau staat:

"To perform tracing with SQL Server Profiler, users must also have the ALTER TRACE permission."

[ Voor 6% gewijzigd door Verwijderd op 18-07-2007 11:03 . Reden: alter trace ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op dinsdag 17 juli 2007 @ 19:15:
heb je de user waaronder iis draait (en waaronder je webapp dus evt draait) toegang gegeven tot die DB ? (iusr_wpg of whatever) ? (als je gebruikt maakt van Integrated security, that is).
Dit volg ik even niet. SQL Server draait NIET op dezelfde server als waar IIS op draait he ;). Ik log in op de SQL Server via SQL Authentication. En dat inloggen lukt perfect vanaf de development server. De user heeft dus toegang tot de database. De DB User komt dus bij de DB.
Verwijderd schreef op dinsdag 17 juli 2007 @ 23:23:
Lijkt er dus op dat bij de Microsoft SQL Server Management Tools van de Standard en Enterprise editie de profiler wel bij zit.... Die dus installeren als je die hebt... good luck.
Ah. Die hebben we dus niet. Ik kan alleen aan MS SQL 2005 Express komen, die zo van microsoft.com te plukken is. Maar we hebben hier geen MS SQL 2005 liggen (daarom huren we ook ergens een database ;)). Ik vrees dus dat SQL Server Profiler geen optie gaat zijn :(

[ Voor 32% gewijzigd door Verwijderd op 18-07-2007 09:21 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
Met profiler ga je niet veel wijzer worden in dit geval vrees ik.

Draait die SQL Server op de standaard poort ? Wat staat er ingesteld op de productie-server als poort waarop een connectie met sql server moet gemaakt worden ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
de SQL Server draait op de standaard poort, dus gewoon op 1433. Op de productieserver staat ook ingesteld dat hij met die poort moet verbinden. Het script wat ik in de startpost geplaatst hebt maakt verbinding met poort 1433 en dat script krijgt dus geen verbinding met de database :(

[ Voor 5% gewijzigd door Verwijderd op 18-07-2007 11:32 . Reden: verduidelijken ]


Acties:
  • 0 Henk 'm!

Verwijderd

Toevallig de afgelopen dagen even geworsteld met een soortgelijk probleem, maar dan met een ASP.Net connectie naar SQL Server Express.

Ik had een website aangemaakt in IIS op de server en hier de hele website in geconfigureerd. Op de een of andere manier kon de SQL Server niet gevonden worden, terwijl thuis alles prima werkte op mijn SQL Server 2005 database.

Na het aanpassen van het IP-adres in IIS, die stond op (All unassigned) naar het correcte ip-adres (van de internetconnectie van de server) werd de SQL-server wel gevonden en nu draait alles als een zonnetje.

Ik heb geen flauw idee of het iets met jouw probleem te maken heeft, maar je zou er wellicht eens naar kunnen kijken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bij mij stond de website ook op All unassigned. Ik heb hem over gezet naar het IP adres van de server, maar het mocht niet baten. Ik heb nog steeds hetzelfde probleem. Toch bedankt voor de tip hoor :)
De development server stond trouwens ook op All unassigned, dus het heeft er niet veel mee te maken, dus. Helaas.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:01
Ik heb het over de poort van Sql Server. Standaard draait SQL Server 2000 bv op portnr 1433.
Ga eens na of dit ook het geval is op jouw server, en ga eens na met welke poort je IIS server probeert te connecteren met sql server. (In SQL Server 2000 heb je daarvoor de Client Configuration utility oid; ik heb momenteel geen sql server tot mijn beschikking, dus ik kan atm niet checken hoe dit in sql server 2005 is).
Ga ook eens na welke protocollen er ge-enabled zijn op die server (TCP/IP , named pipes), en met welk protocol de IIS server met Sql server wil/kan praten.

[ Voor 15% gewijzigd door whoami op 18-07-2007 16:57 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met Management Studio Express kom ik zowel met TCP/IP, Named Pipes als Shared Memory op de server. Alles wordt dus geaccepteerd, lijkt me dan. Dit lijkt me een afdoende test toch om te kijken wat er ge-enabled is op de server?
De SQL Server draait op poort 1433. Als ik vanaf de development server met poort 1433 verbind, dan gaat het helemaal goed. Als ik bijv. poort 1500 pak (iemand heeft mij vertelt dat MS SQL 2005 dynamisch op poorten kan reageren) dan lukt het niet (blijkbaar is deze SQL Server niet dynamisch ingesteld ;)).
Ik heb m'n wireshark dumps nog een keer doorgekeken en daarin staat dat er ook vanuit IIS verbinding wordt gemaakt met poort 1433. Ik heb heel Management Studio Express doorgekeken en daar zie ik verder geen tools in staan waarmee ik connecties kan tracen ofzo (ik ben d'r vandaag pas achter gekoment dat er een verschil zit tussen Management Studio en Management Studio Express, ik heb dus de Express versie).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hehe, probleem eindelijk opgelost. Maar toch blijf ik het vaag vinden. Op PHP.net stond dat je ntwdblib.dll moest vervangen. Versie 2000.2.8.0 (die standaard bij PHP 5.2.3 zit) werkt niet met SQL Server 2005. Maar ik had gekeken op de development server en daar staat toch echt Versie 2000.2.8.0 in de PHP5 map. Daar wordt gewoon gebruik van gemaakt door PHP en dat werkt gewoon. Ik heb die DLL op de productieserver toch maar eens vervangen door 2000.80.194.0 en de server herstart. Toen werkte de SQL Verbinding ineens wel.
Ik ben nu de development server nog aan het afzoeken naar alle ntwdblib.dll om te kijken of de development stiekem toch gebruik maakt van die nieuwe versie, maar ik verwacht eigenljik niet dat ik iets ga vinden.

edit:

Het doorzoeken van de development server is voltooid. En daar wordt echt gebruik gemaakt van 2000.2.8.0. In de vorige PHP installatie op de development server (5.2.0, development draait ook 5.2.3 nu) is de DLL wel vervangen. Maar in de huidige install is dat niet het geval. phpinfo() laat overigens wel zien dat ze allebij van versie 7.0 van de library gebruik maken.
Ik had overigens al eerder geprobeerd om de dll te vervangen. Dat mislukte toen omdat ik niet de goede rechten op de nieuwe dll had gezet. Daardoor kwam PHP er niet bij en werkte heel de mssql extensie niet meer. Nu heb ik de DLL dus nog een keer vervangen en er wel de goede rechten op gezet. Nu is het probleem dus helemaal opgelost.

[ Voor 33% gewijzigd door Verwijderd op 19-07-2007 09:35 . Reden: doorzoeken van de development server is klaar, even de resultaten mededelen ]


Acties:
  • 0 Henk 'm!

Verwijderd

ntwdblib.dll problem

Kan je aub een kopie van dat ntwdblib.dll naar stuut. Ik heb zelf problem maar niet opgeloset zijn verschillen versie.

ik Apache and php in my computer met XP.

Please, I am stuck trying to solve this problems. I have tried different version and i have formatted my systems many times but still haven't solve the problem.
Pagina: 1