Jnnbo: Gleiches Formular: New & Edit

Moin,

ich komme gerade nicht wirklich weiter. Nutze ein gemeinsames Formular um Daten einzutragen und diese später wieder zu bearbeiten.

Meine Daten zum Editieren hole ich so:

// Prüfen ob GET gesetztz ist
if(isset($_GET['mID'])) { 
	
	$mID = $_GET['mID'];
	
	// Datensatz aus der Datenbank auslesen
	$stmt = $mysqli->prepare("SELECT user_code, user_type, user_nickname, user_passwort, ud_Uid, ud_name, ud_vorname, ud_strasse, ud_plz, ud_ort, ud_telefon, ud_email 
			          FROM web_users
			          LEFT JOIN web_users_detail ON web_users_detail.ud_Uid = web_users.user_code
			          WHERE ud_Uid =?
                                ");
	$stmt->bind_param("s", $mID);
        $stmt->execute();
	$stmt->bind_result($user_code, $user_type, $user_nickname, $user_passwort, $ud_Uid, $ud_name, $ud_vorname, $ud_strasse, $ud_plz, $ud_ort, $ud_telefon, $ud_email);
	$stmt->fetch();
    $stmt->close();
}

Meine Feldprüfung mache ich so (bei New):

value="<?=(isset($_POST['nickname'])) ? $_POST['nickname'] :''?>"

Jetzt habe ich ein kleiner Konflikt, ich benötige das value auch beim Editieren, da sollte das value mit "echo $user_nickname;" gefüllt werden. Wie komme ich dieses hin?

akzeptierte Antworten

  1. Tach!

    value="<?=(isset($_POST['nickname'])) ? $_POST['nickname'] :''?>"
    

    Jetzt habe ich ein kleiner Konflikt, ich benötige das value auch beim Editieren, da sollte das value mit "echo $user_nickname;" gefüllt werden. Wie komme ich dieses hin?

    Eingabe → Verarbeitung → Ausgabe (EVA-Prinzip). Die Ausgabe sollte keine Ahnung haben, wo irgendwelche Daten herkommen. Die Verarbeitung ist unter anderem dafür zuständig, die Daten für die Ausgabe bereitzustellen. Du könntest während der Verarbeitung ein Objekt oder Array erstellen, in dem die Werte für die Ausgabe stehen. Bei New sind es Leerstrings oder Default-Werte, bei Edit die Werte aus der Datenhaltung.

    dedlfix.

    1. Hallo dedlfix,

      Eingabe → Verarbeitung → Ausgabe (EVA-Prinzip). Die Ausgabe sollte keine Ahnung haben, wo irgendwelche Daten herkommen. Die Verarbeitung ist unter anderem dafür zuständig, die Daten für die Ausgabe bereitzustellen. Du könntest während der Verarbeitung ein Objekt oder Array erstellen, in dem die Werte für die Ausgabe stehen. Bei New sind es Leerstrings oder Default-Werte, bei Edit die Werte aus der Datenhaltung.

      also so?

      <input type="text" name="nickname" id="nickname" <?php if(isset($_GET['mID'])) {?> value="<?php echo $user_nickname;?>" <?php }?> <?php if(!isset($_GET['mID'])) {?> value="<?=(isset($_POST['nickname'])) ? $_POST['nickname'] :''?>" <?php }?>>
      
      
      1. Hallo Jnnbo,

        also so?

        <input type="text" name="nickname" id="nickname" <?php if(isset($_GET['mID'])) {?> value="<?php echo $user_nickname;?>" <?php }?> <?php if(!isset($_GET['mID'])) {?> value="<?=(isset($_POST['nickname'])) ? $_POST['nickname'] :''?>" <?php }?>>
        
        

        Nein. Eher so:

        <?php
        $user['nick'] = isset($_GET['mID']) ? $user_nickname : $_POST['nickname'];
        // …
        ?>
        
        <input type="text" name="nickname" id="nickname" value="<?php echo htmlspecialchars($user['nick']); ?>">
        

        Das passt mir immer noch nicht so ganz richtig, aber es trifft das Prinzip. Vielleicht möchtest du dich auch mit dem Model-View-Controller-Prinzip beschäftigen.

        LG,
        CK

      2. Hallo

        Eingabe → Verarbeitung → Ausgabe (EVA-Prinzip).

        also so?

        Najen!

        // initialisiere eine leere Variable (es könnte auch ein Arrayelement sein)
        $mName = '';
        if (isset($_GET['mID'])) {
        $mName = $user_nickname;
        }
        else if (isset($_POST['nickname'])) {
        $mName = $_POST['nickname'];
        }
        

        Ist der GET-Wert vorhanden, wird die Variable $mName mit $user_nickname befüllt, bei vorhandenem POST-Wert mit ihm selbst. Ansonsten bleibt sie einfach leer.

        Die Ausgabe geschieht dann „irgendwann“ später.

        <input type="text" name="nickname" id="nickname" value="<?php echo htmlspecialchars($mName); ?>">
        

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
        1. Hallo Auge,

          // initialisiere eine leere Variable (es könnte auch ein Arrayelement sein)
          $mName = '';
          if (isset($_GET['mID'])) {
          $mName = $user_nickname;
          }
          else if (isset($_POST['nickname'])) {
          $mName = $_POST['nickname'];
          }
          

          Ist der GET-Wert vorhanden, wird die Variable $mName mit $user_nickname befüllt, bei vorhandenem POST-Wert mit ihm selbst. Ansonsten bleibt sie einfach leer.

          Die Ausgabe geschieht dann „irgendwann“ später.

          <input type="text" name="nickname" id="nickname" value="<?php echo htmlspecialchars($mName); ?>">
          

          vielen Dank für den Code, funktioniert wunderbar. Dazu hätte ich allerdings noch eine Frage, muss ich dieses jetzt für jedes meiner Felder erstellen? Damit müsste ich natürlich sehr viel Code schreiben und gibt es einen Vorteil gegenüber meiner ersten Schreibweise?

          1. Tach!

            muss ich dieses jetzt für jedes meiner Felder erstellen? Damit müsste ich natürlich sehr viel Code schreiben und gibt es einen Vorteil gegenüber meiner ersten Schreibweise?

            Das ist der erste Schritt hin zur Trennung der Verantwortlichkeiten. Natürlich gibt das am Ende mehr Code, als wenn man einfach gradeaus durchprogrammiert. Aber je komplexer die Anfrderungen werden, desto weniger kann man gradeaus durchprogrammiern. Und dann muss man Maßnahmen ergreifen, die die Übersichtlichkeit fördern. EVA und das Erstellen von separat funktionsfähigen Einheiten sind der Anfang. Im professionellen Umfeld nimmt man andere Kaliber, beispielsweise die so genannten MVC-Frameworks. Die geben eine Struktur vor und zwingen dich sozusagen zur Ordnung.

            dedlfix.

          2. Hallo

            … muss ich dieses jetzt für jedes meiner Felder erstellen? Damit müsste ich natürlich sehr viel Code schreiben und gibt es einen Vorteil gegenüber meiner ersten Schreibweise?

            Dedlfix hat ja schon die Richtung vorgegeben. Ja, es wird mehr Code. Du hast aber, wenn du das konsequent umsetzt, auch mehr Übersicht im Code. Du wirst einen Block mit der Entgegennahme und Prüfung der Eingaben haben, einen oder mehrere mit der Verarbeitung der Daten (speichern, Änderung von X abhängig vom Wert von Y, etc. pp.) und einen zur Generierung der Ausgabe.

            Sauber formatiert und einigermaßen kommentiert, wirst du das nicht mehr missen wollen. Schon gar nicht, wenn du ein Projekt mal ein paar Wochen oder Monate liegen lässt. Ist der Code ein einziges Durcheinander, brauchst du nach einer so langen Pause Stunden oder Tage, um dich in dem Wust wieder zurecht zu finden. Wenn du einen Großteil der Zeit – und im Übrigen auch Nerven! – sparst, wirst du das Mehr an Code mit Freuden in Kauf nehmen. Schlussendlich, wenn du eine Weile auf diese Art arbeitest, wirst du, wenn du deines alten Codes gewahr wirst, die Hände über dem Kopf zusammenschlagen und frei nach Werner sagen: „O Gott! O Gott! O Gott! O Gott! O Gott! O Gott! O Gott! …“ und ganz zum Schluss (Minuten später) voller Inbrunst ausrufen: „Sieht das Scheiße aus!“. :-)

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
      3. Tach!

        also so?

        <input type="text" name="nickname" id="nickname" <?php if(isset($_GET['mID'])) {?> value="<?php echo $user_nickname;?>" <?php }?> <?php if(!isset($_GET['mID'])) {?> value="<?=(isset($_POST['nickname'])) ? $_POST['nickname'] :''?>" <?php }?>>
        

        Nein. $_GET und $_POST sind Bestandteil der Eingabedaten. Die haben nichts in der Ausgabe zu suchen. Ich meine: Es gibt ein generelles Objekt/Array, in dem alle Ausgabewerte gesammelt werden.

        $output = [];
        

        Wenn der New-Fall eintritt, dann erstellst du die Eigenschaften dafür.

        $output['type'] = 'new';
        $output['name'] = '';
        ...
        

        Und im Edit-Fall

        $output['type'] = 'edit';
        $output['name'] = $aus_der_Datenabfrage;
        ...
        

        Und nun gehts zur Ausgabe. Alle auszugebenden Werte stehen in $output. Wenn Dinge unterschiedlich gerendert werden sollen, dann kannst du den Wert in type befragen, ansonsten gibst du die Werte direkt aus (inklusive kontextgerechter Behandlung).

        <input type="text" name="nickname" value="<?=htmlspechialchars($output['name'])?>">
        

        dedlfix.

  2. @@Jnnbo

    value="<?=(isset($_POST['nickname'])) ? $_POST['nickname'] :''?>"

    So nicht!

    Die anderen haben htmlspecialchars() schon stillschweigend eingebaut, trotzdem noch mal der explizite Hinweis für später und für alle Zeiten:

    Niemals Daten aus GET, POST oder sonstiger zweifelhafter Herkunft unbearbeitet in HTML-Quellcode ausgeben!

    LLAP

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    1. Hallo Gunnar Bittersmann,

      Niemals Daten aus GET, POST oder sonstiger zweifelhafter Herkunft unbearbeitet in HTML-Quellcode ausgeben!

      Warum die Einschränkung?

      Niemals Daten unbearbeitet in HTML-Quellcode ausgeben!

      Bis demnächst
      Matthias

      --
      Signaturen sind bloed (Steel) und Markdown ist mächtig.
    2. Hallo Gunnar,

      Niemals Daten aus GET, POST oder sonstiger zweifelhafter Herkunft unbearbeitet in HTML-Quellcode ausgeben!

      die Daten gebe nur ICH ein und daher kann ich auf dieses wirklich verzichten. Ich weiß was ich eintrage und was nicht.

      1. Hallo Jnnbo,

        Niemals Daten aus GET, POST oder sonstiger zweifelhafter Herkunft unbearbeitet in HTML-Quellcode ausgeben!

        die Daten gebe nur ICH ein und daher kann ich auf dieses wirklich verzichten. Ich weiß was ich eintrage und was nicht.

        Das ist irrelevant, der Teufel ist ein Eichhörnchen und man hat schon Pferde kotzen sehen - vor Apotheken!

        Du kannst nie wissen, wo Code nochmal auftaucht. Und du bist selbst vor Fehlern auch nicht gefeit. Machs gleich richtig, dann ärgerst du dich hinterher nicht darüber.

        LG,
        CK

        1. Hallo Christian,

          Das ist irrelevant, der Teufel ist ein Eichhörnchen und man hat schon Pferde kotzen sehen - vor Apotheken!

          Du kannst nie wissen, wo Code nochmal auftaucht. Und du bist selbst vor Fehlern auch nicht gefeit. Machs gleich richtig, dann ärgerst du dich hinterher nicht darüber.

          was kann denn im schlimmsten Fall passieren? Die Datenbank leeren? Na gut dann spiele ich ein Backup ein das mir jede Nacht automatisch erstellt wird und gut ist. Ich persönlich sehe das nicht so eng.

          1. Hallo Jnnbo,

            was kann denn im schlimmsten Fall passieren?

            Du verwendest Code in einer Situation wieder, in der es wirklich_wichtig wäre und machst es falsch. Es schleust jemand Code für eine XSS- oder CSRF-Attacke ein. Usw, pp.

            Die Datenbank leeren? Na gut dann spiele ich ein Backup ein das mir jede Nacht automatisch erstellt wird und gut ist. Ich persönlich sehe das nicht so eng.

            Das ist doch sehr einfach zu beheben, warum willst du es partout nicht fixen?

            LG,
            CK

            1. Hallo Christian,

              Das ist doch sehr einfach zu beheben, warum willst du es partout nicht fixen?

              mein Projekt hast jetzt knapp 100 Dateien und ich sehe es nicht ein dass ich nur weil ein paar das so eng sehen meinen Code anzupassen. Ich muss noch knapp 15.000 Artikel eintragen da habe ich noch genug zu tun und Geld verdienen muss ich nebenher auch.

              1. Hallo

                mein Projekt hast jetzt knapp 100 Dateien und ich sehe es nicht ein dass ich nur weil ein paar das so eng sehen meinen Code anzupassen. Ich muss noch knapp 15.000 Artikel eintragen da habe ich noch genug zu tun und Geld verdienen muss ich nebenher auch.

                Wenn du Pech hast, weil ein Projekt klassisch platzt, ist's vorbei mit dem Geld verdienen. Bitte mal ein bisschen weiter denken als nur bis morgen.

                Tschö, Auge

                --
                Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
              2. Hallo Jnnbo,

                Das ist doch sehr einfach zu beheben, warum willst du es partout nicht fixen?

                mein Projekt hast jetzt knapp 100 Dateien und ich sehe es nicht ein dass ich nur weil ein paar das so eng sehen meinen Code anzupassen.

                Das hat ja nichts mit „eng sehen“ zu tun, sondern mit Erfahrungen, die man gemacht hat.

                Aber gut, mehr als es sagen kann und will ich nicht 😀

                LG,
                CK

          2. Hallo

            Du kannst natürlich darauf vertrauen oder darauf achten, keine Fehler zu machen. Du kannst es aber auch einmal richtig machen und hinterher nie wieder dran denken müssen. Zudem schleicht sioch in solchen Sachen immer eine ungute Routine ein. Irgendwann wirst du vielleicht ein Projekt erstellen, mit dem du nicht allein arbeitest. Wenn du dann aus Gewohnheit und weil du nicht mehr dran denkst die Prüfung weglässt, ist die Kacke am dampfen.

            Ich an deiner Stelle würde darauf verzichten wollen.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
            1. Hallo Auge,

              Du kannst natürlich darauf vertrauen oder darauf achten, keine Fehler zu machen. Du kannst es aber auch einmal richtig machen und hinterher nie wieder dran denken müssen. Zudem schleicht sioch in solchen Sachen immer eine ungute Routine ein. Irgendwann wirst du vielleicht ein Projekt erstellen, mit dem du nicht allein arbeitest. Wenn du dann aus Gewohnheit und weil du nicht mehr dran denkst die Prüfung weglässt, ist die Kacke am dampfen.

              Wenn das Projekt für die Öffentlichkeit wäre dann würde ich das wahrscheinlich auch anderes machen, aber ich benötige die Seite um Daten in meine Datenbank zu bekommen dass ich einfacher arbeiten kann, deshalb ist es mir auch nicht wirklich wichtig ob der Code irgendwelche Sicherheitsrelevanten Lücken hat, es läuft Lokal auf meinem Rechner, wenn Schädlicher Code rein kommt muss ich damit leben und kann nur mir selber die Schuld geben.

              Ich muss abwegen, alle Daten anzupassen und 1-2 Wochen nur damit beschäftigt zu sein, oder gut 15.000 Artikel in die Datenbank einzutragen um damit dann Geld zu verdienen. Ich entscheide mich erstmal fürs Geldverdienen.

              1. Tach!

                Wenn das Projekt für die Öffentlichkeit wäre dann würde ich das wahrscheinlich auch anderes machen, aber ich benötige die Seite um Daten in meine Datenbank zu bekommen dass ich einfacher arbeiten kann, deshalb ist es mir auch nicht wirklich wichtig ob der Code irgendwelche Sicherheitsrelevanten Lücken hat, es läuft Lokal auf meinem Rechner, wenn Schädlicher Code rein kommt muss ich damit leben und kann nur mir selber die Schuld geben.

                Es geht nicht nur darum, keine Angriffe zuzulassen. Es reicht, Sonderzeichen (Zeichen mit besonderer Bedeutung in einem bestimmten Kontext) auszugeben, um dir die Ausgabe kaputtzumachen.

                dedlfix.

              2. @@Jnnbo

                Ich muss abwegen, alle Daten anzupassen und 1-2 Wochen nur damit beschäftigt zu sein

                Daten anpassen?? Nein.

                Die Daten (in der Datenbank) sind nicht HTML-gerecht zu behandeln. Sondern deren Ausgabe in genau dem Moment, wo sie in den HTML-Kontext gebracht werden, d.h. bei echo.

                LLAP

                --
                „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)