sqlsrv_connect von Ubuntu aus zu einem MS-SQL-Server auf Windows Server 2016
bearbeitet von AugeHallo
> > Hat hier jemand Erfahrungen damit, von PHP aus Kontakt zu einem MS-SQL-Server aufzunehmen?
>
> Das geht auf drei Weisen: Named Pipes, Shared Memory und TCP/IP.
Soweit, so klar. Alle drei Protokolle sind in der MS-SQL-Server-Konfiguration aktiviert.
> … Named Pipes gehen wohl auch übergreifend. Die Schreibweisen mit Instance-Namen dürften auch nur in der Windows-Welt gehen.
So hatte ich das über die Jahre hinweg auch hier und dort gelesen, aber in den Codebeispielen für die PHP-Lib wurde das oft ohne die übliche Warnung vor Einschränkungen auf bestimmte OS gezeigt. Also habe ich das „der Vollständigkeit halber“ auch ausprobiert.
> Für anderweitige Verbindungen ist TCP/IP möglich. Das muss so konfiguriert sein, dass der Port, der verwendet werden soll, auch auf eine konkrete Instanz konfiguriert werden muss. Man kann ja mehrere Instanzen auf einem Server laufen lassen, braucht dafür dann aber je einen eigenen Port.
Gut, wir haben auf der fraglichen VM nur den einen SQL-Server zu laufen. Das ist ja kein Multifunktions-Server™️, auf dem -zig Dienste laufen, die alle jeweils ihre eigene SQLEXPRESS-Instanz installieren.
> Man verbindet sich dann nur zu dieser IP plus Port, ohne Instanznamen. Der ist in dem Fall gar nicht mehr von Belang.
Das war's! Nur mit der IP, selbst ohne Angabe des Ports [^1], kann ich die Verbindung herstellen. … Nächte Hürde genommen, danke.
Testcode:
~~~PHP
#$serverName = "192.168.1.5, 1433";
$serverName = "192.168.1.5";
$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";
}
// Select Query
$tsql = "SELECT @@Version AS SQL_VERSION";
// Executes the query
$stmt = sqlsrv_query($conn, $tsql);
// Error handling
if ($stmt === false) {
die(formatErrors(sqlsrv_errors()));
}
echo "<section>" . PHP_EOL;
echo " <h2>Results</h2>" . PHP_EOL;
echo " <ul>" . PHP_EOL;
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo " <li>". $row['SQL_VERSION'] . "</li>" . PHP_EOL;
}
echo " </ul>" . PHP_EOL;
echo "</section>" . PHP_EOL;
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
function formatErrors($errors) {
// Display errors
echo "<section>" . PHP_EOL;
echo " <h2>Error information</h2>" . PHP_EOL;
echo " <ul>" . PHP_EOL;
foreach ($errors as $error) {
echo " <li>";
echo "SQLSTATE: ". $error['SQLSTATE'] . "<br/>";
echo "Code: ". $error['code'] . "<br/>";
echo "Message: ". $error['message'] . "<br/>";
echo "</li>" . PHP_EOL;
}
echo " </ul>" . PHP_EOL;
echo "</section>" . PHP_EOL;
}
~~~
Ausgabe:
~~~
Connection established.
Results
Microsoft SQL Server 2017 (RTM) …
~~~
Tschö, Auge
[^1]: Wie bereits geschrieben, verwenden wir dynamische Portzuweisung. Bei einem festgelegten Port muss dieser auch angegeben werden (siehe Beispielcode).
--
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