69304
Goto Top

Von Linux Server auf MS Server mit mssql connecten Unable to connect

Hallo!

Erstmal folgendes Szenario:

- Windows Server 2003 mit SQL Server 2000 installiert
- Linux Ubuntu Server 9.10 mit XAMPP 1.7.2 installiert


Auf dem MS-Server ist die Datenbank, auf die zugegriffen werden soll vorhanden.

Da ich aber auf dem Linux Server keinen ODBC-Connector wie unter Windows erstellen kann, will ich eine Abfrage über folgendes Skript machen:

<?php
$myServer = "192.168.101.2";  
$myUser = "sa";  
$myPass = "*****";  
$myDB = "*****";  
$dbhandle = mssql_connect($myServer, $myUser, $myPass) or die("Couldn't connect to SQL Server on $myServer");  
$selected = mssql_select_db($myDB, $dbhandle) or die("Couldn't open database $myDB");  
$query = "SELECT * FROM STOERUNGEN WHERE StoerungsNr LIKE '2009460086'";  
$result = mssql_query($query);
while($row = mssql_fetch_array($result))
{
  echo "<li>" . $row["StoerungsNr"] . $row["Firma"] . "</li>";  
}
mssql_close($dbhandle);
?>


Als Antwort in Browser erhalte ich folgende Meldung:

Warning: mssql_connect() [function.mssql-connect]: Unable to connect to server: 192.168.101.2 in /opt/lampp/htdocs/stoerungen/index.php on line 6
Couldn't connect to SQL Server on 192.168.101.2  


Was kann man hier machen? Erreichen kann ich den Windows Server - Ping erfolgreich! Und von meinem Client mit XAMPP für Windows und einem System-ODBC-Connector funktioniert es tadellos....

Bin schon echt am verzweifeln! Mit der ADODB-Klasse bekomme ich an sich die selbe Fehlermeldung...

Content-Key: 130947

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

Printed on: May 5, 2024 at 01:05 o'clock

Member: Dani
Dani Dec 04, 2009 at 10:00:59 (UTC)
Goto Top
Moin,
wenn ich mich richtig erinnere, musst du wie bei MySQL erstmal die Einstellungen der MSSQL DB anpassen. Denn standardmäßig darf man nicht von extern (Standard: localhost) auf die DB zugreifen. Danach muss der User evtl. angepasst werden. Leider habe ich grad keine MSSQL zur Hand.


Grüße,
Dani
Mitglied: 69304
69304 Dec 04, 2009 at 10:25:35 (UTC)
Goto Top
Hallo Dani!

Danke erstmal für die schnelle Antwort!

Auf diese Idee bin ich auch schon gekommen, aber habe es ausgeschlossen, da der Zugriff von meiner Workstation (Win XP - selbes Skript) ja funktioniert.

Gut ok, ich weiß jetzt zwar nicht, in wie weit der System-Connector sich da einmischt, aber da funktioniert es!?!
Member: Gilneas
Gilneas Dec 04, 2009 at 10:40:20 (UTC)
Goto Top
Hast du mal versucht den Instanznamen deines SQL-Servers mit anzugeben?
192.168.101.2\Instanzname
Mitglied: 69304
69304 Dec 04, 2009 at 10:56:00 (UTC)
Goto Top
Da ich leider den Instanzname nicht kenne (Wo bekomme ich den her?), habe ich den Standartnamen "192.168.101.2\MSSQLSERVER" verwendet.

Dies bringt aber auch keine Lösung. Selber Fehler.

Kann das vielleicht mit der Domäne zusammen hängen? Da meine Workstation in der Domäne hängt, und der Linux Server nicht?!?


EDIT:

Habe ihn jetzt per Samba in die Domäne integriert. Bringt aber leider auch nichts...
Mitglied: 32067
32067 Dec 04, 2009 at 11:45:30 (UTC)
Goto Top
Hallo,

- die PHP Anleitung meint man muss unter Linux die freetds-lib installiert haben, auf die greift php zurück ( http://www.php.net/manual/de/mssql.requirements.php ). Ist die drauf ? (ok, ich würde dann eigentlich auch eine andere Fehlermeldung erwarten).

- Die SQL-Authentisierung an ? Wenn nur Windows-Auth angeschaltet wird das nix mit sa als User.

- TCP als Protokoll im SQL-Server aktiviert ? Mit Named Pipes wird man nix von Linux aus meine ich.

- Geht ein "telnet <db-server> 1433" vom Linux-Rechner ? Das ist der Standard TCP/IP Port von MS SQL.

Mehr fällt mir jetzt erstmal nicht ein face-smile
Mitglied: 69304
69304 Dec 04, 2009 at 12:01:59 (UTC)
Goto Top
Hallo!

- Die FreeTDS habe ich nachinstalliert, XAMPP neu gestartet - selber Fehler. Muss man dies noch irgendwie in die php.ini integrieren?

- SQL-Auth steht auf "SQL und Windows" (Anmerkung: Von der Windows-Workstation geht das Skript)

- TCP als Protokoll? TCP/IP-Protokoll ist logischerweise aktiviert, oder meinst du was anderes damit?!?

- Telnet funktioniert.

-.-


EDIT:

Testweise Anmeldung im Skript als Domänen-Admin - auch leider erfolglos...
Member: Gilneas
Gilneas Dec 04, 2009 at 12:24:05 (UTC)
Goto Top
Vielleicht hilft es weiter, wenn du mit der Funktion "mssql_get_last_message" die letzte Meldung des Server zurückgeben lässt. Evtl. hilft das bei der Fehlersuche weiter, wenn der Server einen Grund für den reject angibt.

Link: http://php.net/manual/de/function.mssql-get-last-message.php


Zum Thema Instanzname:
SQL Server Instance Name :


In SQL Server Management Studio->RegisterServers->double click your server to open the Object Explorer -> right click to select the properties window ->General Tab - to see the ServerName (instance name)

 

or Open a new query in SQL Server Management window  and execute the following

-- to get the sql server instance name

select @@ServerName  
Mitglied: 69304
69304 Dec 04, 2009 at 12:35:23 (UTC)
Goto Top
Als Name wird mir da "(local)" angezeigt - ist dies möglich?

---

Ich habe nun 2 Skripte gemacht. Eins, was per mssql_connect verbindet und das zweiter, dass per ADODB verbinden soll.


Das ADOBD-Skript:

<?php
define("SQL_HOST", "192.168.101.2");  
define("SQL_USER", "sa");  
define("SQL_PASS", "+++");  
define("SQL_DB", "+++");  

include('adodb5/adodb.inc.php');  

$db =& ADONewConnection('odbc_mssql');  
$dsn = "Driver={SQL Server};Server=".SQL_HOST.";Database=".SQL_DB.";";  
$db->Connect($dsn,SQL_USER,SQL_PASS);

$recordSet = &$db->Execute("SELECT StoerungsNr, Firma FROM STOERUNGEN WHERE StoerungsNr LIKE '2009460086'");  

if(!$recordSet) {
	print $db->ErrorMsg();
} else {
	while(!$recordSet->EOF) {
		print '<li>' . $recordSet->fields . ' - ' . $recordSet->fields[1].'</li>';  
		$recordSet->MoveNext();
	}
}

$recordSet->Close();
$db->Close();
?>

Rückmeldung:

Notice: Use of undefined constant ODBC_BINMODE_RETURN - assumed 'ODBC_BINMODE_RETURN' in /opt/lampp/htdocs/stoerungen/adodb5/adodb.inc.php on line 4230  

Notice: Use of undefined constant SQL_CUR_USE_DRIVER - assumed 'SQL_CUR_USE_DRIVER' in /opt/lampp/htdocs/stoerungen/adodb5/adodb.inc.php on line 4230  

Strict Standards: Only variables should be assigned by reference in /opt/lampp/htdocs/stoerungen/index_adodb.php on line 9


Das mssql-Skript:

<?php
define("SQL_HOST", "192.168.101.2");  
define("SQL_USER", "sa");  
define("SQL_PASS", "+++");  
define("SQL_DB", "+++");  

$dbhandle = mssql_connect(SQL_HOST, SQL_USER, SQL_PASS) or die('<p><b>Konnte keine Verbindung zu "'.SQL_HOST.'" herstellen!</b></p>');  
$selected = mssql_select_db(SQL_DB, $dbhandle) or die('<p><b>Konnte Datenbank "'.SQL_DB.'" nicht &ouml;ffnen!</b></p>');  

$query = "SELECT * FROM STOERUNGEN WHERE StoerungsNr LIKE '2009460086'";  
$result = mssql_query($query);

while($row = mssql_fetch_array($result))
{
  echo "<li>" . $row["StoerungsNr"] . " - " . $row["Firma"] . "</li>";  
}

mssql_close($dbhandle);
?>

Rückmeldung:

Warning: mssql_connect() [function.mssql-connect]: Unable to connect to server: 192.168.101.2 in /opt/lampp/htdocs/stoerungen/index_mssql.php on line 7

Konnte keine Verbindung zu "192.168.101.2" herstellen!  


Interessant wäre zu erwähnen, dass beide Skripte von der Windows-Workstation mit XAMPP funktionieren!
Member: Gilneas
Gilneas Dec 09, 2009 at 07:55:36 (UTC)
Goto Top
Was liefert denn nun mssql_get_last_message zurück?

Strict Standards: Only variables should be assigned by reference in /opt/lampp/htdocs/stoerungen/index_adodb.php on line 9

Und hier scheint es, als dürftest du diesen Aufruf nicht als Referenz anlegen:
$db =& ADONewConnection('odbc_mssql');  


Trotz allem liegt das Problem wohl noch etwas früher, beim Verbindungsaufbau.
Und (Local) als Ergebnis für den Instanznamen finde ich etwas seltsam. Du solltest zumindest den Computernamen des Servers rausbekommen.

Was mir noch einfällt:
Welchen Authentifizierungstyp verwendest du? - Wenn du Windows Authentifizierung verwendest, dann würde das erklären, warum der Linux Client nicht drauf kommt...
Und du könntest mal in den Serverlogs nachsehen, ob da Einträge gemacht werden, evtl. steht ja was dabei.