Vorgehensweise beim Überprüfen aller Variablen

Georgler

PC-Selbstbauer(in)
Vorgehensweise beim Überprüfen aller Variablen

Hi,

ich würde gerne alle POST-Variablen überprüfen und falls ein vorhersehbarer Fehler passiert,möchte ich eine angemessene Fehlermeldung ausgeben.

Ich habe bereits folgendes Geschrieben und wollte fragen, ob das so passt oder, ob es da deutlich übersichtlichere oder schnellere Möglichkeiten gibt.
PS: Keine Sorge, dass dort nirgendwo auf mögliche SQL-injections geprüft wird, ich benutzte Prepared Statements und soweit ich weiß ist damit jedes Risiko weg, belehrt mich eines besseren, falls ich da falsch liege :D.

PHP:
    //Überprüfung, ob Variablen überhaupt gesetzt sind
	if (isset($_POST["bla"], $_POST["blub"], $_POST["blab"], $_POST["blob"])) {
		$bla= $_POST["bla"];
		$blub= $_POST["blub"];
		$blab= $_POST["blab"];
        $blob= $_POST["blob"];
	} else {
		echo 'Fehler: Es wurden keine Daten übertragen.';
		exit; 
	}

    //Spezifischere Überprüfung der Variaben
	if (!is_numeric($bla) OR empty($blub, $blab) OR ($blob != "erlaubt1" AND $blob!= "erlaubt2")) {		
		echo 'Fehler: Keine validen Daten eingegeben oder nicht alle Felder ausgefüllt.';
		exit; 
	}
	if ($blub!= $blab) {
		echo 'Fehler: Blub und Blab stimmen nicht überein.';
		exit; 
	}
 
AW: Vorgehensweise beim Überprüfen aller Variablen

Das sieht schon einmal garnicht so schlecht aus ;)

Ich habe es zu meinen Anfängen mal so gemacht:
PHP:
// Unset zwecks möglichem register Globals
unset($param_a,$param_b,$param_c,$param_d);

// Prüfung der Variablen
$param["param_a"] = isset($_POST["param_a"]) ? (int) $_POST["param_a"] : (bool) false;
$param["param_b"] = isset($_POST["param_b"]) ? (float) $_POST["param_b"] : (bool) false;
$param["param_c"] = isset($_POST["param_c"]) ? (double) $_POST["param_c"] : (bool) false;
$param["param_d"] = isset($_POST["param_d"]) ? mysqli_escape_string((string) $_POST["param_d"]) : (bool) false;

// Erzeugen der Fehlermeldungsvariable
$iferror = false;
$errors = "";

// Prüfen auf Fehler und erzeugen eines Eintrages in den Fehlermeldungen
foreach($param as $key => $value) {
  if($value === false) {
    $errors .= "Kein Wert für ".$key."\r\n";
    $iferror = true;
  }
}

// Entscheiden, ob Fehlermeldungen ausgegeben werden oder alles ok ist
if($iferror) {
  echo $errors;
} else {
  echo "OK";
}
Ist zugegeben nicht die schönste Methode. Aber dafür funktioniert sie recht gut und gerade von Einsteigern ist sie leicht zu verstehen.
 
AW: Vorgehensweise beim Überprüfen aller Variablen

Ist es nicht theoretisch langsamer ganz häufig die isset-Funktion zu nutzen?

Deswegen habe ich auch erstmal alle Variablen in einem isset überprüft.
 
AW: Vorgehensweise beim Überprüfen aller Variablen

Ist es nicht theoretisch langsamer ganz häufig die isset-Funktion zu nutzen?

Deswegen habe ich auch erstmal alle Variablen in einem isset überprüft.

Isset prüft bei Mehrfachangaben alle intern nach und nach ab. Ich bevorzuge eine deutliche Übersichtlichkeit und verarbeite das ganze in Blöcken. Zuerst wird geprüft, ob die Variablen gesetzt sind und der Inhalt wird gemäß dem Datentyp umgewandelt. Dann werden die Werte nach Erwartung geprüft (ist das drin, was drin sein soll) und wenn beide Blöcke ok sind, werden die Daten als nächstes verarbeitet. Aber das ist wie gesagt Geschmackssache. Wirklich langsamer wird es dadurch auch nicht. ;)
 
AW: Vorgehensweise beim Überprüfen aller Variablen

könnte man das nicht auch "automatisieren" irgendwie? kA ob das ne tolle lösung wäre, aber wie wärs mit nem array, das alle keys/input-felder-namen aufnimmt und dann mittels for each diese keys prüft. entweder setzt man als wert des arrays[key] dann nen true false flag-value oder eben den feld-value oder so. irgendwas, womit man prüfen kann, ob das nun gesetzt war oder nicht.
 
AW: Vorgehensweise beim Überprüfen aller Variablen

könnte man das nicht auch "automatisieren" irgendwie? kA ob das ne tolle lösung wäre, aber wie wärs mit nem array, das alle keys/input-felder-namen aufnimmt und dann mittels for each diese keys prüft. entweder setzt man als wert des arrays[key] dann nen true false flag-value oder eben den feld-value oder so. irgendwas, womit man prüfen kann, ob das nun gesetzt war oder nicht.
Nein du kommst an isset nicht vorbei. Versuchst du, einen nicht existenten Wert aus einem nicht existenten Schlüssel zu übergeben, wird das vom PHP-Interpreter direkt mit einer Fehlermeldung bestraft.

Das mit dem Flag wäre natürlich möglich. Aber ob es dann ncoh so schön übersichtlich wäre, ist die zweite Sache.
PHP:
$params["key"]["value"] = "test";
$params["key"]["isset"] = true;
Du hast zwar den Vorteil dabei, das du theoretisch auch Booleans in den Werten verwenden kannst (zum Beispiel Checkboxen). Da aber von den Formularen eh alles, was im Attribut Value steht als String an den Server gesendet wurde, kann man das bei der Überprüfung für sich nutzen. Ich würde mir daher den zusätzlichen Speicher für die Flags sparen. Aber das ist wie gesagt immer vom Stil abhängig und muss es selbst für sich wissen.

EDIT: Automatisieren lässt sich das bestimmt. Ich habe da mal kurz etwas geschrieben. Ist zwar nicht getestet. Aber das Prinzip könnte ich mir so vorstellen:
PHP:
<?php
    // Erzeuge Konstanten für Datentypen (ich hasse Flags als Strings zu verwenden xD)
    define("DATATYPE","type",true);
    define("REQUIRED","req",true);
    
    define("INTEGER",1,true);
    define("FLOAT",2,true);
    define("STRING",3,true);
    
    // Erzeuge eine Formularreferenz
    $params["param1"][DATATYPE] = INTEGER;
    $params["param1"][REQUIRED] = true;
    
    $params["param2"][DATATYPE] = STRING;
    $params["param2"][REQUIRED] = true;
    
    $params["param3"][DATATYPE] = FLOAT;
    $params["param3"][REQUIRED] = true;

    // Die Automation als Funktion
    function get_all_form_data($form_template) {
        foreach($form_template as $entry => $option) {
            if(isset($_POST[$entry])) {
                switch($option[DATATYPE]) {
                    case INTEGER:
                        $returned_array[$entry] = (int) $_POST[$entry];
                        break;
                    case FLOAT:
                        $returned_array[$entry] = (float) $_POST[$entry];
                        break;
                    case STRING:
                        $returned_array[$entry] = (string) $_POST[$entry];
                        break;
                    default:
                        $returned_array[$entry] = $_POST[$entry];
                }
            } elseif(!isset($_POST[$entry] && $option[REQUIRED] == true)) {
                return false;
            }
        }
        return $returned_array;
    }
    
    // Einsetzen der Funktion
    $post_data = get_all_form_data($params);
    
    // Rückgabe prüfen und weiter im Text
    if($post_data === false) {
        echo "Nicht vollständig augefüllt";
    } else {
        echo "Vollständig ausgefüllt. Daten können weiterverarbeitet werden";
    }
?>
Steinigt mich, wenn dader ein oder andere Fehler drin ist. Ich bin seit über 36 Stunden auf und freue mich auf mein Bett :lol:
 
Zuletzt bearbeitet:
AW: Vorgehensweise beim Überprüfen aller Variablen

Das mit dem Flag wäre natürlich möglich. Aber ob es dann ncoh so schön übersichtlich wäre, ist die zweite Sache.

Kommt halt immer auf die Implementierung an. Du kannst wie der Code der automatisierung schon zeigt, das ganze in einer Funktion oder einem Objekt kapseln. Dadurch wird der operative Code durchaus übersichtlich bleiben. Gerade dann, wenn du die Formular-Referenz in einer Datei oder der Datenbank speicherst. Damit könnte man auch einen Formulargenerator basteln. Aber das würde für diesen Thread schon wieder zu weit gehen. ;)
 
Zurück