PHP rocks! wünscht allen Mitgliedern einen guten Rutsch ins neue Jahr 2017 !!!
Hinweis: Das Forum zieht um! Um keine Datenverluste zu haben, schalten wir zwecks Übernahme der Daten das Forum am Sonntag, den 24.04.2016 um ca. 21:00 Uhr offline und passen anschliessend die DNS-Einträge an.
www.php-rocks.de wird euch dann nach den Aktualisierungen der DNS-Server wieder wie gewohnt uneingeschränkt zur Verfügung stehen.
Danke für euer Verständnis!

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
PHP Grundlagen Das E.V.A.-prinzip, kurz und knapp
#1
Das EVA-Prinzip als Grundlage der Datenverarbeitung
Eines der grundlegensten und wichtigsten Prinzipien im Bereich der Programmierung ist das EVA-Prinzip, das jedem Entwickler ( fast jeder Sprache ) bekannt sein sollte. Das EVA-Prinzip definiert den Ablauf einer Programmlogik und steht für "Eingabe -> Verarbeitung -> Ausgabe", was einfach umschrieben bedeutet, daß benutzerdefinierte Eingaben zunächst verarbeitet und dann erst an die Ausgabe gesendet werden.

Eine logische Erklärung zur Einhaltung für das E.V.A.-Prinzip dürfte die Tatsache sein, daß PHP auf dem Server arbeitet, also die Daten dort auch verarbeitet werden. Senden wir bereits Ausgaben in Form von HTML und wollen hinterher noch PHP-Code ausführen, machen wir dem Interpreter und uns selbst das Leben schwer. Warum? Nun, der Interpreter muß permanent den PHP-Code verlassen und wieder betreten und wir unterbinden im schlimmsten Fall die Verwendung von Funktionen, wie session_start() oder header().

Um das EVA-Prinzip zu verdeutlichen, verwenden wir als Beispiel ein kurzes Login, das eine Usereingabe per Formular entgegennimmt, diese verarbeitet und dann mit einer Ausgabe reagiert.
Hinweis
Das verwendete Beispiel soll keinen Anspruch auf Vollständigkeit in allen Details haben, sondern dient einfach nur der Erklärung des EVA-Prinzips anhand eines funktionierenden und nachvollziehbaren Beispiel-Codes.

Eingabe
Die Eingabe aus unserem Beispiel soll über ein Formular kommen, das wie folgt aufgebaut sein soll:
Code:
<form name="login" action="login.php" method="post">
   <label for="useremail">Deine E-Mail Adresse ein</label>
   <input type="text" id="useremail" name="useremail" vallue="" />
   <label for="userpassword">Passwort</label>
   <input type="password" id="userpassword" name="userpassword" vallue="" />
   <input type="submit" name="loginsubmit" vallue=" Login " />
</form>
I.d.R. kommen die Usereingaben bei PHP über das HTTP-Protokoll ( Hypertext Transfer Protocol ) und können dann über die Superglobalen Arrays abgerufen und verarbeitet werden:
  • $_GET
  • $_POST
  • $_FILES
  • $_SERVER
  • $_COOKIE
Für unser Beispiel greifen wir auf $_POST zurück, da die Übertragungsmethode POST für Formulare am sinnvollsten ist.

Verarbeitung
Wird das Formular ausgefüllt und abgesendet, haben wir die Möglichkeit, über $_POST die eingetragenen Daten zu verarbeiten. Dazu nehmen wir an, daß die erforderlichen Daten in einer Datenbank hinterlegt sind.
Wir wollen nun herausfinden, ob der User korrekte Daten eingegeben hat und der Login somit erfolgreich ist. Wir setzen eine gültige Datenbankverbindung voraus, worauf in dem PDO-Tutorial näher eingegangen wird.
Das Verbindungsobjekt soll uns für das Beispiel als PDO-Objekt in $dbObject zur Verfügung stehen.

Wir fragen also die Daten des Users ab, validieren diese und senden eine Anfrage mit den Daten an die Datenbank:
PHP-Code:
// Eingabe filtern
$sUserMail filter_var$_POST['useremail'], FILTER_SANITIZE_EMAIL );
$sUserPassword filter_var$_POST['userpassword'], FILTER_SANITIZE_STRING );

// Datenbank-Abfrage
$sQuery "SELECT `userName` FROM `userTable` WHERE `userMail`='" $sUserMail "' AND `userPassword`='" $sUserPassword "'";
$stmntResult $dbObject->query$sQuery );

// auswerten
$sUserName null;
 
if ( 
$stmntResult ) {

 
   $sUserName $stmntResult->fetchPDO::FETCH_OBJ )->userName;



Hinweis
Die Verarbeitung der Daten ist für dieses Beispiel absichtlich minimal gehalten. Für den produktiven Fall empfiehlt es sich, bspw. die Verarbeitung abhängig der tatsächlich übertragenen Daten auszuführen und PreparedStatements zu verwenden. Die einfachste Variante ist das Abfragen eines POST-Wertes, der erwartet wird.
PHP-Code:
if ( isset($_POST['useremail']) ) {

 
   // ...hier kommt die weitere Verarbeitung rein



Ausgabe
Wir haben jetzt die Eingabe entgegen genommen und diese verarbeitet. Mit dem Resultat sind wir nun in der Lage, die Ausgabe zu entscheiden/steuern.
PHP-Code:
if ( is_null($sUserName) ) {

 
   echo 'Deine Eingabe war fehlerhaft!';
 
   exit;

}

echo 
'Willkommen, ' $sUserName

Wir haben an dieser Stelle nun eine kleine Formularverarbeitung nach dem EVA-Prinzip durchgeführt.
  • Eingabe
    Die Daten haben wir über unser kleines Formular erhalten, das der User ausgefüllt hat.
  • Verarbeitung
    Wir haben die Daten aus der Eingabe zur Abfrage an die Datenbank genutzt und das Ergebnis verarbeitet.
  • Ausgabe
    Wir können anhand des Ergebnisses der Verarbeitung unsere Ausgabe dem Benutzer entsprechend steuern.

Generelle Verstöße gegen das E.V.A.-Prinzip
Wir haben jetzt das E.V.A.-Prinzip anhand eines kleinen konstruierten Falles mit einem Login gesehen. Grundsätzlich sieht man häufig deutliche Verstöße gegen das E.V.A.-Prinzip, in dem Berechnungen mitten im HTML-Code durchgeführt werden, wie in folgendem kleinen Beispiel zu sehen:
PHP-Code:
<body>

<?
php

$sUserMail 
filter_var$_POST['useremail'], FILTER_SANITIZE_EMAIL );
$sUserPassword filter_var$_POST['userpassword'], FILTER_SANITIZE_STRING );

// Datenbank-Abfrage
$sQuery "SELECT `userName` FROM `userTable` WHERE `userMail`='" $sUserMail "' AND `userPassword`='" $sUserPassword "'";
$stmntResult $dbObject->query$sQuery );

// auswerten
$sUserName null;
 
if ( 
$stmntResult ) {

 
   $sUserName $stmntResult->fetchPDO::FETCH_OBJ )->userName;

}

if ( 
is_null($sUserName) ) {
?>

    <div class="login-fehler">Fehler beim Login</div>

<?php

} else {

?>

    <div class="welcome">Hallo <?php echo $sSuserName?></div>

<?php

}

?>

</body> 
Hier wird permanent zwischen PHP und HTML gewechselt, was aus Sicht des Interpreters nicht sonderlich sinnvoll ist. Es spricht prinzipiell nichts dagegen, die Ausgabe von PHP-Variablen in die Ausgabe zu übernhehmen, wie es bspw. bei dem <div>-Tag mit der CSS-Klasse welcome zu sehen ist. Der bessere Weg wäre hier allerdings auch, die Ausgabe in der Verarbeitung vorzubereiten und die Ausgabe im Anschluß als gesamtes auszuliefern.


Gehe zu: