Jnnbo: Kein Eintrag, wenn Feld leer - warum?

Moin,

ich habe ein kleines Problem und zwar sieht mein PHP wie folgt aus:


[.....]
if ($stmt = $mysqli->prepare("INSERT INTO web_faq (f_titel, f_inhalt, f_sort, f_status)
                              VALUES (?, ?, ?, ?)"))
{
			
$f_titel = $_POST["f_titel"];
$f_inhalt = $_POST["f_inhalt"];
$f_sort = $_POST["f_sort"];
$f_status = $_POST["f_status"];

$stmt->bind_param("ssss", $f_titel, $f_inhalt, $f_sort, $f_status);
}
[.....]

Der HTML Bereich sieht so aus:


<label for="f_status">Status:</label>
<input name="f_status" type="radio" id="f_status" value="1" <?php echo ($f_status == '1'?'checked="checked"':NULL) ?> /><span style="margin-left:8px; margin-right:10px;">Online</span>
<input name="f_status" type="radio" id="f_status" value="0" <?php echo ($f_status == '0'?'checked="checked"':NULL) ?> /><span style="margin-left:8px;">Offline</span>

Wenn dieses Feld _nicht_ausgefüllt ist, wird kein Eintrag in die MySQL Datenbank gemacht. Die Frage ist warum? Meine Tabelle in der Datenbank sieht so aus:

http://fs2.directupload.net/images/150311/8ap3vrjt.jpg

  1. Hallo,

    zum vermeintlichen PHP- oder SQL-Problem kann ich auf die Schnelle nichts sagen, aber zum HTML-Problem:

    <label for="f_status">Status:</label>
    
    > <input name="f_status" type="radio" id="f_status" value="1" <?php echo ($f_status == '1'?'checked="checked"':NULL) ?> /><span style="margin-left:8px; margin-right:10px;">Online</span>
    > <input name="f_status" type="radio" id="f_status" value="0" <?php echo ($f_status == '0'?'checked="checked"':NULL) ?> /><span style="margin-left:8px;">Offline</span>
    
    

    Du hast hier zwei Elemente mit derselben ID. Das kann bzw. darf nicht sein, weil damit die Eindeutigkeit verlorengeht. Gut möglich, dass damit dein beschriebener Effekt als Folgeproblem auftritt.

    Wenn dieses Feld _nicht_ausgefüllt ist, ...

    Was verstehst bei einem Set von zwei Radio-Buttons, von denen einer gesetzt sein muss, unter "ausgefüllt"?

    Ciao,  Martin

    --
    Ist die Katze gesund, freut sich der Hund. Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo,

      Was verstehst bei einem Set von zwei Radio-Buttons, von denen einer gesetzt sein muss, unter "ausgefüllt"?

      wenn ich die Seite aufrufe und einen neuen Eintrag erstelle ist noch kein Radiobutton ausgewählt, also muss ich einen anklicken, deshalb "ausfüllen"

      1. Hi,

        Was verstehst bei einem Set von zwei Radio-Buttons, von denen einer gesetzt sein muss, unter "ausgefüllt"? wenn ich die Seite aufrufe und einen neuen Eintrag erstelle ist noch kein Radiobutton ausgewählt, also muss ich einen anklicken, deshalb "ausfüllen"

        das sollte nicht sein - bei Radiobuttons ist vorgesehen, dass immer einer pro Gruppe aktiv ist, auch per Default. Und wenn du als Voreinstellung keinen aktivierst, darfst du dch nicht wundern, wenn das input-Element keine Formulardaten sendet: Radiobuttons, Checkboxes und herkömmliche Buttons senden nur dann ihr name/value-Pärchen, wenn sie beim Absenden des Formulars aktiviert waren.

        Works as designed.

        Die doppelt vergebene ID ist trotzdem ein Fehler, wenn auch vielleicht nicht der ausschlaggebende.

        Ciao,  Martin

        --
        ... und der FDP-Wähler gibt seine Stimme der FDP.    (Faszinierende Erkenntnis meines Gemeinschaftskunde-Lehrers, 9. Schuljahr) Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hallo,

          das sollte nicht sein - bei Radiobuttons ist vorgesehen, dass immer einer pro Gruppe aktiv ist, auch per Default. Und wenn du als Voreinstellung keinen aktivierst, darfst du dch nicht wundern, wenn das input-Element keine Formulardaten sendet: Radiobuttons, Checkboxes und herkömmliche Buttons senden nur dann ihr name/value-Pärchen, wenn sie beim Absenden des Formulars aktiviert waren.

          das wollte ich eigentlich auch und zwar so:

          
          <label for="f_status">Status:</label>
          <input name="f_status" type="radio" value="1" checked <?php echo ($f_status == '1'?'checked="checked"':NULL) ?> /><span style="margin-left:8px; margin-right:10px;">Online</span>
          <input name="f_status" type="radio"  value="0" <?php echo ($f_status == '0'?'checked="checked"':NULL) ?> /><span style="margin-left:8px;">Offline</span>
          
          

          Nur jetzt habe ich ein Problem wenn ich die Seite bearbeiten möchte, denn nun stört das "checked" deshalb habe ich es weg gelassen.

  2. Tach!

    Wenn dieses Feld _nicht_ausgefüllt ist, wird kein Eintrag in die MySQL Datenbank gemacht. Die Frage ist warum?

    Die Antwort steht vielleicht in der Fehlermeldung, die MySQL wirft. Wertest du die aus? Eine Fehlerbehandlung ist in deinen Codeausschnitten nicht zu sehen. Wie das grundlegend geht, steht in den Beispielen im Handbuch: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php. In der Praxis muss man sich dazu aber geeignetere Lösungen ausdenken, als den Anwender mit solchen internen Meldungen zu beglücken.

    dedlfix.

    1. Hallo,

      Die Antwort steht vielleicht in der Fehlermeldung, die MySQL wirft. Wertest du die aus? Eine Fehlerbehandlung ist in deinen Codeausschnitten nicht zu sehen. Wie das grundlegend geht, steht in den Beispielen im Handbuch: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php. In der Praxis muss man sich dazu aber geeignetere Lösungen ausdenken, als den Anwender mit solchen internen Meldungen zu beglücken.

      ich lass die Fehlermeldungen so ausgegeben: echo $mysqli -> error; wird allerdings nichts ausgegeben.

      1. Tach!

        ich lass die Fehlermeldungen so ausgegeben: echo $mysqli -> error; wird allerdings nichts ausgegeben.

        Kann natürlich sein, dass da wirklich keine kommt. Woran genau siehst du, dass kein Eintrag erfolgte?

        dedlfix.

    2. Hallo,

      in meiner error.log steht folgendes:

      "Undefined index: f_status in der Datei hinzufuegen.php on line 84"

      Dort steht folgendes:

      $f_status = $_POST["f_status"];

  3. Moin

    $f_titel = $_POST["f_titel"];
    
    > $f_inhalt = $_POST["f_inhalt"];
    > $f_sort = $_POST["f_sort"];
    > $f_status = $_POST["f_status"];
    
    

    zu allererst: Warum immer dieses umkopieren? Warum nutzt du nicht das $_POST-Array as it is?

    Als Zweites. Was sagt var_dump($_POST);?

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Moin,

      Als Zweites. Was sagt var_dump($_POST);?

      es kommt folgendes nach dem abschicken raus:

      
      ["f_titel"]=> string(12) "Test - Titel"
      ["f_inhalt"]=> string(13) "Test - Inhalt"
      ["f_sort"]=> string(0) ""
      ["abschicken"]=> string(15)
      
      
      1. Hallo

        Als Zweites. Was sagt var_dump($_POST);?

        
        
        > ["f_titel"]=> string(12) "Test - Titel"
        > ["f_inhalt"]=> string(13) "Test - Inhalt"
        > ["f_sort"]=> string(0) ""
        > ["abschicken"]=> string(15)
        > 
        
        

        Womit sich ] erklärt, was wiederum recht gibt. Ob damit der Query scheitert, müsstest du mal prüfen.

        Als Standard für das Feld „f_status“ hast du ja 0 festgelegt. Mir stellt sich hier allersings die Frage, ob die Zahl 0 in das Schema für enum passt, denn laut Handbuch sind die Werte in einem solchen Feld String-Objekte. Es könnte also sein, dass sich MySQL am Typ des Standardwerts, den es statt der fehlenden Übergabe eines Werts im Query benutzt, stört (Zahl vs. String).

        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!" ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

          ja!

          Als Standard für das Feld „f_status“ hast du ja 0 festgelegt. Mir stellt sich hier allersings die Frage, ob die Zahl 0 in das Schema für enum passt, denn laut Handbuch sind die Werte in einem solchen Feld String-Objekte. Es könnte also sein, dass sich MySQL am Typ des Standardwerts, den es statt der fehlenden Übergabe eines Werts im Query benutzt, stört (Zahl vs. String).

          MySQL "stört sich nicht daran", macht aber Fehler (bringt die Daten in Verwirrung).

          Angenommen, Du definierst als Vorgabewerte ('0','2','4','6','8') und isertest oder updatest das das Feld nun mit '3', dann findet MySQL '3' zwar nicht in der Liste, hat aber einen Wert im Set oder im Enum an der Index-Position 3 (= '4'). Der wird anstelle der fehlenden '3' nun genommen.

          Wenn das nicht für Datenverwirrung sorgt?

          Spirituelle Grüße Euer Robert

          --
          Möge der Forumsgeist wiederbelebt werden!
      2. Moin

        
        
        > ["f_titel"]=> string(12) "Test - Titel"
        > ["f_inhalt"]=> string(13) "Test - Inhalt"
        > ["f_sort"]=> string(0) ""
        > ["abschicken"]=> string(15)
        > 
        
        

        Aha. f_sort ist sozusagen '' da wird der Fehler liegen.

        mal ein einfacher Lösungsversuch. speichere die Werte von f_sort einfach mit der PHP Standardfunktion int_val()

        also intval($_POST["f_sort"])

        Gruß Bobby

        --
        -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <- ### Henry L. Mencken ### -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <- ### Viktor Frankl ### ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
        1. Moin,

          Aha. f_sort ist sozusagen '' da wird der Fehler liegen. mal ein einfacher Lösungsversuch. speichere die Werte von f_sort einfach mit der PHP Standardfunktion int_val() also intval($_POST["f_sort"])

          hab ich gerade mal getestet, leider ohne Erfolg :/

          1. Hallo,

            Aha. f_sort ist sozusagen '' da wird der Fehler liegen. mal ein einfacher Lösungsversuch. speichere die Werte von f_sort einfach mit der PHP Standardfunktion int_val() also intval($_POST["f_sort"])

            Vielen Dank, damit funktioniert es. Was mich jetzt allerdings wundert, er mach automatisch wenn nichts gewählt eine 1 warum?

            hab ich gerade mal getestet, leider ohne Erfolg :/

            Sorry, hatte es in einen falschen Ordner geladen!

            1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

              ja!

              Hallo,

              Aha. f_sort ist sozusagen '' da wird der Fehler liegen. mal ein einfacher Lösungsversuch. speichere die Werte von f_sort einfach mit der PHP Standardfunktion int_val() also intval($_POST["f_sort"])

              Vielen Dank, damit funktioniert es. Was mich jetzt allerdings wundert, er mach automatisch wenn nichts gewählt eine 1 warum?

              1. Wer ist "er"?
              2. siehe

              Spirituelle Grüße Euer Robert

              --
              Möge der Forumsgeist wiederbelebt werden!
            2. Hallo,

              ich hab jetzt echt die Schnauze voll mit dem hin und her. Folgendermaßen sieht nun mein Code aus:

              
              <label for="f_status">Status:</label>
              <input name="f_status" type="radio" <?php if(!isset($_GET['seitenID'])) {echo "checked";}?> value="1" <?php echo ($f_status == '1'?'checked="checked"':NULL) ?> /><span style="margin-left:8px; margin-right:10px;">Online</span>
              <input name="f_status" type="radio" value="0" <?php echo ($f_status == '0'?'checked="checked"':NULL) ?> /><span style="margin-left:8px;">Offline</span>
              
              

              wenn ich zum ersten Mal die Seite aufrufe, wird "checked" gesetzt, dieses mache ich so:

              <?php if(!isset($_GET['seitenID'])) {echo "checked";}?>

              Wenn in $_GET['seitenID'] etwas vorhanden ist, dann wird checked eben wieder gelöscht.

              Aus dem Typ "Enum" habe ich nun varchar (1) gemacht.

              Die ID habe ich ersatzlos rausgeworfen.

          2. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

            ja!

            Moin,

            Aha. f_sort ist sozusagen '' da wird der Fehler liegen. mal ein einfacher Lösungsversuch. speichere die Werte von f_sort einfach mit der PHP Standardfunktion int_val() also intval($_POST["f_sort"])

            ENUM('0','1') bleibt trotz der überlicherweise notwendigen Kontextbehandlung des Post-Parameters Scheiße!

            Und das intval() verschlimmert es hier vermutlich noch, da Der Index für '0' aus der Menge ('0','1') ind MySQL 1 lautet, und nicht 0.

            KEINE numerisch interpretierbaren Werte für die Defaults der Typen ENUM und SET verwenden!

            Spirituelle Grüße Euer Robert

            --
            Möge der Forumsgeist wiederbelebt werden!
  4. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

    ja!

    http://fs2.directupload.net/images/150311/8ap3vrjt.jpg

    5: ENUM mit numerischen Werten? Seit wann funktioniert das denn bei MySQL?

    Lies bitte nochmal bei MySQL nach, welche Subtypen für ENUM und SET erlaubt sind und bei PHP, wie die ggf. umgewandelt werden. Jedenfalls hatte ich mit einem "numerisch anmutenden String" bei ENUM und SET immer Probleme und meine auch, dass ein derartiger nach wie vor "verboten" ist (siehe hierzu MySQL-Handbuch)

    Spirituelle Grüße Euer Robert

    --
    Möge der Forumsgeist wiederbelebt werden!
    1. Hallo,

      5: ENUM mit numerischen Werten? Seit wann funktioniert das denn bei MySQL? Lies bitte nochmal bei MySQL nach, welche Subtypen für ENUM und SET erlaubt sind und bei PHP, wie die ggf. umgewandelt werden. Jedenfalls hatte ich mit einem "numerisch anmutenden String" bei ENUM und SET immer Probleme und meine auch, dass ein derartiger nach wie vor "verboten" ist (siehe hierzu MySQL-Handbuch)

      hab bis jetzt immer ENUM genommen. Gab noch nie Probleme und wir haben es auch so in einem Kurs gelernt.

      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        ja!

        Hallo,

        5: ENUM mit numerischen Werten? Seit wann funktioniert das denn bei MySQL? Lies bitte nochmal bei MySQL nach, welche Subtypen für ENUM und SET erlaubt sind und bei PHP, wie die ggf. umgewandelt werden. Jedenfalls hatte ich mit einem "numerisch anmutenden String" bei ENUM und SET immer Probleme und meine auch, dass ein derartiger nach wie vor "verboten" ist (siehe hierzu MySQL-Handbuch)

        hab bis jetzt immer ENUM genommen. Gab noch nie Probleme und wir haben es auch so in einem Kurs gelernt.

        Und was soll das jetzt heißen? Übersetz doch bitte mal aus "ich-bin-beleidigt-Deutsch" in Fachsprache ;-P

        Weil Ihr das immer falsch gemacht habt, ist es jetzt richtig? Weil der Dozent im Kursus keine Zeit bekommen hat, es ausführlich zu erklären, ist es jetzt richtig?

        Spirituelle Grüße Euer Robert

        --
        Möge der Forumsgeist wiederbelebt werden!
    2. Tach!

      http://fs2.directupload.net/images/150311/8ap3vrjt.jpg

      5: ENUM mit numerischen Werten? Seit wann funktioniert das denn bei MySQL?

      Lies bitte nochmal bei MySQL nach, welche Subtypen für ENUM und SET erlaubt sind und bei PHP, wie die ggf. umgewandelt werden. Jedenfalls hatte ich mit einem "numerisch anmutenden String" bei ENUM und SET immer Probleme und meine auch, dass ein derartiger nach wie vor "verboten" ist (siehe hierzu MySQL-Handbuch)

      Verboten ist da nichts, aber es macht nach wie vor Probleme. Die Frage ist, welchen Vorteil bietet ENUM mit einem solchen kurzen String? K(aum )einen. Ein Vorteil ist ja, dass etwas Speicher gespart wird, wenn statt des Strings nur ein Index-Wert abgelegt werden muss. Der fällt hier jedoch weg. Numerische Werte kann man direkt als solche ablegen. Die Begrenzung auf zwei Werte? Enum ist kein Sicherheitsfeature. 0 und "alles andere" sind auch zwei Werte.

      dedlfix.

      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        ja!

        Verboten ist da nichts,

        aber "verboten"!

        aber es macht nach wie vor Probleme. Die Frage ist, welchen Vorteil bietet ENUM mit einem solchen kurzen String? K(aum )einen.

        ENUM und SET gehören eigtentlich auch "verboten" und durch echte Relations (siehe hierzu Unterschied zwischen MyISAM und InnoDB) und Contraints ausgetauscht... :-P

        Ein Vorteil ist ja, dass etwas Speicher gespart wird, wenn statt des Strings nur ein Index-Wert abgelegt werden muss. Der fällt hier jedoch weg. Numerische Werte kann man direkt als solche ablegen. Die Begrenzung auf zwei Werte? Enum ist kein Sicherheitsfeature. 0 und "alles andere" sind auch zwei Werte.

        Man spart eigentlich weder Speicher noch Arbeit, sondern macht sich welche.

        Echte Nachschlage- oder Brückentabellen sind da von Anfang an viel sauberer und flexibler.

        Spirituelle Grüße Euer Robert

        --
        Möge der Forumsgeist wiederbelebt werden!
    3. Hi,

      http://fs2.directupload.net/images/150311/8ap3vrjt.jpg

      5: ENUM mit numerischen Werten? Seit wann funktioniert das denn bei MySQL?

      Wieso, es sind doch Strings?

      Lies bitte nochmal bei MySQL nach, welche Subtypen für ENUM und SET erlaubt sind und bei PHP, wie die ggf. umgewandelt werden. Jedenfalls hatte ich mit einem "numerisch anmutenden String" bei ENUM und SET immer Probleme und meine auch, dass ein derartiger nach wie vor "verboten" ist (siehe hierzu MySQL-Handbuch)

      http://dev.mysql.com/doc/refman/5.0/en/enum.html:

      If you wish to use a number as an enumeration value, you must enclose it in quotation marks. If the quotation marks are omitted, the number is regarded as an index. For this and other reasons—as explained later in this section—we strongly recommend that you do not use numbers as enumeration values.

      MfG ChrisB

      --
      Kids these days just don’t get ASCII art any more – it’s all UTF-this and Unicode-that with those youngsters … MfG ChrisB
      1. Tach!

        5: ENUM mit numerischen Werten? Seit wann funktioniert das denn bei MySQL? Wieso, es sind doch Strings? http://dev.mysql.com/doc/refman/5.0/en/enum.html: If you wish to use a number as an enumeration value, you must enclose it in quotation marks. If the quotation marks are omitted, the number is regarded as an index. For this and other reasons—as explained later in this section—we strongly recommend that you do not use numbers as enumeration values.

        Das war die weniger problematische Stelle. Die unangenehme etwas weiter unten auf erselben Seite besagt, dass diese Strings auch als Zahl und damit als Indexposition in der Liste der Werte interpretiert werden, wenn sie keinem der vorgegebenen Werte entsprechen.

        dedlfix.