0251 / 590 837 15
info@a-coding-project.de

Datenbanken in PHP verwenden

PHP bietet umfangreiche Werkzeuge für die Arbeit mit den unterschiedlichen Datenbanken von MySQL bis Oracle. Am beliebtesten ist die Kombination von PHP mit MySQL . Deshalb beziehen sich die folgenden Beispiele auch darauf. Bevor die Tabellen einer Datenbank bearbeitet werden können, sind 2 Schritte erforderlich: die Verbindung zum Datenbankserver und das Auswählen der Datenbank.

Datenbanken verbinden

Im ersten Schritt wird die Verbindung (Connection) zum Server aufgebaut, auf dem die Datenbank liegt. Dazu dient die Funktion mysql_connect(). Sie erwartet 3 Parameter:
- den Server (Host)
- den Benutzernamen
- das Passwort
Der Host kann als IP übergeben werden. Wenn man sie nicht kennt, kann man sie vorher mit getenv("REMOTE_ADDR") aus den Umgebungsvariablen ermitteln. Da die Datenbank sich meist auf dem gleichen Server befindet wie PHP , kann in diesem Fall auch 'localhost' verwendet werden. Wenn alle Argumente bekannt sind, kann die Verbindung hergestellt werden.

$dbserver = mysql_connect($host, $benutzer, $passwort);

Im Erfolgsfall gibt die Funktion eine Resource-Id zurück. Das kann überprüft werden:

if ($dbserver = mysql_connect($host, $benutzer, $passwort))
{
  // weiter
}
else
{
  // Abbruch
}

Wenn die Connection erfolgreich aufgebaut wurde, kann im 2. Schritt die Datenbank mit mysql_select_db bzw. mysql_query ausgewählt werden:

mysql_select_db('meinedatenbank', $dbserver);
//oder:
mysql_query('USE meinedatenbank');

Auch hier kann überprüft werden, ob der Schritt erfolgreich war:

<?php 
if ($dbserver = mysql_connect($host, $benutzer, $passwort))
{
 // die Verbindung zum Host ist hergestellt, weiter...
 if (mysql_select_db("test", $dbserver))
 {
  echo "Jetzt kann mit der Datenbank gearbeitet werden.<br>";
 }
 else
 {
  echo "Fehler: Die Datenbank konnte nicht angewählt werden.<br>";
 }
}
else
{
 echo "Fehler: Die Connection zum Server ist fehlgeschlagen.<br>";
}
?>

Bei Erfolg kann nun mit den Tabellen dieser Datenbank gearbeitet werden.

Daten abfragen

Ist die Connection zum Datenbankserver hergestellt und eine Datenbank geöffnet, können deren Tabellen gelesen und geschrieben werden (vorausgesetzt, der angemeldete Benutzer hat die entsprechenden Rechte). Der Zugriff auf die Daten erfolgt mit SQL. Die SQL-Anweisungen unterliegen den Regeln der Datenbank, auf die sie zugreifen, in unserem Fall MySQL , es sind also normale MySQL-Anweisungen.
Um Daten abzufragen, wird die Funktion mysql_query verwendet. Sie sendet eine SQL-Anweisung an den Datenbankserver und gibt anschließend die Resultatkennung zurück. Das Resultatkennung kann anschließend ausgewertet und die Daten der Abfrage ausgelesen werden. Beispiel:

$res = mysql_query('SELECT id, name FROM meinetabelle WHERE id > 3');
$num = mysql_num_rows($res);
for($i=0; $i<$num; $i++)
{
 $id = mysql_result($res,$i,'id');
 $name = mysql_result($res,$i,'name');
 echo 'ID: '.$id.'<br>Name: '.$name.'<br>';
}

Die Funktion mysql_num_rows ermittelt hierbei die Anzahl der im Resultat vorhandenen Zeilen. Mit mysql_result kann dann wiederum der entsprechende Wert ausgelesen werden. Dazu übergibt man zum einen die Resultatkennung (hier $res), sowie die Zeilennummer und den Namen der Spalte, deren Wert man erhalten möchte.

Daten einfügen und ändern

Ebenso wie beim Abfragen von Daten, wird auch zum einfügen neuer Daten bzw. beim Ändern, die Funktion mysql_query verwendet. Auch hier erhält man wiederum eine Resultatkennung, die allerdings keine Werte enthält (es wurde ja schließlich nichts abgefragt). Die Resultatkennung kann, dann dazu verwendet werden, um zu prüfen wieviele Zeilen eingefügt wurden oder wieviele Datensätze geändert wurden. Beispiel:

$res = mysql_query('UPDATE meinetabelle SET anzahl = anzahl+1'.
                   ' WHERE name = "Hans"');
if(mysql_affected_rows() == 0)
{
 mysql_query('INSERT INTO meinetabelle (name, anzahl) VALUES'.
             ' ("Hans",1)');
}

Im Beispiel wird ein typisches Konstrukt gezeigt, wie es üblicherweise bei Statistiken verwendet wird. Stellen wir uns dazu eine Tabelle mit 3 Spalten vor: ID (Primärschlüssel und auto_increment), Name und Anzahl. In der Tabelle soll z.B. gespeichert werden, wie oft welcher Benutzer eine bestimmte Aktion durchgeführt hat. Um dies schnellstmöglich zu bewerkstelligen, wird zunächst ein blindes Update gemacht und der Zähler erhöht. Konnte der Zähler nicht erhöht werden, weil der Benutzer z.B. noch nicht in der Tabelle existiert, gibt mysql_affected_rows() eine 0 aus (0 Zeilen wurden verändert). Anschließend wird reagiert und eine entsprechende neue Zeile eingefügt.

MySQL und MySQLi

Das MySQL i-Paket stellt eine Gruppe von Funktionen bereit, mit denen PHP 5 den erweiterten Funktionsumfang von MySQL ab der Version 4.1. nutzen kann. Um die MySQL i-Erweiterung zu aktivieren, müssen die entsprechenden Einträge zur Konfiguration geändert werden.
Die Erweiterungen betreffen vor allem die Transaktionsverarbeitung und die Objektorientierte Programmierung. Unter dem Namen "Bound Parameter Prepared Statements" wird z.B. die Möglichkeit bereitgestellt, ein SQL-Statement an den Server zu senden, bevor es mit allen Bestandteilen (z.B. in der where-Klausel) gefüllt ist. Das bringt dann Geschwindigkeitsvorteile, wenn eine Serie von ähnlichen SQL-Statements nacheinander abgesetzt werden soll, die sich nur in den Argumenten der where-Klausel unterscheiden, oder beim Einfügen einer Serie von Sätzen, wie im folgenden Beispiel:

<?php 
// Anmelden
$mysqli = new mysqli('localhost', 'user', 'password', 'world'); 

// Abbruch bei Fehlern
if (mysqli_connect_errno()) 

 echo "Fehler: Die Verbindung konnte nicht hergestellt werden. ".
      mysqli_connect_error(); 
 exit(); 


// Vorbereiten des SQL-Statements:
$stmt = $mysqli->prepare('INSERT INTO Preis '.
                         '(ArtikelNr, Farbe, Einkaufspreis) '.
                         'VALUES (?, ?, ?)'); 

// Deklarieren der Bind-Parameter, die nachher die 
// konkreten Werte aufnehmen
$stmt->bind_param('sssd', $ArtikelNr, $Farbe, $Einkaufspreis); 

// Bind-Parameter mit konkreten Werten belegen
$ArtikelNr = 3; 
$Farbe = 'grün'; 
$Einkaufspreis = 0.5; 

// Ausführen des vorbereiteten SQL-Statements 
$stmt->execute(); 

// Anzeige
echo $stmt->affected_rows . "Zeilen eingefügt"; 

// Statement schliessen 
$stmt->close(); 

// Verbindung beenden  
$mysqli->close(); 
?>

Funktionen aus dem mysql_-Paket sind im mysqli_-Paket grundsätzlich auch vorhanden, nur dass sie hier mit "mysqli_" beginnen. Wenn man also mysqli nutzt, muss man im PHP-Skript nur mysql_ durch mysqli_ ersetzen, damit der Quellcode weiter lauffähig ist. Um das Leistungsvermögen von mysqli auch zu nutzen, kann man dann gezielt den Code an bestimmten Stellen ändern.