[druckfreundliche Version]
Hauptseite   Impressum   

Einführung in die Verwendung von php3 zusammen mit mysql

php eine Scriptsprache für das Netz gewinnt immer mehr Anhänger und hat --- zumindest für mich --- Perl als Scriptsprache der Wahl für automatisch generierte und interaktive Webseiten abgelöst.

PHP ist eine vollständige Programmiersprache, die man bequem in HTML-Dokumente einbetten kann. Zwar kann php nichts, was man nicht auch mit anderen Programmiersprachen per CGI erreichen kann, aber typische Web-Anwendungen sind mit php einfacher und eleganter zu implementieren als mit anderen mir geläufigen Sprachen.

PHP bietet --- gewissermaßen serienmäßig --- Anbindungen an verschiedene Datenbanksysteme, die Anbindung an MySQL ist dabei sicherlich die populärste.

Schauen wir uns einfach ein kleines Beispiel --- eine simplifizierte Adressverwaltung --- an.

--

Da wir es ja mit dynamischen Inhalten zu tun haben ist es schon 'mal keine schlechte Idee Browser und Proxies darauf hinzuweisen, daß sie unsere Seite(n) nicht zwischenspeichern sollen, sondern sich den Inhalt immer frisch vom Server besorgen sollen.

<?
   header( "Cache-Control: no-cache, must-revalitate");
   header( "Pragma: no-cache");
?>

php bietet für solche HTTP-Hinweise die Funktion header(), die sich z.B. auch dafür eignet eine Weiterleitung einzurichten header("Location: http://blindschleiche.de"). Die Header Funktion muß allerdings aufgerufen werden, bevor irgendetwas anderes der Seite vom Server ausgeliefert worden ist. Hier muß man insbesondere aufpassen, daß man nicht vor dem ersten php3-Codeblock z.B. Leerzeichen oder Zeilenumbrüche in der Datei hat.

--

Ein gültiger HTML-Header für unser Programm kann eigentlich auch nicht schaden.

<html>
  <head>
    <title>Adressverwaltung</title>
<!-- Changed by: Martin Glinski, 08-Mar-2000 -->
  </head>
  <body>
--

Jetzt vereinbaren wir erst einmal ein paar Variablen, die wir später im Programm noch gut brauchen können.

<?
$dbuser =  "root";
$dbpasswd =  "";
$db =  "test";
$tabelle =  "adressen";
$tabelle_anlegen = "
CREATE TABLE $tabelle (
  id int(10) NOT NULL auto_increment,
  name varchar(255),
  strasse varchar(255),
  plz char(12),
  stadt varchar(255),
  PRIMARY KEY (id)
)"
;
?>

Mit $dbuser, $dbpasswd, $db und $tabelle legen wir fest, unter welchem Benutzer mit welchem Passwort auf welche Tabelle in welcher Datenbank wir zugreifen wollen.

Dazu ist natürlich zu sagen, daß es prinzipiell keine gute Idee ist Passwörter direkt in einer Datei abzulegen, die über das Internet problemlos abrufbar ist. Liegt einmal eine Fehlkonfiguration des Webservers vor, so kann es durchaus vorkommen, daß der php-Code im Klartext ausgeliefert wird anstatt interpretiert zu werden. Passwörter sollte man immer außerhalb des Webtrees abspeichern und dann per include(/wo/sind/die/passwoerter) in das eigentliche Programm einbinden. Gibt es jetzt ein Fehlverhalten und der Webserver liefert die Datei im Klartext aus, so sieht ein potentieller Einbrecher zwar wo vermutlich unsere Passwörter abgespeichert sind, aber er kommt nicht ohne weiteres an diese Datei heran, da sie ja außerhalb des direkt über den Webserver ansprechbaren Bereiches liegt.

--

Jetzt bauen wir eine Verbindung zur Datenbank auf, die wir vermutlich sowieso gleich benötigen.

<?
mysql_connect( "localhost", $dbuser, $dbpasswd) 
  or die( "Kann mich nicht mit der Datenbank verbinden!") ;
?>

Hier findet auch auch eine Überprüfung statt, ob die Verbindung geklappt hat. Später im Quelltext werden diese Überprüfungen der Einfachkeit halber eingespart. Prinzipiell sollte man aber immer die Rückgabecodes der Funktionen auch auswerten und nicht einfach davon ausgehen, wird schon geklappt haben.

--

Im nächsten Programmsegment wird überprüft ob unsere Tebelle bereits angelegt ist. Ist dies nicht der Fall, so wird sie einfach angelegt.

<?
$result = mysql_listtables($db);
$tabelle_fehlt = TRUE; 
for($i=0; $i < mysql_num_rows($result); $i++) {
  if(mysql_tablename($result, $i) == $tabelle) {
    $tabelle_fehlt = FALSE;
    break;
  } 
}

if($tabelle_fehlt) {
  mysql($db, $tabelle_anlegen)
    or die( "Kann Tabelle nicht anlegen.");
}
?>

Dies ist natürlich auch keine allzugeschickte Sache, da diese Überprüfung bei jedem Aufruf des Programmes stattfindet, obwohl das einfügen der Tabelle ja nur ein einziges mal geschehen muß. Ich habe es hier aber exemplarisch für die Überprüfung ob eine Tabelle vorhanden ist und für die Anlage einer Tabelle aus php3 heraus mit eingebaut.

--

Nun folgen einige Funktionsdeklarationen.

Um nicht zweimal ein- und dieselbe Eingabemaske eingeben und warten zu müssen bauen wir uns eine Kombifunktion, die sowohl für die Erfassung als auch für die Bearbeitung von Einträgen dient.

<?
function neu_bearbeiten($id=0) { 
  global $PHP_SELF, $db, $tabelle;
  $name =  ""; $strasse =  ""; $plz =  ""; $stadt =  "";
  $funktion =  "anlegen";
  if($id) {
    $result = mysql($db,  "SELECT name, strasse, plz, stadt FROM $tabelle"
            . " where id = $id");
    list($name, $strasse, $plz, $stadt) = mysql_fetch_row($result);
    $funktion =  "aendern";
  }
?>
  <form action= <? echo $PHP_SELF ?>>
    <pre>
      <input type=hidden name=funktion value= <? echo $funktion ?>>
      Name:   <input type=text name=name value= <? echo $name ?>>
      Strasse:<input type=text name=strasse value= <? echo $strasse ?>>
      PLZ:    <input type=text name=plz value= <? echo $plz ?>>
      Stadt:  <input type=text name=stadt value= <? echo $stadt ?>>
              <input type=submit value= <? echo $funktion ?>>

    </pre>
  </form>         
<? 
}

Hier kann man verschieden Aspekte von php3 erkennne. Gleich zu Begin ist als Parameter der Funktion $id=0 vereinbart. Das bedeutet zum einen, daß die Funktion einen Parameter namens $id entgegenimmt und zum anderen, daß dieser Parameter, falls er nicht übergeben wird den Wert 0 bekommen soll.

Die Funktion ist so aufgebaut, daß sie eine Maske zum erfassen eines Datensatz bietet, falls $id gleich 0 ist und eine Maske zum Bearbeiten eines Satzes bietet, wenn sie mit einem Parameter ungleich 0 aufgerufen wird.

php bietet sowohl globale Variable, als auch lokale Variablen. Um innerhalb einer Funktion auch auf globale Variablen zugreifen zu können müssen diese in den Namensraum der Funktion importiert werden. Dies geschieht mit Hilfe der Anweisung global.

Die Variable $PHP_SELF ist innerhalb eines php3-Skriptes immer vorbelegt und enthält den Dateinamen des Skripts. Da dieses Skript sich ja immer wieder selbst aufruft benutzen wir hier die Variable $PHP_SELF. Dies funktioniert immer, egal wie wir die Datei benannt haben.

--

Die 4 folgenden Funktionen dienen nun zum anlegen, löschen, Anzeigen und zur Eingabe eines Suchbegriffes.

function anlegen($name, $strasse, $plz, $stadt) {
  global $PHP_SELF, $db, $tabelle;
  mysql($db,  "INSERT INTO $tabelle (name, strasse, plz, stadt)"
    . " VALUES('$name', '$strasse', '$plz', '$stadt')");
  echo  "$name angelegt.";
  echo  "<p align=right><a href=$PHP_SELF>zurueck</a></p>";
}

function loeschen($id) {
  global $PHP_SELF, $db, $tabelle;
  mysql($db,  "DELETE FROM $tabelle WHERE id = $id");
  echo  "Eintrag $id geloescht.";
  echo  "<p align=right><a href=$PHP_SELF>zurueck</a></p>";
}

function liste($filter =  "") {
  global $PHP_SELF, $db, $tabelle;
  $result=mysql($db,  "SELECT * from $tabelle where name LIKE "
        . "'%${filter}%'");
  echo  "<table>";
  while(list($id, $name, $strasse, $plz, $stadt) 
    = mysql_fetch_row($result)) {
    echo  "<tr><td>$name<br>$strasse<br>$plz $stadt</td>";
    echo  "<td><a href=$PHP_SELF?funktion=neu_bearbeiten&id=$id>"
      . "bearbeiten</a><br>"
      . "<a href=$PHP_SELF?funktion=loeschen&id=$id>loeschen</a></td></tr>";
  }
  echo  "</table>";
  echo  "<p align=right><a href=$PHP_SELF>zurueck</a></p>";
}

function auswahl() {
  global $PHP_SELF; ?>
  <form action= <? echo $PHP_SELF ?>?liste>
    <pre>
      <input type=hidden name=funktion value=liste>
      Suchen: <input type=text name=filter>
    </pre>
  </form><br>
<?
  echo  "<a href=$PHP_SELF?funktion=neu_bearbeiten>neuer Datensatz</a>";
  echo  " <a href=$PHP_SELF?funktion=liste>alle anzeigen</a>";         
}

Die Funktion liste ist hier wieder so gestaltet, daß man sie mit oder ohne Paramter aufrufen kann. Wird sie ohne Paramter aufgerufen, so werden alle Datensätze angezeigt. Ruft man sie mit einem Parameter auf, so werden nur die Datensätze angezeigt, bei denen der Paramter im Namen vorkommt.

--

Nun benötigt das Programm noch eine Verteilerzentrale, die abhängig von den übergebenen Parametern in die entsprechenden Funktionen verzweigt.

PHP stellt automatisch alle Parameter die einem Dokument entweder per POST, per GET (mit ? an URL angehängt) oder auch per Cookie übergeben werden als globale Variablen mit ihren entsprechenden Werten zur Verfügung.

switch($funktion) {
 case anlegen:
   anlegen($name, $strasse, $plz, $stadt); 
   break;
 case neu_bearbeiten:
   if(isset($id)) neu_bearbeiten($id); 
   else neu_bearbeiten();
   break;
 case liste:
   if(isset($filter)) liste($filter); 
   else liste();
   break;
 case loeschen:
   loeschen($id); 
   break;
 default:
   auswahl();
}
?>

Hier wird jeweils die Variable funktion --- die wir ja in den entsprechenden Funktionen oben ja entweder per URL oder per "hidden field" in den Formularen übergeben haben --- ausgewertet und entsprechend im Programm verzweigt. Ist die Variable funktion nicht belegt, so wird die Funktion auswahl aufgerufen.

--

Schlußendlich möchte eine HTML Seite auch ordentlich abgeschlossen sein.

  </body>
</html>

Hier befindet sich der gepackte Sourcecode des Beispieles als ge-gziptes tar-Archiv.

Weitere Links zum Thema

Bücher zum Thema

Hinweis: Das Buch "PHP. Dynamische Webauftritte professionell realisieren" enthält als Kapitel 24 eine Einführung in die Verwendung von phplib von Kristian Köhntopp. Diese Einführung steht auch hier im Internet zur Verfügung.


MySQL and mSQL
bei amazon.de

PHP Pocket Reference
bei amazon.de

PHP. Dynamische Webauftritte
professionell realisieren
bei amazon.de
Martin Glinski