PHP - Funktionsparameter auswerten

  • PHP

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Link275.

    PHP - Funktionsparameter auswerten

    Hallo Community,

    ich habe aktuell ein kleines - großes Problem. Und zwar habe ich mehrere Funktionen, welche wiederum mehrere Funktionsparameter haben.
    Hier ein kleines Beispiel:

    PHP-Quellcode

    1. ​public function createEvent ($title, $desc, $date, $categorie, $inform = FALSE) {
    2. ....
    3. }


    Ich möchte nun überprüfen ob nicht alle verlangten Parameter übergeben wurden und wenn das der Fall ist, soll eine Fehlermeldung ausgegeben werden.
    Im Moment habe ich das ganze so gelöst das ich jedem Parameter einen Wert zugewiesen habe und dann innerhalb der Funktion über eine If-Abfrage die Parameter prüfe.

    Das ist allerdings wie ich finde sehr umständlich und viel Code. Hier mal eine Demonstration :S

    PHP-Quellcode

    1. public function createEvent ($title = "", $desc = "", $date = "0000-00-00", $categorie = 0, $inform = FALSE) {
    2. if(isset($title) and isset($desc) and isset($date) and is_numeric($categorie) and isset($inform)){
    3. ....
    4. }else{
    5. echo "Fehler ...";
    6. }
    7. }


    Kennt vielleicht jemand eine simplere Lösung?

    MfG. Linke ;)
    Dein Demo Code ergibt keinen wirklichen Sinn ... versuchs damit:

    PHP-Quellcode

    1. function createEvent($title, $desc, $date, $categorie, $inform = FALSE)
    2. {
    3. if(!$title) throw new Exception('$title is NULL');
    4. if(!$desc) throw new Exception('$desc is NULL');
    5. if(!$date) throw new Exception('$date is NULL');
    6. if(!$categorie) throw new Exception('$categorie is NULL');
    7. // Deine Logik
    8. }


    PS: Wenn $inform nicht gegeben ist gilt der festgelegte Default false (siehe $inform = FALSE).
    Das ist ja theoretisch das selbe, mein Ziel ist es ja nicht statt meinem Code etwas anderes zu schreiben, was das selbe macht. Ich möchte das ganze ja vereinfachen und eben nicht für jede variable eine abfrage machen, sondern nur wenn eine leer ist/fehlt, eine Meldung ausgeben.

    Oder ist es der beste weg, wenn man jeden Parameter einzeln überprüft?

    Sagen wir mal der Code sieht wie folgt aus:

    PHP-Quellcode

    1. function createEvent($title, $desc, $date, $categorie, $inform = FALSE)
    2. {
    3. echo "Programm";
    4. }
    5. createEvent("", "", "", 1);

    Dann ist die Ausgabe "Programm", dass soll aber nicht passieren. Es soll stattdessen eine Meldung erscheinen welche angibt, das nicht alle Parameter vorhanden sind, da sie leer sind und das fortlaufende Programm fehlerhaft wäre.
    Weil es z.B. einen leeren Datenbank-Eintrag anlegen würde.
    Wie willst du sonst die Parameter prüfen, es geht nicht anders. Du könntest zwar was mit func_get_args basteln aber dann isses halt Kacke.
    Die func_get_args haben mich auf eine Idee gebracht, die zu funktionieren scheint, flexibeler (in Bezug auf die Anzahl der Parameter) und kürzer ist.

    PHP-Quellcode

    1. function createEvent($title, $desc, $date, $categorie, $inform = FALSE)
    2. {
    3. $paraArray = func_get_args();
    4. foreach($paraArray as $para){
    5. if(!$para){
    6. echo "Fehler!";
    7. return;
    8. }
    9. }
    10. }
    11. createEvent("", "", "", 1);


    Vielleicht auch nicht das genialste aber es erfüllt seinen Zweck. 8)
    Ich würde ja eher mit Exceptions arbeiten, anstelle des Outputs voll zu spamen, aber das ist deine Sache.

    Als letztes Wort meinerseits:
    Das kannste schon so machen, aber dann isses halt kacke.

    slice schrieb:

    Ich würde ja eher mit Exceptions arbeiten, anstelle des Outputs voll zu spamen, aber das ist deine Sache.

    Als letztes Wort meinerseits:
    Das kannste schon so machen, aber dann isses halt kacke.


    Wieso Outputs spammen? Es wird nur einmal etwas ausgegeben und danach die Funktion beendet. Eine Exception würde doch auch etwas ausgeben? Bzw. wäre das ja das Ziel, damit man weiß was schief gelaufen ist.

    PHP-Quellcode

    1. function createEvent($title, $desc, $date, $categorie, $inform = FALSE)
    2. {
    3. $paraArray = func_get_args();
    4. foreach($paraArray as $para){
    5. if(!$para){
    6. throw new Exception(' ist leer!');
    7. }
    8. }
    9. }
    10. try {
    11. createEvent("", "", "", 1);
    12. }catch (Exception $ex) {
    13. echo 'Fehler:'.$ex->getMessage();
    14. }
    Hi,

    da hat @slice schon recht.
    Außerdem liefert func_get_args() eh nur die übergebenen Parameter. Wie soll's da zu ner Exception kommen? Wenn in der Schleife doch eh nur die durchlaufen werden die auch übergeben wurden ^^

    Das einzig sinnvolle ist doch, dass man die Werte vorher festlegt (also als optionale Argumente). Dafür isses auch gedacht. So wie deine Funktion jetzt ist "musst" du sie quasi mit 4 Parametern aufrufen, und optional mit einem 5ten. Und das was du machst ist komisches rumgefummel. Entweder du übergibst deinen Shit ordentlich so wie es die Funktion erwartet (so wie du selbst sie ja schreibst) oder wenn du dich nicht entscheiden kannst was du jeweils übergeben willst dann mach einfach alle Argumente als optionale. Was eigentlich auch völliger Humbug ist weil dann brauchst du keine Funktion.
    Je mehr ich drüber nachdenke ... was in aller Welt treibst du da eigentlich?


    Link :thumbup:
    Hello World
    Ich möchte doch lediglich sicherstellen, das in den Übergeben Werten auch etwas drin steht. Wenn ich z.B. ein Formular anbiete welches über diese Funktion, von mir aus einen Datenbankeintrag anlegen soll, dann sollen die Einträge logischerweise nicht leer sein. Wenn sie aber doch leer sind soll das Programm beendet werden und eine einfache Meldung ausgegeben werden.

    Und genau dafür suche ich die einfachste und sicherste Möglichkeit.

    Link275 schrieb:

    Außerdem liefert func_get_args() eh nur die übergebenen Parameter. Wie soll's da zu ner Exception kommen? Wenn in der Schleife doch eh nur die durchlaufen werden die auch übergeben wurden


    Es werden ja auch immer alle Parameter übergeben ;), das ist nicht das was ich wissen will, sondern nur ob diese leer sind, also ist die Verwendung von func_get_args() doch möglich oder nicht?
    Die validierung der Daten sollte schon wesentlich früher stattfinden, in der Methode selbst solltest du nur noch die Parameter auf den richtigen Datentyp und die Wertigkeit überprüfen.
    Okay und wieso macht es keinen Sinn die Daten in der Funktion zu prüfen? Ist doch irgendwie einfacher als, es immer einzeln zu machen, jedesmal direkt in der Funktion zu prüfen, an einem "zentralen" Punkt.

    Wie würde es den bei dir aussehen, wenn du z.B. ein Formular mit mehreren Daten hast, welche über eine Funktion an die Datenbank weiter gegeben werden oder in ein Dokument gespeichert werden? Kannst du mir vielleicht mal ein Beispiel geben wie du alles Prüfst und deine Funktion aussehen würde
    Die Daten würde ich mit Javascript validieren (gültige E-Mail, PLZ oder was auch immer), in der Funktion würde ich die Parameter auf NULL prüfen sowie deren Inhalt escapen (weil Datenbank und so).
    Wie verknüpfe ich den Javascript anständig mit PHP? Ich kann mir zwar vorstellen wie ich die Formulareingaben mit Javascript überprüfe, aber nicht an welchem Punkt ich dann mit PHP einschreiten kann um den Rest zu erledigen, deshalb habe ich bisher alles nur mir PHP umgesetzt :huh: Oder kann ich mit Javascript den "Submit" abbrechen, wenn etwas falsch lief? Hab noch nicht viel mit Javascript in der Richtung gemacht.

    PS: Was mache ich denn wenn, der Nutzer Javascript deaktiviert hat? Dann ist die Validierung auch für'n Eimer ||

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xXLinkeXx“ ()

    Naja generell würde ich so eine Funktion wie du sie hast gar nicht erstellen. Im Endeffekt (das wird ja sicher nicht die einzige Datenbankeintragung sein) brauchst du so eine Funktion für jedes Formular das du via GET/POST absendest. Viel zu viel arbeit und entspricht nicht dem Gedanken der OOP.

    Hab mal was zusammengefummelt (ungetestet, sollte aber gehn):

    PHP-Quellcode

    1. <?php
    2. main::loadPage();
    3. ?>
    4. <?php
    5. //Der Code hier ist aufs wesentliche beschränkt. Im Normallfall solltest du für sowas einen Controller haben der das viel besser und umfangreicher löst.:
    6. class main{
    7. public static function loadPage(){
    8. //Hier der Code um zu ermitteln was die Seite ist die angezeigt wird. Vielleicht das aus $_GET['page'] oder so...
    9. $page = "das hier selbst coden. Validierung, file_exists etc.. versteht sich von selbst.";
    10. include './pages/' . $page . '.php';
    11. include './controller/' . $page . '.php';
    12. $allowed_actions = array('create', 'delete', 'edit', 'etc');
    13. if(isset($_REQUEST['action'])){
    14. $action = $_REQUEST['action'];
    15. if(in_array($action, $allowed_actions)){
    16. if(function_exists($action)){
    17. call_user_func($action);
    18. }
    19. }
    20. }
    21. }
    22. public static function managePost($key, $value){
    23. if(!isset($_POST[$key])){
    24. $_POST[$key] = $value;
    25. }
    26. }
    27. }
    28. // in controller/$page.php:
    29. function create(){
    30. main::managePost('inform', '0');
    31. DB::insertPOST('tabellenname', array('title', 'desc', 'date', 'categorie', 'inform'));
    32. }
    33. //In dener Datenbankklasse:
    34. class DB{
    35. public static function connect(){ /* ... */ }
    36. public static function exec(){ /* ... */ }
    37. public static function insertPOST($tbl, $fields){
    38. $query = "INSERT INTO `" . $tbl . "` ";
    39. $keys = "";
    40. $values = "";
    41. foreach($fields as $field){
    42. if(isset($_POST[$field])){
    43. $keys .= "`" . $field . "`, ";
    44. $values .= "'" . $_POST[$field] . "', ";
    45. }else{
    46. return false;
    47. }
    48. }
    49. $keys = @preg_replace('/\, $/', '', $keys);
    50. $values = @preg_replace('/\, $/', '', $values);
    51. $query .= "(" . $keys . ") VALUES (" . $values . ")";
    52. return self::exec($query);
    53. }
    54. }
    55. ?>
    56. <form method="POST" action="./dieseseite.php">
    57. <input type="text" name="title" placeholder="Titel"><br>
    58. <input type="text" name="desc" placeholder="Beschreibung"><br>
    59. <input type="text" name="date" placeholder="Datum (YYY-MM-DD)"><br>
    60. <input type="text" name="categorie" placeholder="Kategorie"><br> <!-- wahrscheinlich is das bei dir ne Select-box. PS: category, nicht categorie. Wenn dann categories als mehrzahl -->
    61. <input type="text" name="inform" placeholder="..."><br>
    62. <input type="hidden" name="action" placeholder="create">
    63. <p><input type="submit" name="submit" value="Jetzt erstellen"></p>
    64. </form>


    Angenommen du hast einen Front-controller (class main{}) den du in index.php aufrufst, der lädt dann quasi eben die Seite rein wenn's die Datei gibt (pages/seite.php) und schaut ob er ein controller findet in controller/seite.php (muss den gleichen dateinamen haben). Wenn ja schaut er ob ne action übergeben wurde und obs eine Funktion mit diesem Namen gibt, falls ja wird die aufgerufen. Da kann dann alles möglche drinstehn. Du solltest für jede Seite zusätzlich noch einen Controller haben der Funktionen enthält die nur auf der Seite gebraucht werden. So hast du Funktion und View getrennt. Und mit der DB::insertPOST-Funktion kannst Datenbankeintragungen machen, legst vorher einfach fest welche Felder (entpsricht den Spaltennamen) ausgewählt werden und trägst demnach ein.

    Das ist halt dann auch zentral. Das einzige was sich dann noch ändert ist lediglich der Tabellenname und die Felder. Die Funktion zur Prüfung ob alle Felder übergeben sind oder nicht erfolgen an zentraler Stelle (in DB::insertPOST() jetzt z.B.).

    Wenn du's so machst wie bisher, dann brauchst du den Prüfcode wieder für jedes Formular das abgesendet wird und jedes mal ne eigene Funktion. Da verlierst du irgendwann so richtig böse den Überblick. i guarantee it



    Link :thumbup:
    Hello World