Aus der Kategorie "warum einfach, wenn's auch kompliziert geht" hatte ich versucht, irgendwie via ODBC von einem Ubuntu-Server auf eine MS-SQL-Datenbank zuzugreifen. Was man dazu im Internet an (verschiedenen!) Anleitungen findet, ist faszinierend.
Nach etwas Trial und ziemlich viel Error musste ich festellen, dass es auch ganz einfach geht und es kein ODBC benötigt, wenn ich von PHP aus auf eine MS-SQL-Datenbank zugreifen möchte.
Zum Glück bin ich irgendwann auf eine offizielle Anleitung von Microsoft gestoßen, die erklärt, wie man die PHP-Bibliothek sqlsrv installiert. Und das war's dann eigentlich auch schon, was man benötigt.
Um Microsofts Anweisung folgenden zu können, benötigt man das Kommando pecl, mit welchem man PHP-Erweiterungen installieren kann. War in meinem Fall noch nicht vorhanden.
sudo apt-get install php-dev
Und nun sqlsrv installieren und aktivieren.
Hierbei ist zu beachten, dass die PHP-Version (bzw das entsprechende Verzeichnis) in den letzten 4 Zeilen ggf. auf das tatsächlich vorhandene angepasst werden muss.
sudo pecl install pdo_sqlsrv
sudo su
# Ggf. 7.4 durch die korrekte PHP-Version ersetzen
printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/7.4/mods-available/sqlsrv.ini
printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/7.4/mods-available/pdo_sqlsrv.ini
exit
sudo phpenmod -v 7.4 sqlsrv pdo_sqlsrv
Auch ein Teil von Microsofts Anweisung, hatte bei mir allerdings nichts gebracht, da Apache bereits installiert war.
apt-get install libapache2-mod-php7.4 apache2
a2dismod mpm_event
a2enmod mpm_prefork
a2enmod php7.4
exit
So oder so Apache nun neustarten.
sudo service apache2 restart
Beispiels-PHP-Code zum testen:
In meinem Fall hatte es nicht ausgereicht, als $serverName nur die IP (!) des Servers einzutragen, ich musste noch einen bestimmten Instanz-Namen recherchieren, unter welchem die Datenbank anzusprechen war.
In den meisten Fällen könnte es ausreichen, nur die IP anzusprechen, z.B. $serverName = "192.168.178.99";
$serverName = "yourServer\\Instanz";
$connectionOptions = array(
"database" => "yourDatabase",
"uid" => "yourUsername",
"pwd" => "yourPassword"
);
// Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
die(formatErrors(sqlsrv_errors()));
}
// 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()));
}
?>
<h1> Results : </h1>
<?php
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo $row['SQL_VERSION'] . PHP_EOL;
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
function formatErrors($errors)
{
// Display errors
echo "Error information: <br/>";
foreach ($errors as $error) {
echo "SQLSTATE: ". $error['SQLSTATE'] . "<br/>";
echo "Code: ". $error['code'] . "<br/>";
echo "Message: ". $error['message'] . "<br/>";
}
}
?>
Erstellt am: 03.02.2020 | .Kommentieren |