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-Key: 4307579958

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

Printed on: July 19, 2024 at 09:07 o'clock

Member: Crusher79
Crusher79 Oct 16, 2022 updated at 21:04:46 (UTC)
Goto Top
$serverName = "(local)\sqlexpress";

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

$servername = "imksv003\SQLEXPRESS";  
Member: LordGurke
LordGurke Oct 16, 2022 updated at 22:36:14 (UTC)
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.
Member: imkimkimk
imkimkimk Oct 17, 2022 at 05:24:52 (UTC)
Goto Top
geht leider auch nicht. sowohl servername\SQLEXPRESS also auch nur servername als auch servername\\SQLEXPRESS funktioniert nicht
Member: Spirit-of-Eli
Spirit-of-Eli Oct 17, 2022 at 05:30:00 (UTC)
Goto Top
Moin,

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

Gruß
Spirit
Member: imkimkimk
imkimkimk Oct 17, 2022 at 07:01:20 (UTC)
Goto Top
ja, von einem anderen PC und vom Webserver selbst aus klappt die Verbindung per SSMS auch.
Member: Looser27
Looser27 Oct 17, 2022 at 07:06:29 (UTC)
Goto Top
Moin,

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

GRuß

Looser
Member: vossi31
vossi31 Oct 17, 2022 at 07:20:38 (UTC)
Goto Top
Moin,

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

Henning
Member: NordicMike
NordicMike Oct 17, 2022 at 07:24:42 (UTC)
Goto Top
Das TCP Protokoll am SQL Server selbst ist doch per Default erst einmal deaktiviert. Wirde dieses Protokoll aktiviert?
Member: imkimkimk
imkimkimk Oct 17, 2022 at 07:35:30 (UTC)
Goto Top
Ja ist alles Freigegeben. Von anderen Remote PCs klappts ja face-smile
Member: imkimkimk
imkimkimk Oct 17, 2022 at 07:35:51 (UTC)
Goto Top
Habe alle Varianten versucht. Leider ohne Erfolg
Member: Looser27
Looser27 Oct 17, 2022 at 07:37:51 (UTC)
Goto Top
DNS-Auflösung klappt von allen PCs aus?
Member: NordicMike
NordicMike Oct 17, 2022 at 07:38:37 (UTC)
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.
Member: imkimkimk
imkimkimk Oct 17, 2022 at 08:02:06 (UTC)
Goto Top
ja DNS funktioniert
Member: imkimkimk
imkimkimk Oct 17, 2022 at 08:03:09 (UTC)
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
Member: Crusher79
Crusher79 Oct 17, 2022 updated at 08:50:12 (UTC)
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
Member: Crusher79
Crusher79 Oct 17, 2022 at 08:51:48 (UTC)
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);
Member: Crusher79
Crusher79 Oct 17, 2022 at 08:54:02 (UTC)
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.
Member: Crusher79
Crusher79 Oct 17, 2022 updated at 09:20:59 (UTC)
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.
Member: Spirit-of-Eli
Spirit-of-Eli Oct 17, 2022 at 09:30:26 (UTC)
Goto Top
@to klappt die Remoteverwaltung oder kannst du tatsächlich auf die DB von Remote zugreifen?
Member: em-pie
em-pie Oct 17, 2022 at 10:03:06 (UTC)
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
Member: imkimkimk
Solution imkimkimk Oct 17, 2022 at 10:39:57 (UTC)
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