12. September 2015
Zugriff von Javascript auf PHP-Daten mittels Ajax
Das Großprojekt, welches mich den ganzen Sommer über beschäftigt hat und in Kürze fertig gestellt sein wird, stellte mich auch vor eine Reihe von neuen Problemen. Eines war die Überprüfung von Benutzereingaben mittels Tabellen.
Diese langen und komplizierten Tabellen lagen bereits in den PHP-Skripten vor, da damit abschließend auch ein Endpreis für das Produkt errechnet wird. Zusätzlich sollten aber bereits während der Parametereingabe der Benutzer durch Abfrage der Tabellen auf Fehleingaben hingewiesen werden. Hierzu sah ich zwei Lösungswege:
■ Jascript-Lösung: Die Tabellen könnten ein zweites Mal in Javascript angelegt und in die Webseite geschrieben werden, mittels Javascript ließen sich die Benutzereingaben dann überprüfen. Vorteil: relativ einfach zu realisieren.
Nachteil: Die Tabellen wären doppelt vorhanden, in PHP und nochmal im Javascript-Code und müssten später auch doppelt gepflegt werden. Zudem würden die umfangreichen Tabellen den Code-Anteil der Webseite stark vergrößern, was sich ggf. wieder negativ auf die Ladezeiten auswirken könnte und die Sache insgesamt unübersichtlich macht.
■ Zugriff auf die vorhandenen PHP-Tabellen von Javascript aus. Vorteil: schlanke Lösung, keine doppelten Tabellen. Nachteil: höherer Aufwand zur Realisierung, zuverlässige Verbindung zwischen Client und Server erforderlich.
Damit die zweite Lösung, die ich schließlich gewählt habe, möglich wird, musste ich mich erstmals mit Ajax beschäftigen. Damit ist nicht der bekannte Haushaltsreiniger gemeint, sondern ein Konzept der asynchronen Datenübertragung zwischen einem Browser (Javascript) und dem Server (PHP).
Ajax kann eine Menge mehr als das, wofür ich es hier gebrauche, Details entnehmen Sie bitte dem Wikipedia-Artikel zu Ajax.
Lösung
Die Lösung meines Problems hatte ich mir (vereinfacht) ungefähr wiefolgt vorgestellt:
- Im Browser stellt Javascript fest, dass ein Eingabefeld verändert wurde. Ein „Event“ wird ausgelöst.
- In der mit dem Event verknüpften Funktion wird der aktuelle Wert des Eingabefeldes festgestellt.
- Anschließend überträgt Javascript die Werte über einen Ajax-Aufruf an eine PHP-Funktion auf dem Server.
- Die PHP-Funktion übernimmt die Werte und prüft anhand der besagten Tabellen, ob gewisse Grenzen überschritten werden. Ist dies der Fall gibt die Funktion „OVERFLOW“ zurück, andernfalls ein „OK“.
- Javascript im Client empfängt diese Information und warnt den Benutzer, falls ein OVERFLOW aufgetreten ist.
Sourcecode
Hier die fünf Stufen als Sourcecode, statt direktem Javascript benutze ich die jQuery-Bibliothek, da ich das Rad nicht unbedingt neu erfinden muss:
jQuery( "select#dd12" ).on( "change",function() { check();
}
);
Durch diesen Code wird bei jeder Änderung (change-Event) im select-Auswahlfeld mit der ID „dd12″ automatisch die Javascript-Funktion check() aufgerufen. Sie sieht wiefolgt aus:
function check() {
var switchValue = jQuery( "select#dd12" ).val();
jQuery.ajax( { url: "../php/verarbeitung.php",
data: { "value": switchValue },
dataType: "text",
type: "POST",
success: function( data )
{
if ( data == "OVERFLOW" )
jQuery("#meldung").show();
else jQuery("#meldung").hide();
}
}
);
}
Die Funktion check() ermittelt den aktuellen Stand des select-Auswahlfeldes „dd12″ und ruft über jQuery.ajax() die PHP-Datei „verarbeitung.php“ auf, alle weiteren Aktionen erfolgen also im Server. Beim Aufruf wird der Inhalt von „switchValue“ als Parameter „value“ übergeben.
In diesem Aufruf ist auch gleich definiert, wie auf die Rückgabe von PHP reagiert wird, siehe die Funktion bei success: ist die Rückgabe (data) der String „OVERFLOW“, wird das CSS-Div mit der ID „meldung“ angezeigt, andernfalls nicht. In PHP (verarbeitung.php) sieht die Sache dann so aus:
require_once "__tabellen.php"; // Meine komplizierten Tabellen
$bOverflow = false;
$switchValue = $_REQUEST[ 'value' ]; // Parameter holen
if ( !__berechnung( $aTabelle,$switchValue ) ) $bOverflow = true;
echo ( $bOverflow == true ) ? "OVERFLOW" : "OK";
Die eigentliche Ermittlung des Ergebnisses erfolgt in der Unterfunktion __berechnung() und soll uns hier nicht weiter interessieren. Wichtig für die korrekte Funktion ist, dass die Rückgabe des Ergebnisses von PHP nicht wie gewohnt durch return, sondern als echo erfolgt.
jQuery
Falls Sie sich gewundert haben, warum ich jQuery nicht, wie sonst üblich, mit dem $-Zeichen aufrufe – dies geschieht, da diese Notation innerhalb meines Javascript-Codes mit anderen Bibliotheken kollidieren würde. Zudem vermeide ich Abkürzungen wennimmer möglich, da sie meist nur zu Verwirrungen führen.
Kernighan und Ritchie
Übrigens, schön ist auch die PHP-Codezeile
echo ( $bOverflow == true ) ? "OVERFLOW" : "OK";
Das erinnert mich an alte C/C++ – Zeiten und an mein Studium des Buches „The C Programming Language“, muss so 1986 oder 1987 gewesen sein.
Soweit ich mich entsinne erzählte man im Buch zu dieser Schreibweise die Anekdote, dass es den C-Erfinder Kernighan und Ritchie zu mühsam war, immer wieder if … then … else … zu schreiben und sie daher kurzerhand diese Notation erdachten.