inspiron: andere Möglichkeit für Sprungmarke

Hallo,
ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.
Was muß ich verändern damit ich "$sql = "INSERT INTO.......";" nicht zwei mal schreiben muß?

Gruß

  
if (isset($_POST["eintragen"]))  
{  
$errors = array();  
//variablen auf inhalt prüfen und ggf. den fehler in das array $errors packen  
if ($_POST["Schicht"] == "") {  
  $errors[] = "Schicht";  
}  
if ($_POST['FEHLERKATEGORIE'] == "") {  
  $errors[] = "Kategorie";  
}  
// ist ein fehler aufgetreten?  
if (count($errors) > 0) {  
  //wenn ja, fehler ausgeben  
  $Meldung_1 = 'Sie m&uuml;ssen folgende Felder ausf&uuml;llen!<br />' . implode(', ', $errors);  
  } else {  
  //fragen ob "alles i.O." ausgewählt wurde  
  if ($_POST['FEHLERKATEGORIE'] == "alles i.O.") {  
  //wenn "alles i.O", weiter machen & Daten speichern  
  $Meldung_2 = "So,<br> Daten werden in der Datenbank gespeichert!<br>";  
  .  
  .  
  // es gibt keine Sprungmarke, wie weiter?  
  $sql = "INSERT INTO.......";  
  
  } else {  
  //wenn nicht,fragen ob in Beschreibung etwas drin steht  
  if ($_POST['BESCHREIBUNG'] == "") {  
  $Meldung_3 = 'Sie m&uuml;ssen das Feld Beschreibung ausf&uuml;llen!<br />';  
  } else {  
  //wenn ja, weiter machen & Daten speichern  
  $Meldung_4 = "So,<br> jetzt kann alles in der Datenbank gespeichert werden!<br>";  
  .  
  .  
  // es gibt keine Sprungmarke, wie weiter?  
  $sql = "INSERT INTO.......";  
  }  
  }  
  }  
}  

  1. Hi,

    ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.

    Ist der bisherige Code von dir?

    Was muß ich verändern damit ich "$sql = "INSERT INTO.......";" nicht zwei mal schreiben muß?

    Eine Abfrage, ob ein Fehler aufgetreten ist, bzw. in welcher Anzahl, hast du doch schon drin.
    Was hält dich davon ab, nach der gleichen Logik nicht nur mit den ersten Fehlern zu verfahren, sondern auch mit ggf. weiteren, folgenden?

    Potentielle Fehler abfragen, Anzahl/Status sammeln - und am Ende ein Mal auswerten, und davon abhängig INSERT oder nicht.

    Hast du schon etwas gegen die Problemtaik der SQL Injection unternommen? Wenn nicht, ist das deine nächste Baustelle.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hi,

      ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.

      Ist der bisherige Code von dir?

      Nein,
      ich möchte nur eine weitere Abfrage einfügen, wenn Selectfeld "FEHLERKATEGORIE" alles andere als  "alles i.O." ausgewählt (dort befinden sich ca 15 Fehlerangaben zur Auswahl) dann darf Textfeld "BESCHREIBUNG" nicht leer sein.

      Um das so zu machen wie Du vorschlägst, müßte ich dann alle 15 Fehlerangaben vergleichen, oder?

      Gruß

      1. Moin!

        Hi,

        ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.

        Ist der bisherige Code von dir?

        Nein,
        ich möchte nur eine weitere Abfrage einfügen, wenn Selectfeld "FEHLERKATEGORIE" alles andere als  "alles i.O." ausgewählt (dort befinden sich ca 15 Fehlerangaben zur Auswahl) dann darf Textfeld "BESCHREIBUNG" nicht leer sein.

        Um das so zu machen wie Du vorschlägst, müßte ich dann alle 15 Fehlerangaben vergleichen, oder?

        Nö.

        if (true  
            && (! 'alles i.O.' == $_POST['FEHLERKATEGORIE'])  
            && (''==trim($_POST['BESCHREIBUNG']))  
        ) {  
           beschwerde('Das Textfeld "BESCHREIBUNG" darf nicht leer sein, wenn es Beschwerden gibt.');  
        }  
          
          
        ## irgendwo...  
        function beschwerde($str) {  
          die '<p style="color:red">'.$str.'</p>';  
        }
        

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. ...ach,
          zu gleich gepostet, ich schaue mir das zu Hause mal an.

          Danke

        2. Hi fastix.

          if (true && [...])

          ???

          Viele Grüße,
          der Bademeister

          1. Moin!

            if (true && [...])

            ???

            Dient nur der übersichtlichen Notation. Mach ich vor allem dann wenn es mal wieder "ein paar" Bedingungen mehr werden.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

        3. if (true

          && (! 'alles i.O.' == $_POST['FEHLERKATEGORIE'])
              && (''==trim($_POST['BESCHREIBUNG']))
          ) {
             beschwerde('Das Textfeld "BESCHREIBUNG" darf nicht leer sein, wenn es Beschwerden gibt.');
          }

          
          > MFFG (Mit freundlich- friedfertigem Grinsen)  
          >   
          > fastix  
            
            
          Hallo,  
          kannst Du mir das bitte mal übersetzen, was das passiert!  
            
          Danke & Gruß
          
          1. Hi,

            kannst Du mir das bitte mal übersetzen, was das passiert!

            Frage du bitte konkret, wenn du einzelne Bestandteile nicht verstehst.
            Versuche aber bitte vorher, dich selber zu informieren.

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
          2. Moin!

            if (true
            wenn wahr wahr ist (... also immer)

            dann prüfe ob $_POST['FEHLERKATEGORIE'] auch den String ''alles i.O.' enhält.

            && (! 'alles i.O.' == $_POST['FEHLERKATEGORIE'])

            dann prüfe ob auch der getrimmte Inhalt von $_POST['BESCHREIBUNG'] (also das Formularfeld "Beschreibung") ein leerer String ist

            && (''==trim($_POST['BESCHREIBUNG']))

            und wenn das alles zutrifft

            ) {
               beschwerde('Das Textfeld "BESCHREIBUNG" darf nicht leer sein, wenn es Beschwerden gibt.');
            }

            führe die Funktion "beschwerde" mit dem String als Argument aus.

              
            
            > kannst Du mir das bitte mal übersetzen, was das passiert!  
            
            Kann es sein, dass Du noch sehr weit am Anfang des Lernens stehst?  
              
            Natürlich lässt sich das als Einzeiler notieren:  
            `if  ('alles i.O.' != $_POST['FEHLERKATEGORIE'] && ''==trim($_POST['BESCHREIBUNG'])){ beschwerde('Das Textfeld "BESCHREIBUNG" darf nicht leer sein, wenn es Beschwerden gibt.');}`{:.language-php}  
              
            ... ist aber nicht sehr übersichtlich.  
              
              
            MFFG (Mit freundlich- friedfertigem Grinsen)  
              
            fastix  
            
            -- 
            [Des fastix kleines CMS](http://www.fastix.org/fastix-cms/)
            
            1. Hallo,

              aber dann isses doch so wie folgendes, oder?

              if ($_POST['FEHLERKATEGORIE'] != "alles i.O." and $_POST['BESCHREIBUNG'] == "" ) {  
                $errors[] = "Beschreibung";  
              }
              

              Danke für Deine Bemühungen!

              Gruß

              1. Moin!

                Hallo,

                aber dann isses doch so wie folgendes, oder?

                if ($_POST['FEHLERKATEGORIE'] != "alles i.O." and $_POST['BESCHREIBUNG'] == "" ) {

                $errors[] = "Beschreibung";
                }

                
                >   
                > Danke für Deine Bemühungen!  
                  
                  
                Nicht ganz. Der and- Operator und der &&- Operator haben zwei verschiedene Bedeutungen:  
                  
                if (Bedingung1 and Bedingung2) -> Es werden immer beide Bedingungen geprüft.  
                  
                if (Bedingung1 && Bedingung2) -> Bedingung2 wird nur geprüft, wenn Bedingung1 erfüllt ist.  
                  
                Das mag nur wirklich zum Tragen kommen, wenn Bedingung2 eine Funktionsausführung ist, ist aber schon ein wesentlicher Unterschied:  
                  
                Beispiel mit "&&":  
                  
                ~~~php
                if (  
                    isset ($text)  
                    && '' != $text  
                    &&  file_put_contents($datei, $text)  
                ) {  
                  echo "Text wurde nach Datei geschrieben.";  
                } else {  
                  echo "Es wurde nichts an der Datei verändert.";  
                }
                

                Hier würde also gar nicht erst versucht $text auf den Inhalt zu prüfen, wenn die Variable nicht besetzt ist.
                Nachfolgend würde gar nicht erst versucht den Inhalt von $text in die Datei zu schreiben, wenn dieser leer ist.

                also wäre das ein:

                if (isset($text)) {  
                   if ('' != $text) {  
                     if (file_put_contents($datei, $text)) {  
                         echo "Text wurde nach Datei geschrieben.";  
                     }  
                  }  
                }
                

                Beispiel mit "AND":

                if (  
                    isset ($text)  
                    and '' != $text  
                    and  file_put_contents($datei, $text)  
                ) {  
                  echo "Irgend etwas oder nichts wurde nach Datei geschrieben.";  
                } else {  
                  echo "Die Datei ist unverändert.";  
                }
                

                Es würde geprüft ob $text besetzt ist UND es würde geprüft ob $text einen Inhalt hat (also auch die Notiz geworfen, dass $text nicht definiert sei) UND es würde versucht in die Datei zu schreiben.

                Das entspricht also Folgendem:

                $flag=false;

                  
                if (isset($text)) {  
                  $flag=true;  
                }  
                if ('' != $text) {  
                  $flag=true;  
                }  
                if (file_put_contents($datei, $text)) {  
                  $flag=true;  
                }  
                  
                if ($flag) {  
                  echo "Irgend etwas, vielleicht auch nichts, wurde geschrieben."  
                } else {  
                  echo "Die Datei ist unverändert.";  
                }
                

                if (''==$text) ist zwar formal das gleiche wie if ($text=='') aber es _soll_ so notiert werden, dass er fixe Wert links steht damit man beim Vergessen eines Zeichens if ($text='') nicht den Inhalt der Variable löscht und - das klappt ja stets sehr gut - immer ein true zurück bekommt. Solche Fehler sind nämlich _sehr_ schwer zu finden, werden ja auch nicht als Typo reklamiert. Wie auch.

                MFFG (Mit freundlich- friedfertigem Grinsen)

                fastix

                1. Hallo,

                  Der and- Operator und der &&- Operator haben zwei verschiedene Bedeutungen:
                  if (Bedingung1 and Bedingung2) -> Es werden immer beide Bedingungen geprüft.
                  if (Bedingung1 && Bedingung2) -> Bedingung2 wird nur geprüft, wenn Bedingung1 erfüllt ist.

                  woraus liest du das? AFAIK liegt der einzige Unterschied in der Rangfolge/Priorität der Operatoren.

                  So long,
                   Martin

                  --
                  Die letzten Worte des Polizisten:
                  Ich hab mitgezählt, Leute: Sechs Schuss, jetzt hat er keine Munition mehr!
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                  1. Moin!

                    woraus liest du das?

                    Verdammt. Falsche Programmiersprache oder schlechtes Lehrbuch... ich weiß es jetzt auch nicht.

                    Jedenfalls fast Du Recht, wie folgender kleiner Test ergibt:

                    <?php  
                    error_reporting(E_ALL);  
                      
                    print "\nfalse AND foo()? ";  
                    if (false AND foo()) {;}  
                      
                    print "\n\ntrue AND foo()? ";  
                    if (true AND foo()) {;}  
                      
                    print "\n\nfalse && foo()? ";  
                    if (false && foo()) {;}  
                      
                    print "\n\ntrue && foo()? ";  
                    if (true && foo()) {;}  
                      
                    print "\n\nfalse or foo()? ";  
                    if (false or foo()) {;}  
                      
                    print "\n\ntrue or foo()? ";  
                    if (true or foo()) {;}  
                      
                    print "\n\nfalse || foo()? ";  
                    if (false || foo()) {;}  
                      
                    print "\n\ntrue || foo()? ";  
                    if (true || foo()) {;}  
                      
                    function foo() {  
                       print "foo!";  
                       return true;  
                    }  
                    print "\n\n";  
                    ?>  
                    
                    

                    false AND foo()?

                    true AND foo()? foo!

                    false && foo()?

                    true && foo()? foo!

                    false or foo()? foo!

                    true or foo()?

                    false || foo()? foo!

                    true || foo()?

                    Das bedeutet - entgegen meiner Irrung - dass der rechte Vergleich nicht mehr stattfindet (foo() nicht ausgeführt wird) wenn die Bedingung erfüllt ist oder nicht mehr erfüllt werden kann.

                    MFFG (Mit freundlich- friedfertigem Grinsen)

                    fastix

      2. Hi,
        ich habe es so gemacht, hat lang gedauert bis es klick gemacht hat! :-)
        Es ist noch nicht ganz wie ich es möchte, vielleicht macht es ja nochmal klick.

          
        if ($_POST['FEHLERKATEGORIE'] != "alles i.O." and $_POST['BESCHREIBUNG'] == "" ) {  
          $errors[] = "Beschreibung";  
        }  
        
        

        Gruß

  2. ich weiß nicht weiter und benötige Hilfe um folgendes zu lösen.

    Was hat dein Problem mit PHP zu tun?
    Was hat dein Problem mit "Sprungmarken" (ich vermute Anker) zu tun?

    Was muß ich verändern damit ich "$sql = "INSERT INTO.......";" nicht zwei mal schreiben muß?

    Guckst du.

    1. Hi,

      Was hat dein Problem mit PHP zu tun?
      Was hat dein Problem mit "Sprungmarken" (ich vermute Anker) zu tun?

      Du vermutest falsch - ein GOTO-Statement, wie man es bspw. aus BASIC kennt, war gemeint.

      GOTO kennt PHP mittlerweile auch - allerdings ist von der Verwnedung eher abzuraten, weil das zu unsauberer Programmierung verleitet. Mit dem Sammeln von Fehlern und entsprechenden Abfragen bekommt man das auch ohne hin.

      MfG ChrisB

      --
      “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
      1. GOTO kennt PHP mittlerweile auch - allerdings ist von der Verwnedung eher abzuraten, weil das zu unsauberer Programmierung verleitet.

        Das xkcd-Comic am Ende der Dokumentationsseite hast du gesehen? ;)

        Refuctoring par excellence :p