Wie man eine Access-Datenbank ins Internet bringt (3)

PHP, wir erwähnten es in „Wie man eine Access-Datenbank ins Internet bringt (1)“ steht für „Hypertext Pre-Processor“. Die Abkürzung lautet kurioserweise tatsächlich so. PHP kann etwas, das für unsere Zwecke sehr hilfreich ist, nämlich …

… HTML-Code individuell erzeugen

Es geht jetzt um ein PHP-Skript. Es ist gleichzeitig die Datei query.php. Du wirst es später selber schreiben. Du wirst es dann implementieren. Wie das geht, steht in „Wie man eine Access-Datenbank ins Internet bringt (4)“. Es leistet dann die Ausgabe der Bücher-Such-Abfrage-Ergebnisse. Schauen wir es uns als erstes mal komplett an. Es hat 84 Zeilen. Keine Angst, wir gehen in kleinen und kleinsten Schritten voran.


<link rel="stylesheet" type="text/css" href="blog01_buecher.css" />
<?php
    
    $rawdata = $_POST;

    // MySQL Zugangsdaten
    $database="XXXXXXX";
    $host="XXXXXXX";
    $user="XXXXXXX";
    $password="XXXXXXX";
    $table="XXXXXXX";

    // Verbindung zur Datenbank herstellen
    mysql_connect($host,$user,$password);
    mysql_select_db($database) or die( "Unable to select database");
    
    // 1/2 Abfragen Spaltennamen holen und im ersten $result speichern
    $query = "show columns from $table";
    $result = mysql_query($query);
    
    // 2/2 Abfragen Basis-Query
    $query = "select * from $table where ";
    
    // 1/2 Schleifen holt Feldname und anhand dessen Feldinhalt
    
    while ( $row = mysql_fetch_assoc($result) )
    {
        $feldname = $row['Field'];
        $feldinhalt = $rawdata[$feldname];
    
        // Query erweitern, aber nur, wenn Wert eingegeben
        if (!$feldinhalt=="")
        {
            $query = $query . "$feldname LIKE '$feldinhalt%' and ";
        
        }
    }
    // nach Schleife Ende des Query-Strings abschneiden
    $queryohneende = substr($query, 0, -4);
    $query = $queryohneende;
    $queryplusorderby = $query . " order by AutorNachname";
    $query = $queryplusorderby;
    
    // Zweites Query ausführen
    $result=mysql_query($query);

    // Abfrage überprüfen
    if (!$result)
    {
        $message  = 'Invalid query: ' . mysql_error() . "\n";
        $message .= 'Whole query:   ' . $query;
        die($message);
    }

    // Ausgabe 2/2 Schleifen
    echo "<table cellspacing = '1' cellpadding = '5'>";
    
    $zaehler = 0;
    
    while ($dsatz = mysql_fetch_assoc($result))
    {
        $zaehler = $zaehler + 1;
        echo "<tr>";
        echo "<td class='author'>" . $dsatz["AutorNachname"] . "</td>";
        echo "<td>" . $dsatz["AutorVorname"] . "</td>";
        echo "<td class='title'>" . $dsatz["Titel"] . "</td>";
        echo "<td>" . $dsatz["Untertitel"] . "</td>";
        echo "<td>" . $dsatz["Ort"] . "</td>";
        echo "<td>" . $dsatz["Verlag"] . "</td>";
        echo "<td>" . $dsatz["Jahr"] . "</td>";
        echo "<td>" . $dsatz["Kategorie"] . "</td>";
        echo "<td>" . $dsatz["Art"] . "</td>";
        echo "<td>" . $dsatz["Uebersetzungvonin"] . "</td>";
        echo "<td>" . $dsatz["wanngelesenetwa"] . "</td>";
        echo "<td>" . $dsatz["Kommentar"] . "</td>";
        echo "</tr>";
    
    }
    echo "<b>Es wurde/n " . $zaehler . " Buch/Bücher gefunden</b>";
    echo "</table>";
    
    // Verbindung schliessen
    mysql_close();
?>

Die Zeile

<link rel=“stylesheet“ type=“text/css“ href=“blog01_buecher.css“ />

bindet ein Style-Sheet ein. Ignoriere sie fürs erste.

Wie jedes PHP-Skript, beginnt der Code mit einem öffnenden <?php

Es folgt die Überführung der (aus der query.html stammenden) $_POST-Daten in die Variable $rawdata.

$rawdata = $_POST;

Sie, die Variable $rawdata, enthält nun ein sogenanntes assoziatives Array. Das ist ein Datenfeld, in dem die Feldbezeichnungen mit dem Feldinhalt verbunden/assoziiert sind. Dieses Array hat alle Daten (Benutzer-Eingaben bzw. Bücher-Such-Begriffe), die der Benutzer kurz vor dem Absenden des html-Formulars gemacht hat. Das assoziative Array sieht jetzt so aus: (Das ist ein Beispiel, je nach den eingegebenen Suchbergriffen wäre es anders)

array(12) {
[„AutorNachname“]=> string(6) „Frisch“
[„AutorVorname“]=> string(3) „Max“
[„Titel“]=> string(7) „Andorra“
[„Untertitel“]=> string(0) „“
[„Ort“]=> string(17) „Frankfurt am Main“
[„Verlag“]=> string(8) „Suhrkamp“
[„Jahr“]=> string(4) „1975“
[„Kategorie“]=> string(11) „Germanistik“
[„Art“]=> string(13) „Theaterstueck“
[„Uebersetzungvonin“]=> string(0) „“
[„wanngelesenetwa“]=> string(4) „2002“
[„Kommentar“]=> string(8) „sehr gut“
}

Der PHP-Befehl

echo $rawdata['AutorNachname'] . " " . $rawdata['AutorVorname'] . " " . $rawdata['Titel'] . " ";

gäbe also aus:

Frisch Max Andorra

Der darauf folgende Codeblock überführt die Zugangsdaten in Variablen. Dadurch werden deine Skripte wartungsfreundlicher. Willst du das Skript mal an anderem Ort laufen lassen, musst du diese Daten nur an dieser Stelle ändern und nicht an unzähligen weiteren Stellen in deinem Skript/in deinen Skripten. Die Datenbank, die auf dem von dir angemieteten Webspace beim Hoster deiner Wahl läuft, hat einen Namen. Dieser gehört hier zwischen die Anführungsstriche. Er könnte z.B. lauten: usr_web444_1. Die nächste Angabe ist die Host-Angabe, meist lautet sie „localhost“. Frage sicherheitshalber bei deinem Anbieter nach, wenn du dir nicht sicher bist. Als nächstes ist der Benutzername zu nennen, den auch dein Anbieter/Hoster für dich vergeben hat, z.B. web444. Als vorletzte Angabe hat die Datenbank noch ein Passwort, das an dieser Stelle genannt werden muss. Und als letztes solltest du den Namen der betreffenden Tabelle auch in eine Variable packen. Fertig ist der Abschnitt mit den Zugangsdaten.

Im nächsten Abschnitt wird eine Verbindung zur Datenbank hergestellt, verbunden mit einer Abbruch-Nachricht, welche erscheint, wenn der Verbindungsversuch nicht erfolgreich ist: Unable to select database.

Im wiederum nächsten Abschnitt wird eine SQL-Abfrage in der Variablen $query gespeichert. Über SQL (Structured Query Language) bzw. MySQL haben wir schon gesprochen. Auch an dieser Stelle im Skript wird also eine Abfrage, ein query, versprachlicht:

$query = „show columns from $table“;

Es lautet umgangssprachlich: Zeige die Spalten der Tabelle BUECHER_GEL. Das Ergebnis dieser Abfrage sind also die Spalten der Tabelle (wir können hier auch Felder sagen): AutorNachname, AutorVorname, Titel, Untertitel, Ort, Verlag, Jahr, Kategorie, Art, Uebersetzungvonin, wanngelesenetwa, Kommentar.

Die Abfrage ist zu diesem Zeitpunkt aber erst einmal formuliert und in der Variablen $query gespeichert. Ausgeführt wird sie mit:

$result = mysql_query($query);

Die Semikola bilden immer das Ende eines jeden PHP-Befehls.

Was passiert hier? Die Abfrage wird ausgeführt. mysql_query ist ein fester Befehl, eine Funktion, die als ihr übergebenen Parameter den Wortlaut der SQL-Abfrage benötigt. Es wird also „show columns from $table“ ausgeführt und es wird in einem Aufwasch(!) das Ergebnis in der Variablen $result gespeichert. Peng! 🙂 $result enthält jetzt die Spalten-/Feld-Namen – zur späteren Verwendung im selben Skript.

Im nächsten Skriptabschnitt wird eine weitere Abfrage formuliert:

$query = „select * from $table where „;

Heißt umgangssprachlich: Wähle alles aus der BUECHER_GEL, wo … Das Leerzeichen zwischen dem letzten e und den Anführungszeichen deutet darauf hin, dass diese Abfrage nur ein Teil einer späteren Gesamtabfrage ist. Gespeichert wird sie in der Variablen $query. Was folgt, ist eine sogenannte Schleife:

while ( $row = mysql_fetch_assoc($result) )

Schleifenformulierungen haben im Code kein beendendes Semikolon. Sie heißt umgangssprachlich: Solange du, Parser/Code-Interpreter/Web-Server, die Zeilen dessen, was in $result steckt, ablaufen kannst und immer noch eine neue Zeile findest, speichere es in $row, bis die Schleife erneut durchlaufen wird, oder bis du keine Zeilen mehr finden kannst. Noch genauer: Hole dies aus dem assoziativen Array heraus (fetch assoc). Hör auf, wenn du $result ganz durchlaufen hast.

Was geschieht innerhalb der Schleife?

$feldname = $row[‚Field‘];

Der schleifen-durchlaufs-aktuelle Inhalt von $result, jetzt in $row, es ist der Feld-Teil (Field), wird in der Variablen $feldname gespeichert. In der nächsten Zeile

$feldinhalt = $rawdata[$feldname];

wird der Teil-Inhalt von $rawdata, der sich auf diesen Feldnamen bezieht, in der Variablen $feldinhalt gespeichert. Man bedenke: Diese beiden Zeilen werden bei jedem Schleifendurchlauf ausgeführt, solange, bis die Schleife endet. Das tut sie, wenn der Inhalt von $result nichts mehr hergibt, zu Ende durchlaufen wurde. Aber ein einziger Schleifendurchlauf macht noch mehr:

if (!$feldinhalt==““)
{
$query = $query . „$feldname LIKE ‚$feldinhalt%‘ and „;
}

Heißt umgangssprachlich: Wenn (if) $feldinhalt nicht leer ist – wenn da also überhaupt was steht, d.h. wenn der Benutzer im Formular in dieses Kriterienfeld etwas eingetragen hat – dann erweitere den Abfragewortlaut ($query).

Man beachte den Punkt im zuletzt angegebenen Code. Er verkettet Zeichenfolgen und kann als „und“ gelesen werden. $query ist also immer das alte $query plus angehängt bei jedem Schleifendurchlauf (der nicht nichts findet): „$feldname LIKE ‚$feldinhalt%‘ and „. Der in $query gespeicherte Abfragewortlaut wird also länger und länger, und länger. Denn er muss ja alle ausgefüllten Formularfelder berücksichtigen.

Beispiel – jemand hat in das Formular unserer query.html als Suchbegriffe in die Felder eingegeben:

Boyne
John
Der Schiffsjunge
Bounty
Frankfurt
Fischer
2011
privat
Roman
Englisch
2012
ganz gut

Diese kombinierte Suchbegriffeingabe ergäbe die Monster-Abfrage, die man sonst gar nicht zu Gesicht bekommt (code-intern):

select * from BUECHER_GEL where AutorNachname LIKE ‚Boyne%‘ and AutorVorname LIKE ‚John%‘ and Titel LIKE ‚Der Schiffsjunge%‘ and Untertitel LIKE ‚Bounty%‘ and Ort LIKE ‚Frankfurt%‘ and Verlag LIKE ‚Fischer%‘ and Jahr LIKE ‚2011%‘ and Kategorie LIKE ‚privat%‘ and Art LIKE ‚Roman%‘ and Uebersetzungvonin LIKE ‚Englisch%‘ and wanngelesenetwa LIKE ‚2012%‘ and Kommentar LIKE ‚ganz gut%‘ and

Gebaut wurde diese Monster-Abfrage von der Schleife. In der Weise, wie oben erläutert. Die Schleife ist jetzt zu Ende, die Variable $query hat die Monster-Abfrage in sich.

Sicherlich ist dir aufgefallen, dass die Monster-Abfrage am Ende ein „and“ enthält, auf das nichts mehr folgt. Das ist konstruktionsbedingt. Einem Blinddarm/Wurmfortsatz gleich muss dieses „and“ jetzt abgeschnitten werden, denn es ist am Ende überflüssig. Das erledigen die folgenden beiden Codezeilen. Und dann muss noch

order by AutorNachname

angehängt werden (SQL-Befehl zum Sortieren nach Autoren-Nachname). Das erledigen die nächsten beiden Zeilen, also vier Zeilen:

$queryohneende = substr($query, 0, -4);
$query = $queryohneende;
$queryplusorderby = $query . “ order by AutorNachname“;
$query = $queryplusorderby;

Wie machen die vier Zeilen das? In der Variablen $queryohneende wird $query ohne die letzten vier Stellen gespeichert. Dann in $query das Ergebnis dessen. Dann wird in der Variablen $queryplusorderby die $query plus (du erinnerst dich, der Punkt) „order by AutorNachname“ gespeichert. Und dann final in der $query wieder das Ergebnis dessen. Fertig! „and“ ist abgeschnitten und „order by AutorNachname“ ist angehängt. Die Leerzeichen bei alledem sind wichtig, damit die SQL-Befehlswörter getrennt bleiben.

Na, wenn wir nun so ein schönes $query haben, wird es Zeit, es auszuführen, das macht die nächste Zeile:

$result=mysql_query($query);

Die Datenbank, im Besonderen die Tabelle BUECHER_GEL wurde abgefragt, das Ergebnis steckt jetzt in $result. Wir konnten $result ruhig überschreiben, sein alter Inhalt (Skript oben) hat ausgedient.

Nach einer Prüfsequenz (wenn was schiefgeht, erfahren wir zum Teil was schiefgegangen ist) wird nun eine Tabelle gebaut. Unser mächtiges PHP wird jetzt eine individuelle HTML-Struktur entwerfen; dieser Tabelle kann man dann das Bücher-Such-Ergebnis entnehmen. Als erstes hier:

echo „<table cellspacing = ‚1‘ cellpadding = ‚5‘>“;

Heißt – gib aus: den Beginn einer Tabelle, diese Tabelle mit Raum zwischen den Zellen 1 und Abstand des Zellinhalts zum Zellrand 5. Alsdann wird ein Zähler gleich Null gesetzt, er wird uns später sagen, wie viele Bücher diesen Suchkriterien entsprachen. Sodann kommt eine Schleife, die zwar größer ist, als die vorige, aber viel unkomplizierter.

while ($dsatz = mysql_fetch_assoc($result))

Wie gesagt, Schleifenformulierungen haben im Code kein beendendes Semikolon. Heißt: Solange $result noch Zeilen und Inhalt hat, speichere sie bei jedem Durchlauf in $dsatz. Noch genauer: Hole dies aus einem assoziativen Array heraus (fetch assoc). Hör auf, wenn du $result ganz durchlaufen hast. Erhöhe auch bei jedem Schleifendurchlauf den Zähler um eins. Alsdann beginne eine Tabellenreihe (table row):

echo „<tr>“;

Dann beginne Tabellendaten (table data) und beende sie wieder, und dazwischen gib, was der aktuelle Schleifendurchlauf in $dsatz gespeichert hat, aus:

echo „<td>“ . $dsatz[„AutorNachname“] . „</td>“;

Mach das für jedes Feld einmal, also zwölfmal. Die Schleife wird dann für das nächste gefundene Buch eine neue Tabellenzeile ins Browserfenster zaubern, denn der HTML-Code in den echo-Befehlen ist so beschaffen. Schließlich ist die Schleife zu Ende, alle gefundenen Bücher sind angezeigt. Nach der Schleife wird noch der Zähler ausgegeben, denn wir wollen ja wissen, wie viele Bücher denn nun gefunden wurden. Bei z.B. 78 gefundenen Büchern wäre manuelles Zählen arg mühsam. Abschließend folgt noch

echo „</table>“;
mysql_close();
?>

Heißt: Mach die Tabelle wieder zu. Beende auch die Verbindung zur MySQL-Datenbank (Hacker bleiben draußen) und dann beende noch das Gesamt-PHP-Skript.

Du hast es geschafft! Du hast die Kernroutine zum Abfragen der Tabelle verstanden. Oder doch noch nicht so ganz? 🙂 Im letzteren Fall kannst du weiterlesen in „Wie man eine Access-Datenbank ins Internet bringt (4)“, wo wir wiederholen und vertiefen, oder diesen Blog fragend kommentieren, oder natürlich Foren frequentieren oder googeln.

Navigiere nun bitte zum nächsten Eintrag von streethawk68: Wie man eine Access-Datenbank ins Internet bringt (4)

Advertisements

Über streethawk68

43 years old IT-Fan
Dieser Beitrag wurde unter Uncategorized abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

6 Antworten zu Wie man eine Access-Datenbank ins Internet bringt (3)

  1. C.Gafert schreibt:

    Hallo streethawk68,
    warum wird der Artikel nach dem „Alsdann“ einfach beendet?
    Gruss,
    CG

    • streethawk68 schreibt:

      Hallo CG,

      Der Artikel soll bald fortgesetzt werden. Danke für deinen Kommentar und dein Interesse.

      Gruß,
      streethawk68

    • streethawk68 schreibt:

      Hallo C.Gafert,
      ich bin jetzt dabei, den Artikel zu vervollständigen.

      Wie man eine Access-Datenbank ins Internet bringt (1) war fertig.

      Wie man eine Access-Datenbank ins Internet bringt (2) war fertig.

      Wie man eine Access-Datenbank ins Internet bringt (3) ist neu fertig.

      Wie man eine Access-Datenbank ins Internet bringt (4) ist in Arbeit.
      Grüße, Streethawk68

  2. M. Heydecke schreibt:

    Gibt es Hoffnung, dass der Artikel noch beendet wird?

    • streethawk68 schreibt:

      Sehr gerne würde ich den Artikel augenblicklich fortsetzen. Leider fehlen mir derzeit die Kapazitäten. Danke für deinen Kommentar und das damit zum Ausdruck gebrachte Interesse!
      Gruß
      streethawk68

    • streethawk68 schreibt:

      Hallo M. Heydecke,
      ich bin jetzt dabei, den Artikel zu vervollständigen.

      Wie man eine Access-Datenbank ins Internet bringt (1) war fertig.

      Wie man eine Access-Datenbank ins Internet bringt (2) war fertig.

      Wie man eine Access-Datenbank ins Internet bringt (3) ist neu fertig.

      Wie man eine Access-Datenbank ins Internet bringt (4) ist in Arbeit.
      Grüße, Streethawk68

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s