Hallo
Hat hier jemand Erfahrungen damit, von PHP aus Kontakt zu einem MS-SQL-Server aufzunehmen?
Ich habe in einer VM mit Ubuntu 18.04 den Apachen (2.4) und PHP 7.2 mit der MS-SQL-Bibliothek zuzüglich unixodbc installiert und will von dort aus einen MS-SQL-Server auf einer anderen VM (Windows Server 2016) im selben lokalen Netz ansprechen. Der Server ist allerdings mit der Funktion sqlsrv_connect
mit dem von MS stammenden Beispielcode nicht erreichbar.
Gekürzter Beispielcode:
#$serverName = "DBSERVER1/SQLEXPRESS";
#$serverName = "192.168.1.5\\SQLEXPRESS";
$serverName = "DBSERVER1\\SQLEXPRESS";
$connectionOptions = array(
"Database" => "TestDB",
"UID" => "Benutzer",
"PWD" => "passwort",
"LoginTimeout" => 3
);
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
die(formatErrors(sqlsrv_errors()));
} else {
echo "<p>Connection established.</p>\n";
}
/*
* irrelevanter und bei mir auch auskommentierter Code für die Testabfrage
*/
sqlsrv_close($conn);
function formatErrors($errors) {
// Display errors
echo "<section>\n";
echo " <h2>Error information</h2>\n";
echo " <ul>\n";
foreach ($errors as $error) {
echo " <li>";
echo "SQLSTATE: ". $error['SQLSTATE'] . "<br/>";
echo "Code: ". $error['code'] . "<br/>";
echo "Message: ". $error['message'] . "<br/>";
echo "</li>\n";
}
echo " </ul>\n";
echo "</section>";
}
Fehlermeldung:
SQLSTATE: HYT00
Code: 0
Message: [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired
SQLSTATE: 08001
Code: 11002
Message: [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x2AFA
SQLSTATE: 08001
Code: 11002
Message: [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
Wie die verschiedenen Versionen von $serverName
zeigen, habe ich einige Schreibweisen [1], die ich im Internet gefunden habe, ausprobiert. Wie die Meldung zeigt, wird der Server mit keiner der Schreibweisen gefunden. Mit den selben Zugangsdaten kann ich von jedem Windows-Rechner [2] in unserem Netz aus per ODBC-Verbindung den Server erreichen. Alle Diskussionen, die im Internet dazu finde, gehen entweder von einer Windows-Windows-Kombination oder einem Linux-Server aus, auf dem sowohl der Webserver mit PHP als auch der MS-SQL-Server auf der selben (virtuellen) Maschine läuft.
Laut php.ini sind die INIs der MS-eigenen Bibliotheken eingebunden.
… /etc/php/7.2/apache2/conf.d/20-sqlsrv.ini, … /etc/php/7.2/apache2/conf.d/30-pdo_sqlsrv.ini
pdo_sqlsrv
|pdo_sqlsrv support|enabled |---| |ExtensionVer|5.3.0
|Directive|Local Value|Master Value |---| |pdo_sqlsrv.client_buffer_max_kb_size|10240|10240 |pdo_sqlsrv.log_severity|0|0
sqlsrv
|sqlsrv support|enabled |---| |ExtensionVer|5.3.0
|Directive|Local Value|Master Value |---| |sqlsrv.ClientBufferMaxKBSize|10240|10240 |sqlsrv.LogSeverity|0|0 |sqlsrv.LogSubsystems|0|0 |sqlsrv.WarningsReturnAsErrors|On|On
Muss auf der Ubuntu-Installation noch irgendwas konfiguriert werden?
Mit dem folgenden Code im selben Skript lautet die Ausgabe übrigens „Server erreichbar.“. Der mit „DBSERVER1“ ist auf dem Standardport von MS-SQL also grundsätzlich erreichbar.
$ping['host'] = 'DBSERVER1';
$ping['port'] = 1433; # Standardport des MS-SQL-Servers
$ping['timeout'] = 3;
if ($fp = fsockopen($ping['host'], $ping['port'], $errCode, $errStr, $ping['timeout'])){
$errors[] = 'Server erreichbar.';
} else {
$errors[] = 'Server ist nicht erreichbar. ' . $errCode . ' (' . $errStr . ')';
}
fclose($fp);
Tschö, Auge
Eine Kerze stand [auf dem Abort] bereit, und der Almanach des vergangenen Jahres hing an einer Schnur. Die Herausgeber kannten ihre Leser und druckten den Almanach auf weiches, dünnes Papier.
Kleine freie Männer von Terry Pratchett