imkimkimk
Goto Top

SQL Server verweigert verbindung

Hallo,

ich hoffe mir kann wer helfen.
Ich habe einen MS SQL Express Server und versuche über PHP PDO eine Verbindung aufzubauen.
Hier mein Code:

$servername = "imksv003\\SQLEXPRESS";  

$username = "xxxxx";  
$password = "xxxxx";  

$database = "xxxxx";  
$port = "1433";  
try {
	
	$con_string = "sqlsrv:server=$servername,$port;Database=$database";  

    $conn = new PDO($con_string , $username, $password);
	$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	echo $conn;
	
	
} catch (PDOException $e) {
    echo ("Error connecting to SQL Server: " . $e->getMessage());  
}

Ich bekomme als Ergebnis folgende Ausgabe:

Error connecting to SQL Server: SQLSTATE[08001]: [Microsoft][ODBC Driver 17 for SQL Server]TCP-Anbieter: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte.


Ich weiß das der Datenbankserver im Netzwerk erreichbar ist. Über das MS SQL Management Studio oder ein C# Programm klappt die Verbindung. Eine Firewall ist nicht dazwischen. Leider finde ich kein Log oder ähnliches was mir sagt warum die Verbindung abgelehnt wird. Zugangsdaten, Servername, Datenbank sind korrekt. Auch der Port ist der Default Port.


Kann mir jemand sagen wie ich den Grund rausfinde warum die Verbindung abgelehnt wird?

Content-ID: 4307579958

Url: https://administrator.de/contentid/4307579958

Ausgedruckt am: 25.11.2024 um 00:11 Uhr

Crusher79
Crusher79 16.10.2022 aktualisiert um 23:04:46 Uhr
Goto Top
$serverName = "(local)\sqlexpress";

Nimmer mal dne doppelte "\\" raus. Ist nicht registry o.ä. Braucht man nicht escapen.

$servername = "imksv003\SQLEXPRESS";  
LordGurke
LordGurke 17.10.2022 aktualisiert um 00:36:14 Uhr
Goto Top
Doch, \ ist das Escape-Zeichen unter PHP, das muss man escapen, wenn man es als literales Zeichen benutzen will.

"Zielcomputer verweigert die Verbindung" ist relativ universell für "Der Dienst lauscht nicht an der angegebenen Adresse". Vermutlich läuft SQL Express nur Localhost und du kannst nicht standardmäßig über das Netzwerk verbinden.
imkimkimk
imkimkimk 17.10.2022 um 07:24:52 Uhr
Goto Top
geht leider auch nicht. sowohl servername\SQLEXPRESS also auch nur servername als auch servername\\SQLEXPRESS funktioniert nicht
Spirit-of-Eli
Spirit-of-Eli 17.10.2022 um 07:30:00 Uhr
Goto Top
Moin,

ist die SQL Server Bindung überhaupt für extern/remote freigegeben?

Gruß
Spirit
imkimkimk
imkimkimk 17.10.2022 um 09:01:20 Uhr
Goto Top
ja, von einem anderen PC und vom Webserver selbst aus klappt die Verbindung per SSMS auch.
Looser27
Looser27 17.10.2022 um 09:06:29 Uhr
Goto Top
Moin,

hast Du ganz trivial die TCP/UDP Ports auf dem SQL Server freigegeben?

GRuß

Looser
vossi31
vossi31 17.10.2022 um 09:20:38 Uhr
Goto Top
Moin,

versuche es zum Test mit IP anstatt Servername und ggf. nur mit IP oder Servername aber ohne Instanz.

Henning
NordicMike
NordicMike 17.10.2022 um 09:24:42 Uhr
Goto Top
Das TCP Protokoll am SQL Server selbst ist doch per Default erst einmal deaktiviert. Wirde dieses Protokoll aktiviert?
imkimkimk
imkimkimk 17.10.2022 um 09:35:30 Uhr
Goto Top
Ja ist alles Freigegeben. Von anderen Remote PCs klappts ja face-smile
imkimkimk
imkimkimk 17.10.2022 um 09:35:51 Uhr
Goto Top
Habe alle Varianten versucht. Leider ohne Erfolg
Looser27
Looser27 17.10.2022 um 09:37:51 Uhr
Goto Top
DNS-Auflösung klappt von allen PCs aus?
NordicMike
NordicMike 17.10.2022 um 09:38:37 Uhr
Goto Top
DNS funktioniert richtig, also am Web/PHP Server selbst?
Lässt sich auf dem Webserver die Hostname ohne FQDN auflösen? Das ist bestimmt ein anderer Rechner, als der, mit dem du das SQL Management Studio ausprobiert hast.
imkimkimk
imkimkimk 17.10.2022 um 10:02:06 Uhr
Goto Top
ja DNS funktioniert
imkimkimk
imkimkimk 17.10.2022 um 10:03:09 Uhr
Goto Top
das ist ne Windows Kiste in der selben Domäne. DNS Funkioniert. mit und ohne FQDN. Von der selben Maschine klapppt auch das Management-Studio
Crusher79
Crusher79 17.10.2022 aktualisiert um 10:50:12 Uhr
Goto Top
https://www.phparch.com/wp-content/uploads/2010/11/PDO__MSSQLServer.pdf

Hier hab ich nochmal ein Dokument - aber älter gefunden.

Aber du hast keinen SQL 2008 R2 Express oder? Der neue Treiber unterstützt den nicht mehr. Du kannst bei MS auch ältere Versionen laden.

Was für ein Mode hast du? Mixed Mode oder mit AD?
https://stackoverflow.com/questions/857194/php-pdo-connection-to-sql-ser ...

Enable Windows Authentication
Disable Anonymous Authentication
remove the username and password from the PDO connection
Crusher79
Crusher79 17.10.2022 um 10:51:48 Uhr
Goto Top
Zitat von @LordGurke:

Doch, \ ist das Escape-Zeichen unter PHP, das muss man escapen, wenn man es als literales Zeichen benutzen will.

"Zielcomputer verweigert die Verbindung" ist relativ universell für "Der Dienst lauscht nicht an der angegebenen Adresse". Vermutlich läuft SQL Express nur Localhost und du kannst nicht standardmäßig über das Netzwerk verbinden.

Bei mir etwas länger her. Aber schau bitte auch mal hier:
https://www.phparch.com/wp-content/uploads/2010/11/PDO__MSSQLServer.pdf


Hab ihm auch aktuelle MS Doku gegeben. Da verwenden sie kein Escape Zeichen... Ka wie ich das damals gemacht hatte face-big-smile

Die bauen das immer so:
$serverName = ‘CALEVANS-PC\SQLEXPRESS’;
$uid = ‘testuser’;
$pwd = ‘testuser’;
$database = ‘AdventureWorks’;
try {
$conn = new PDO( “sqlsrv:server=$serverName;database=$database”, $uid, $pwd);
Crusher79
Crusher79 17.10.2022 um 10:54:02 Uhr
Goto Top
Zitat von @NordicMike:

Das TCP Protokoll am SQL Server selbst ist doch per Default erst einmal deaktiviert. Wirde dieses Protokoll aktiviert?

Meine das war mal. Installier die nicht mehr jeden Tag. beim großen war es mein ich immer aktiv.

SQL 2008 R2 - da kenne ich das auch noch.
Crusher79
Crusher79 17.10.2022 aktualisiert um 11:20:59 Uhr
Goto Top
Zitat von @imkimkimk:

das ist ne Windows Kiste in der selben Domäne. DNS Funkioniert. mit und ohne FQDN. Von der selben Maschine klapppt auch das Management-Studio

Das hab ich im Augenwinkel auch noch als Tip gelesen: Mal in die Hostdatei eintragen. Macht wie gesagt keinen Sinn, wenn es so funktioniert. Kannst es aber spaßeshalber einmal eintragen.

PS: Wegen den Express strauchel ich auch gerade!

Nochmal ggf. folgendes durcharbeiten:
1. https://store.oceansystems.com/knowledgebase/quickdme-faqs/sql-server-sq ...
2. Ggf. TCP/IP nach oben schieben
3. Anonymous Login deaktivieren
4. sa oder Windows integriert? Je nachdem die Zeile anpassen
5. Den SQL Server - wie im Hinweis - nach den Änderungen neu starten.
Spirit-of-Eli
Spirit-of-Eli 17.10.2022 um 11:30:26 Uhr
Goto Top
@to klappt die Remoteverwaltung oder kannst du tatsächlich auf die DB von Remote zugreifen?
em-pie
em-pie 17.10.2022 um 12:03:06 Uhr
Goto Top
Moin,

welche MS SQL-Server-Version?
Seit 2019 wird eine verschlüsselte Verbindung per Default erwartet.
Entweder in der PHP-Anbindung bewusst deaktivieren (blöde IDee) oder ein selbstsigniertes Zertifikat bereitstellen.

https://codekabinett.com/rdumps.php?Lang=2&targetDoc=create-install- ...
https://support.microsoft.com/en-us/topic/how-to-enable-ssl-encryption-f ...
https://www.der-windows-papst.de/2021/10/04/ssl-self-signed-fallback/

Gruß
em-pie
imkimkimk
Lösung imkimkimk 17.10.2022 um 12:39:57 Uhr
Goto Top
Danke für die vielen Tips. Ich habs jetzt gelöst.
Mit diesem Code gehts:

$servername = "servername\\SQLEXPRESS";  
$username = "user";  
$password = "passwort";  
$database = "datenbank";  

try {
	
	$con_string = "sqlsrv:server=$servername;Database=$database";  

    $conn = new PDO($con_string , $username, $password);
	//$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	foreach ($conn->query("Select * from table") as $row) {  
    print $row . "<br>";  
}

	
} catch (PDOException $e) {
    echo ("Error connecting to SQL Server: " . $e->getMessage());  
}


Geändert habe ich gerade nur zum testen die Portangabe. 1433 ist zwar der Standard-Port und der wird auch genutzt vom SQL Server aber ohne die Angabe gehts. Also vermute ich mal falscher Syntax des DSN.

Danke auf jedenfall an die vielen Helfer und die schnellen Antworten face-smile