PHP

Willemers Informatik-Ecke

Das Aufsetzen eines Web-Servers inklusive PHP und Datenbank sowie eine Einführung in PHP wird hier beschrieben:
Bei Amazon bestellen

Ferien an der Flensburger Förde
Ein freies Getränk für den Autor? Danke!

2016-05-19
PHP ist eine Programmiersprache, um Webseiten interaktiv zu machen. Wie bei Javascript findet man den Source im HTML, im Unterschied zu diesem wird PHP allerdings auf dem Webserver ausgeführt.

Installation und Konfiguration

PHP wird unter Linux (hier Debian) installiert, indem das Paket libapache2-mod-php5 für apache installiert wird.
# apt-get install libapache2-mod-php5
Dabei ist noch wichtig, mit welcher Dateiendung Seiten ausgestattet sein müssen, damit auf ihnen PHP-Skripte laufen. Das wird in der Datei /etc/apache2/mods-enabled/php5.conf festgelegt. Als Standard wird .php3, .php4, .php5 oder auch php vorgegeben. Eine Website, die auf .htm endet, aktiviert also kein PHP.

Erste Schritte

PHP-Befehle können wie andere Skriptsprachen durch das Tag script umschlossen werden.
<script language="php"> 
echo ("some editors (like FrontPage) don't like processing instructions");
</script>
Häufiger wird allerdings eine Klammerung durch die Fragezeichen-Tags verwendet.
<? echo ("Dies ist eine PHP-Ausgabe!"); ?>
oder
<?php echo ("Dies ist eine PHP-Ausgabe!"); ?>
PHP ähnelt C. Befehle werden durch Semikolen getrennt und die Kommentare /* */ und // sind ebenfalls bekannt. Hinzu kommt der # aus den Shellsprachen. Variablen werden durch ein vorangestelltes $-Zeichen gekennzeichnet und erhalten ihren Typ durch Zuweisung eines Wertes.

Variablen werden in PHP mit einem Dollarzeichen gekennzeichnet. Sie erhalten ihren Typ durch die Zuweisung eines Wertes.

Auswertung eines Formulars

Besonders einfach ist die Auswertung von Formularen in PHP. Zunächst muss ein Formular erstellt werden. Als Aktion des Formulars wird eine weitere PHP-Webseite angegeben. Jedes der Eingabeelemente erhält dabei einen Namen. Diese Namen können auf der aufgerufenen PHP-Webseite direkt als PHP-Variablen ausgelesen werden.

<FORM ACTION=verarbeite.php METHOD=POST>
<INPUT TYPE="TEXT" NAME="name" SIZE=30>
<BR>Per Mail versenden
<INPUT TYPE="checkbox" NAME="versenden">
<BR>
<INPUT TYPE="SUBMIT" VALUE="Abschicken">
</FORM>

Bei Betätigung des Submit-Buttons wird die Seite verarbeite.php aufgerufen. Hier stehen die Variablen name und versenden zur Verfügung.

<?php
  echo ("Name: $name <BR>");
  echo ("Versenden: $versenden <BR>");
  if ($versenden=="on") {
    echo ("mach mail auf");
    mail("arnold@localhost", "Betreff: PHP-Test",$name);
  }
?>

PHP 5.0 liest die übergebenen Variablen nicht direkt, sondern verwendet ein assoziatives Array namens $_POST, bei dem der Variablenname als Index verwendet wird. Das obige Beispiel muss dann so aussehen:

<?php
  echo ("Name: $_POST['name'] <BR>");
  echo ("Versenden: $_POST['versenden'] <BR>");
  if ($_POST['versenden']=="on") {
    echo ("mach mail auf");
    mail("arnold@localhost", "Betreff: PHP-Test",$_POST['name']);
  }
?>

Die Funktion mail sendet Nachrichten per E-Mail. Der erste Parameter ist die E-Mailadresse, der zweite der Betreff (subject) und der dritte Parameter enthält den Inhalt der Mail.

Anstatt das Formular und die Bearbeitung in zwei Dateien aufzuteilen, kann dies auch in einer Seite erledigt werden. Dazu kann gleichzeitig die Fehlerbehandlung durchgeführt werden. Die Grundidee besteht darin, dass das Formular in einer Textvariablen abgelegt wird. In einer Variablen, die wir hier firsttime nennen, wird festgehalten, ob die Seite das erste Mal aufgerufen wird und entsprechend angezeigt werden muss. Die action im Formular zeigt auf die eigene Datei namens checkform.php.

<html>
<head> <title>checkform.php</title> </head>
<body>
<?PHP
// Das Formular wird in der Variablen $form abgelegt
$form="
<form action=\"checkform.php\" method=\"post\">
<input type=\"hidden\" name=\"firsttime\" value=\"y\">
<input type=\"text\" name=\"name\" size=\"20\" maxlength=\"20\" value=\"\"><br>
<input type=\"submit\" value=\"Ok\">
</form>
";

// Erst wenn das Formular erstmals angezeigt wurde, wird firsttime definiert
// PHP 4.0
// if ($firsttime!="y"):
// PHP 5.0
if ($_POST['firsttime']!="y"):
    print "$form";
else:
    $error="n";
    if ($_POST['name']=="") :
        print "<font color=\"red\">Name fehlt</font><br>";
        $error="y";
    endif;
    if ($error=="y") :
       print "$form";
    else :
       print "Alles prima!";
    endif;
endif;

?>
</body>
</html>

An der Stelle, wo "Alles prima!" angezeigt wird, ist die Bearbeitung korrekt. Es kann hier beispielsweise eine Mail mit dem Inhalt abgesetzt werden oder zur nächsten Seite weitergeleitet werden.

Datenbankanschluss an MySQL

Im Beispiel soll auf eine MySQL-Datenbank zugegriffen werden. Dazu muss neben der MySQL-Datenbank, PHP und Apache auch das Modul installiert sein, das PHP den Zugriff auf MySQL ermöglicht. Unter Debian heißt das Paket php5-mysql.
apt-get install php5-mysql
Die Aufrufe erinnern ein wenig an die C-API.

int mysql_connect(string [hostname][:port], 
                  string [username], string [password]);
int mysql_close(int [link_identifier] );

Mit mysql_connect wird die Verbindung zur Datenbank aufgebaut. Die Verbindung wird mit mysql_close wieder beendet.

int mysql_db_query(string database, string query, int [link_identifier] );

Mit mysql_db_query kann ein SQL-Kommando an die Datenbank übermittelt werden. Der Rückgabewert ist das Handle auf eine Ergebnismenge, das mit entsprechenden Routinen ausgelesen wird.

array mysql_fetch_row(int result);

Mit mysql_fetch_row wird Zeile für Zeile das Ergebnis in ein Array gelesen, das die Spalten einer Zeile darstellt.

Das folgende Beispiel nimmt eine Verbindung zur lokal eingerichteten Datenbank auf und liest aus der Tabelle customer alle Zeilen und stellt sie im Browser in einer Tabelle dar.

<script language="php">
// Versuche auf die DB zuzugreifen
$dbhandle = mysql_connect("localhost", "arnold", "geheimespasswort");
$dbresult = mysql_db_query("test_arnold", "select * from customer", $dbhandle);
echo "Das ist das Ergebnis:<table border> ";
while ($row = mysql_fetch_row($dbresult)) {
  echo "<tr><td>",$row[0],"</td><td>", $row[1], "</td></tr>";
}
echo "</table>";
mysql_close($dbhandle);
</script>

Eingabedaten in die Datenbank einfügen

Wenn Daten in eine Datenbank eingefügt werden sollen, verwendet man den SQL-Befehl INSERT. Hier wird erst einmal direkt eingefügt.
<?php
    $dbcon=mysql_connect("localhost","fewo","geheim");
    if (mysql_select_db("fewo", $dbcon)) {
        echo("Datenbank fewo existiert.");
    } else {
        echo("Keine Datenbank fewo");
    }
    $sql="INSERT INTO gast (id, name, vorname) VALUES (13, 'Murks', 'Max')";
    if (mysql_query($sql, $dbcon))
    {
       echo("Insert funktioniert.");
    } else {
       echo("Uuuupps");
    }
    mysql_close();
?>
Nun werden einfach die Formularauswertung von oben, das Entnehmen der POST-Daten und der Insert-Aufruf zusammengesetzt. Das Formular ist in der Datei formgast.php.
<html>
<body>
<form action=neuergast.php method=post>
<table>
<tr><td>ID: </td><td> <input type="TEXT" name="id" size=40></td></tr>
<tr><td>Name: </td><td> <input type="TEXT" name="name" size=40></td></tr>
<tr><td>Vorname: </td><td> <input type="TEXT" name="vorname" size=40></td></tr>
<tr><td> </td><td> <input type="submit" value="Einfügen"></td></tr>
</table>
</form>
</body>
</html>
Das Formular ruft beim Submit die Datei neuergast.php auf. Diese entnimmt die POST-Daten und ruft den Datenbank-Befehl INSERT auf.
<?php
    $dbcon=mysql_connect("localhost","fewo","geheim");
    if (mysql_select_db("fewo", $dbcon)) {
        echo("Datenbank fewo");
    } else {
        echo("Keine Datenbank fewo");
    }
    $sql="INSERT INTO gast (id, name, vorname) VALUES ($_POST[id], '$_POST[name]', '$_POST[vorname]')";
    if (mysql_query($sql, $dbcon))
    {
       echo("Insert funktioniert.");
    } else {
       echo("Uuuupps");
    }
    mysql_close();
?>

MySQL-Daten per JSON weitergeben

Zunächst wird eine MySQL-Datenbank fewo mit der Tabelle gast angelegt.
mysql -u root -p
Enter password:
mysql> CREATE USER 'fewo'@'localhost' IDENTIFIED BY 'geheim';
mysql> CREATE USER 'fewo'@'%' IDENTIFIED BY 'geheim';
mysql> create database fewo;
mysql> grant all on fewo.* to fewo;
Nun ausloggen und als Benutzer fewo die Datenbank fewo öffnen. Dort eine Tabelle gast anlegen und einen Beispielsatz eintragen:
mysql -u fewo -p fewo
Enter password:
mysql> create table gast ( id int primary key, name varchar(40), 
          vorname varchar(40), mail varchar(50), strasse varchar(80),
          plz varchar(20), ort varchar(50), tel varchar(40),
          kinder int, info varchar(255));
mysql> insert into gast values (12, 'Name', 'Vorname', 'name@mail.de',
          'Strasse', 'plz', 'Ort', '112', 2, 'Informationen');
Datenbank verlassen.

Für PHP müssen die Module für den Zugriff auf MySQL und JSON installiert sein. Es wird eine PHP-Webseite namens gast.php angelegt. Darin wird ein Kontakt zur MySQL-Datenbank aufgebaut und ein SELECT ausgeführt. Das Ergebnis wird in einer Schleife durchlaufen und jede Zeile an eine String-Variable angehängt. Das Ergebnis wird durch den Aufruf json_encode in das Format JSON gewandelt und ausgegeben.

<?php
    $dbcon=mysql_connect("localhost","fewo","geheim");
    mysql_select_db("fewo", $dbcon);
    $result=mysql_query("SELECT * FROM gast", $dbcon);
    if ($result) {
        while($row=mysql_fetch_row($result)) {
             $output[]=$row;
        }
    } else {
        echo("Kein Ergebnis aus SELECT");
    }
    print(json_encode($output));
    mysql_close();
?>
Wird diese URL durch ein Programm aufgerufen, kann es die Ausgabe sammeln und die Daten verarbeiten. Unter Java wird beispielsweise folgende Methode den JSON-Code abholen und als String zurückliefern.
public String holeGaeste(String strUrl) {
    StringBuilder daten = new StringBuilder();
    try {
        URL url = new URL(strUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        BufferedReader in = new BufferedReader(
                new InputStreamReader(connection.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
            daten.append(line);
        }
        in.close();
    } catch(IOException e) {
        System.out.println(e.toString());
    }
    return daten.toString();        
}

Literaturhinweise

Thomas Theis: PHP 4 Webserver-Programmierung für Einsteiger
W.J. Gilmore: PHP 4 professionell

Homepage (C) Copyright 2001, 2008, 2016 Arnold Willemer