Ich   Entwicklung   Lösungen Apache PHP mySQL  
 

mySQL-Funktionen von PHP

Installation / Verbindung zwischen PHP und MySQL

Im Gegensatz zu PHP 4 besitzt PHP 5 keine einkompilierte Unterstützung mehr für MySQL. Das klingt im ersten Moment negativ, hat aber viele Vorteile, wenn man sich erst einmal die Mühe gemacht hat, die Verbindung zwischen PHP und MySQL herzustellen.

  • Es gab lange Zeit Konflikte zwischen verschiedenen Versionen von PHP und MySQL, da inkompatible Typen der client library libmysql.dll genutzt wurden. PHP nutzt nämlich außer der nötigen Extension (php_mysql.dll) auch die von MySQL gelieferte libmysql.dll, die aber bei PHP 4 nicht immer auf dem neuesten Stand ist. Die mit PHP 5 mitgelieferte Version ist recht aktuell, kann aber eben durch die bei MySQL mitgelieferte Datei ersetzt werden (s.u.).

    Beispiel: versuchen Sie, mit einem PHP 4 auf MySQL 4.1 zuzugreifen, werden Sie wahrscheinlich Probleme bekommen. MySQL 4.1 nutzt eine neue Passwort-Funktion und ein neues Kommunikations-Protokoll, siehe http://dev.mysql.com/doc/mysql/en/password-hashing.html. Das führt dazu, dass Sie sich nicht bei MySQL anmelden können, weil Ihr Passwort nicht erkannt wird (Access denied for user ...).
    Lösung: legen Sie einen Benutzer an, für den Sie bei der Erzeugung die Passwort-Funktion OLD_PASSWORT(string) benutzen. Die alten MySQL-Clients können jetzt diesen Benutzer zur Anmeldung nutzen.

    Wie an anderer Stelle erwähnt empfehle ich dringend, MySQL 4.1 mit PHP 5 einzusetzen. Besorgen Sie sich die aktuellsten Versionen! Falls Sie lieber MySQL 3.23 nutzen möchten, benutzen Sie PHP 4!

  • PHP 5 unterstützt dank der Extension php_mysqli.dll auch die neuen MySQLi-Funktionen, die eine bessere Unterstützung für die neuen Funktionen von MySQL 4.1.3 und objektorientiertes Programmieren bieten.
  • Durch die Trennung zwischen MySQL- und MySQLi-Funktionen ist es möglich, weiterhin mit älteren MySQL-Versionen zu arbeiten, ohne auf die neuen Funktionen von 4.1 und später verzichten zu müssen.

Aus Kompabilitätsgründen zu älteren PHP-Skripten würde ich immer auch die normalen MySQL-Funktionen aktivieren. Um die neuen MySQLi-Funktionen auch nutzen zu können, kann man beide Extensions installieren, wobei dann beide die selbe client library nutzen müssen, was aber kein Problem sein sollte (mir ist zumindest noch keines ein- und aufgefallen).

Um PHP mit den MySQL- und MySQLi-Funktionen auszustatten, gehen Sie wie folgt vor:

  1. Stellen Sie sicher, dass in der php.ini der richtige Pfad zu den Dateien php_mysql.dll und php_mysqli.dll angegeben ist. Suchen Sie dazu den Eintrag extension_dir und geben Sie dort den Pfad zu Ihren Extensions an. Bei PHP 5 liegen diese im Unterverzeichnis /ext/, d.h. der Eintrag sollte ungefähr wie folgt aussehen:
    extension_dir = "c:\server\php\ext\"
  2. Aktivieren Sie die beiden Extensions php_mysql.dll und php_mysqli.dll; suchen Sie dazu den Unterbereich Dynamic Extensions und dort speziell nach php_mysql.dll und php_mysqli.dll. Bei der von mir verwendeten PHP-Version 5.0.3 war die MySQL-Extension auskommentiert, die MySQLi-Extension war gar nicht erhalten. Sorgen Sie dafür, dass die folgenden beiden Einträge vorhanden sind:
    extension=php_mysql.dll
    extension=php_mysqli.dll
  3. Kopieren Sie die Datei libmysql.dll (aus dem PHP-Installationsverzeichnis oder dem /bin/-Verzeichnis von MySQL) in Ihr Windows-Systemverzeichnis (C:\Windows\System32\ o.ä.). Dies ist die client library, welche einer Software die Client-Funktionen von MySQL zur Verfügung stellt.

Schließlich müssen Sie sich nur noch überlegen, ob Sie die MySQL- oder die MySQLi-Funktionen nutzen möchten. Momentan (März 2005) muss ich Ihnen noch empfehlen, nur MySQL-Funktionen zu nutzen, denn nur die wenigsten Provider bieten schon PHP 5, MySQL 4.1 und die neuen MySQLi-Funktionen an. Selbst im PHP Manual wird betont, dass die neuen MySQLi-Funktionen noch als experimentell angesehen werden sollten.
Richten Sie natürlich Ihr eigenes Produktivsystem selbst ein, oder sind sich sicher, dass Sie zukünftig keine Kompabilität mehr benötigen, dann nutzen Sie die besseren MySQLi-Funktionen.

Ich werde auf dieser Seite die gleiche kurze Einführung in die MySQL betreffenden PHP-Funktionen geben wie auf der Seite MySQL 3.23 mit PHP 4, nur mit den MySQLi- statt der MySQL-Funktionen. Falls Sie (was ich für 2005 noch empfehle) noch die MySQL-Funktionen nutzen möchten, wechseln Sie einfach zur Seite MySQL 3.23 mit PHP 4 und lesen dort weiter!

Ich werde auf dieser Seite nicht auf die objektorierntierten Versionen der Funktionen ein, um die beiden Seiten zu PHP 4 und PHP 5 vergleichbar zu halten.

Verbindung zum Datenbank-Server herstellen

Mit der Funktion mysqli_connect() müssen Sie eine Verbindung zu mySQL herstellen, bevor Sie weitere Operationen durchführen können.

mysqli mysqli_connect (
    [string host
    [, string username
    [, string passwd
    [, string dbname
    [, int port
    [, string socket]]]]]] );

Die Funktion gibt ein Objekt als Platzhalter für die Verbindung zurück. Dieses können wir in einer Variable speichern, oder überprüfen, ob die Verbindung exisitert. Denn falls die Verbindung fehlschlägt, wird false zurück gegeben.

Während bei mysql_connect() (ohne i) keine Datenbank angegeben wurde, um dann bei bestehender Verbindung mit mysql_select_db() eine Datenbank zu wählen, soll dieses Verhalten hier verändert werden. Es ist zwar weiterhin möglich, mit mysqli_select_db() die Datenbank auszuwählen, dass PHP Manual sagt aber klar, dass die Auswahl der Datenbank jetzt schon bei der Herstellung der Verbindung erfolgen soll. Geben Sie dafür als Parameter dbname den Namen der gewünschten Datenbank an.

Den Parameter port sollten Sie nur angeben, wenn Sie bei der Konfiguration von MySQL nicht den Standardport (3306) gewählt haben. Dies scheint besser gelöst zu sein als bei mysql_connect(), wo man stattdessen den Port beim Host mit angeben musste (z.B. localhost:3306).

Als Beispiel wollen wir Verbindung zu unserem lokal installierten mySQL-Server aufnehmen:

$link = mysqli_connect ( "localhost" , "root" , "test", "versuch" );

Wenn Sie Benutzername und Passwort geändert haben, müssen Sie Ihre Zugangsdaten entsprechend ändern.

Da $link den Wert false besitzt, wenn keine Verbindung hergestellt werden konnte, können wir das ausnutzen, um die Ausführung eines Skriptes abzubrechen, wenn die Datenbankverbindung unbedingt notwendig ist:

if(!($link = mysqli_connect ( "localhost" , "root" , "test", "versuch" ))) {
    die("Keine Verbindung zur Datenbank.");
}

Eleganter geht das, indem man ausnutzt, dass bei einer OR-Verknüpfung der zweite Ausdruck nicht überprüft wird, wenn der erste true ist:

$link = mysqli_connect ( "localhost" , "root" , "test", "versuch" )
        || die("Keine Verbindung zur Datenbank.");

Einen SQL-Query absetzen

Mit der Funktion mysqli_query() können Sie normale SQL-Queries an mySQL senden:

mysqli_query($link, "UPDATE kontakte SET website='intermitto.net' WHERE website=''");

Hier ist die oben geöffnete Verbindung der erste Parameter, im Gegensatz zu mysql_query(). Bei mysqli_query() kann dieser Parameter nicht mehr weggelassen werden!

Die Funktion gibt im Normalfall einen booleschen Wert zurück, der angibt, ob das Query ausgeführt werden konnte. Dies können wir ausnutzen, um zu überprüfen, ob alles wie gewünscht funktioniert hat:

if( mysqli_query($link, "UPDATE kontakte SET website='intermitto.net' WHERE website=''")) {
    echo "Erfolgreiches UPDATE.";
} else {
    echo "UPDATE gescheitert.";
}

Bei SELECT-Queries (ebenso bei SHOW, DESCRIBE und EXPLAIN) wird statt eines booleschen Wertes ein Ressourcen-Verweis zurückgegeben, über den das Ergebnis der Abfrage später abgerufen werden kann:

$ergebnis = mysqli_query($link, "SELECT * FROM kontakte");
Hinweis

mysqli_query() hat eigentlich einen dritten Parameter, der angibt, ob man direkt auf den (ungepufferten) Ergebnissen operieren möchte, oder aber die Ergebnisse puffern möchte. Standardeinstellung ist die gepufferte Alternative, die zu empfehlen ist.

Allerdings empfehle ich dann wirklich dringend, größere Ergebnisse mit mysqli_free_result() aus dem Puffer zu löschen, sobald diese nicht mehr benötigt werden.

Ergebnisse aus SELECTs auswerten

Nun wird echo $ergebnis; nicht dazu führen, dass die Ergebnisse angezeigt werden; $ergebnis ist lediglich ein Verweis, die Ausgabe wäre etwas wie Resource id #3. Um die Daten aus diesem Verweis zu lesen oder auf den Ergebnissen zu operieren gibt es verschiedene Funktionen. Ich führe hier die Funktion mysqli_fetch_assoc() vor.

mysqli_fetch_assoc() holt einen Datensatz aus dem Ergebnis und gibt ein assoziatives Array mit den Spaltenwerten zurück.

Ein vollständiges Beispiel: die Tabelle kontakte habe die Spalten id, name, mail und website.

$ergebnis = mysqli_query($link, "SELECT * FROM kontakte");
$daten = mysqli_fetch_assoc($ergebnis);
echo "<br />Name: ".$daten["name"];
echo "<br />Mail: ".$daten["mail"];
echo "<br />website: ".$daten["website"];

Was ist aber, wenn mehrere Datensätze gefunden werden (was ja normal ist) und Sie alle Datensätze anzeigen möchten? Das ist sehr einfach; mysql_fetch_assoc() holt immer den nächsten Datensatz aus dem Ergebnis. Wir können ausnutzen, dass mysql_fetch_assoc() den Wert false zurückgibt, wenn kein Datensatz mehr vorhanden ist:

$ergebnis = mysqli_query($link, "SELECT * FROM kontakte");
while($daten = mysqli_fetch_assoc($ergebnis)) {
    echo "<p>Datensatz: ".$daten["id"];
    echo "<br />Name: ".$daten["name"];
    echo "<br />Mail: ".$daten["mail"];
    echo "<br />Website: ".$daten["website"];
    echo "</p>";
}
Zusatzinfo

Mehr Informationen zu den MySQLi-Funktionen finden Sie im PHP Manual. Auf http://www.php.net/manual/de/ref.mysqli.php finden Sie einen Überblick über alle MySQLi-Funktionen und Links zu Detailbeschreibungen.

phpMyAdmin: Installation weiter

URL: www.intermitto.net/mysql/php/neu/?PHPSESSID=1c93db4ea2ed350e02c21751eb03c35c
© 2004-05 Jens Becker - intermitto.net v5.1
Letzte Änderung: 23.08.2005

Home - Kontaktformular - Downloads - Suche und Sitemap - Impressum
Entwicklung - Problemlösungen - Tutorials: Apache PHP mySQL

user  pass