Gregor: Mysql: Defaultwert wird nicht eingetragen :-(

Hi, bei einer Tabelle folgender Art wird beim Ausfüllen des Formulars weder das Feld tabellenTeile noch das Feld tabellenBeendet mit Nein ausgefüllt, wenn ich die Checkbox (ja) leerlasse.

Kann mir jemand sagen, warum?

CREATE TABLE tabellen (
  tabellenID int(6) NOT NULL auto_increment,
  UserID int(5) NOT NULL default '0',
  PostID int(5) NOT NULL default '0',
  tabellenTeile varchar(4) NOT NULL default 'nein',
  tabellenBeendet varchar(4) NOT NULL default 'nein',
  PRIMARY KEY  (tabellenID),
  KEY UserID (UserID),
  KEY PostID (PostID)
) TYPE=MyISAM;

Grüße

Gregor

  1. Hallo,

    Hi, bei einer Tabelle folgender Art wird beim Ausfüllen des Formulars weder das Feld tabellenTeile noch das Feld tabellenBeendet mit Nein ausgefüllt, wenn ich die Checkbox (ja) leerlasse.

    Checkboxen und anderes sind nicht wichtig.

    Das einzige, was zaehlt, ist die SQL-Query,
    mit der Du in die DB schreibst.

    "INSERT INTO tabellen ...."

    Lass Dir diesen fertigen String mal anzeigen,
    unmittelbar, bevor Du ihn an die DB schickst.

    Vielleicht geht Dir ein Licht auf.
    Sonst poste diesen String hier.

    Gruesse,

    Thomas

    1. Hm, ihr habt Recht, das stimmt.

      Aber heißt das im Klartext, daß ich die Checkboxen erst abfragen muß und demgemäß bei ausgefüllter Checkbox ein "ja" eintrage und sonst ein "nein" selber eintragen lassen muß?

      Grüße
      Gregor

      1. Hallo,

        Aber heißt das im Klartext, daß ich die Checkboxen erst abfragen muß und demgemäß bei ausgefüllter Checkbox ein "ja" eintrage und sonst ein "nein" selber eintragen lassen muß?

        Ja.

        Ich mache das jeweils etwa so:
        if ((isset($_REQUEST['meinebox'])) AND ($_REQUEST['meinebox']=='ja'))
          { $checksql=", feld='ja' "; }
        else
          { $checksql=""; }

        Kuerzere Schreibweise:
        $checksql=((isset($_REQUEST['meinebox'])) AND ($_REQUEST['meinebox']=='ja')) ? ", feld='ja' " : "";

        Weiter unten setze ich dann die Query zusammen:

        $query="INSERT INTO Tabelle SET var1='bla', var2='blubb'$checksql";

        Damit wird die fertige Query entweder zu:

        "INSERT INTO Tabelle SET var1='bla', var2='blubb', feld='ja' "
        oder zu
        "INSERT INTO Tabelle SET var1='bla', var2='blubb'

        Diese Methode kannst Du auch fuer mehrere Variablen brauchen.

        ---

        Falls Du es noch nicht getan hast, lies auch noch:
        http://www.dclp-faq.de/q/q-formular-checkbox.html

        Gruesse,

        Thomas

        1. Ich mache das jeweils etwa so:
          if ((isset($_REQUEST['meinebox'])) AND ($_REQUEST['meinebox']=='ja'))
            { $checksql=", feld='ja' "; }
          else
            { $checksql=""; }

          Kuerzere Schreibweise:
          $checksql=((isset($_REQUEST['meinebox'])) AND ($_REQUEST['meinebox']=='ja')) ? ", feld='ja' " : "";

          Hi Thomas,

          ich habs einfach so gemacht:

          if ($tabellenTeile != "ja") {
          $tabellenTeile = "nein"; }

          Grüße und danke

          Gregor

          1. Hallo Gregor,

            Bitte aendere nicht staendig das Subject </faq/#Q-20>, und wenn,
            dann nur so, dass es sinnvoll und aussagekraeftig ist </faq/#Q-06a>.
            Personennamen in Subjects sind uebrigens nicht gerade guter Stil.

            ich habs einfach so gemacht:

            if ($tabellenTeile != "ja") {
            $tabellenTeile = "nein"; }

            Das ist zwar einigermassen sicher, weil danach die Variable
            $tabellenTeile nur entweder "ja" oder "nein" enthaelt.
            Soweit OK.
            Und IMHO kannst Du diesen Wert dann auch gleich
            in die DB schreiben.

            Allerdings war im 1. Posting die Rede davon, dass
            bei nicht angekreuzter Checkbox _nichts_ in das Feld
            der DB geschrieben werden soll, damit die _DB_ ihren
            "default" Wert reinschreibt.

            Jetzt definierst Du den default-Wert aber ploetzlich in PHP.

            Das, was Du an meinem Schreibstil
            if ((isset($_REQUEST['meinebox'])) AND ($_REQUEST['meinebox']=='ja'))
            so "umstaendlich" findest, ist stabiler und zukunftssicherer
            als Deine Methode.

            Du verwendest einerseits die Formular-Werte einfach so weiter,
            indem Du auf sie als globale Variablen zugreifst.
            Das funktioniert nur in alten PHP-Versionen "einfach so".
            Bei neuen Versionen ist register_globals=off, und Du
            _musst_ $_REQUEST['meinebox'] bzw. $_GET/$_POST verwenden,
            um an die Parameter aus dem Formular oder der URL ranzukommen.
            http://www.dclp-faq.de/q/q-formular-register-globals.html

            Zudem pruefst Du nicht, ob die Variable ueberhaupt existiert.
            Das kann - wenn irgendjemand an der php.ini rumbastelt - zu
            (auch fuer den Endbenutzer sichtbaren) "Notices" fuehren:
            Notice:  Undefined variable: tabellenTeile in /pfad/tests.php on line xy
            Schreib mal ganz oben in Dein Script:
            error_reporting (2047);
            und staune...

            Lies zum Thema Formular-Variablen auch noch:
            http://www.dclp-faq.de/q/q-security-variablen.html
            http://www.dclp-faq.de/q/q-sicherheit-parameter.html

            Wenn Du Dinge aus Formularen u.s.w. in die Datenbank schreibst,
            solltest Du den String vorher _mindestens_ durch die Funktion
            mysql_escape_string() schicken.
            http://ch.php.net/manual/de/function.mysql-escape-string.php

            Gruesse,

            Thomas

            1. Hallo Gregor,

              Bitte aendere nicht staendig das Subject </faq/#Q-20>, und wenn,
              dann nur so, dass es sinnvoll und aussagekraeftig ist </faq/#Q-06a>.
              Personennamen in Subjects sind uebrigens nicht gerade guter Stil.

              Hi Thomas,

              Mann ist das hier ätzend, was die einfache Kommunikation angeht! In allen anderen Foren eckt man mit diesen Dingen nicht an!

              Aber zum Thema:

              Wußt ich nicht, daß event. in Zukunft das Script nicht mehr läuft :-( Danke für den Tip.

              Bei neuen Versionen ist register_globals=off, und Du
              _musst_ $_REQUEST['meinebox'] bzw. $_GET/$_POST verwenden,
              um an die Parameter aus dem Formular oder der URL ranzukommen.
              http://www.dclp-faq.de/q/q-formular-register-globals.html

              Aber woher weiß ich denn dann, welches von denen ich benutzen muß?

              Außerdem schade, daß php dadurch viel umständlicher zu schreiben ist.

              Grüße

              Gregor

              1. Hallo,

                $_REQUEST['meinebox'] bzw. $_GET/$_POST verwenden,
                um an die Parameter aus dem Formular oder der URL ranzukommen.
                Aber woher weiß ich denn dann, welches von denen ich benutzen muß?

                Bei <form method="GET"> bzw. beim Anhaengen an die URL
                stehen die Parameter in $_GET und in $_REQUEST.

                Bei <form method="POST"> stehen die Parameter
                in $_POST und in $_REQUEST.

                In $_REQUEST sind $_GET, $_POST und $_COOKIES enthalten.

                Ich verwende meist $_REQUEST, dann spielt es keine Rolle,
                wenn ich die Formulare mal von GET zu POST umstelle
                oder umgekehrt.

                Lies dazu auch:
                Sollte ich besser GET oder POST verwenden?
                http://www.dclp-faq.de/q/q-formular-methode.html

                Diese "Superglobalen" Variablen sind beschrieben im PHP-Manual:
                Predefined Variables (englisch, die deutsche Uebersetzung ist unvollstaendig/veraltet)
                http://www.php.net/manual/en/language.variables.predefined.php und
                http://www.php.net/manual/en/reserved.variables.php

                Außerdem schade, daß php dadurch viel umständlicher zu schreiben ist.

                Dafuer wird es sicherer.

                Ein Skript soll ja normalerweise nur eine definierte
                Menge von Parametern von "aussen" (GET/POST/COOKIE)
                verarbeiten.

                Also schreib am Anfang des Skripts die paar Zeilen rein,
                um diese Parameter in Variablen zu haben. Gleichzeitig
                kannst Du sie auch "harmlos machen" und pruefen, z.B.
                ob Parameter, die nur Zahlen enthalten duerfen, wirklich
                numerisch sind. Und Du kannst auch gleich die Default-Werte
                festlegen. Dann kannst Du im spaeteren Verlauf des Skripts
                sicher sein, dass die Variable definiert ist.

                $boxjanein=((isset($_REQUEST['meinebox'])) AND ($_REQUEST['meinebox']=='ja')) ? "ja" : "nein";
                // jetzt ist die Variable entweder "ja" oder "nein"

                $idzahl=(isset($_REQUEST['id'])) ? intval($_REQUEST['id']) : 0;
                // Jetzt ist die Variable 0 oder eine andere Ganzzahl.

                Von diesem Zeitpunkt an kannst Du im Skript ebenso auf
                $boxjanein und $idzahl zugreifen, wie Du es bisher getan hast.
                Aber Du kannst sicher sein, dass diese Variablen
                a) definiert sind
                b) nur Werte enthalten, die Du geprueft hast.

                Gruesse,

                Thomas

                1. Hi Thomas,

                  einmal noch schnell gegen die Netiquette verstoßen ;-)
                  Danke für die ausführliche und für mich sehr wegweisende Atwort. Habe sie mir gleich als Favoriten gespeichert und offline verfügbar gemacht.

                  Heißt also für mich, mein ganzes Script auf alle Variablen, die aus Formularen kommen, abzusuchen und auszutauschen?
                  Und sind auch die Variablen betroffen, die per URL übergeben wurden?

                  Und wie siehts mit denen aus, die über die SessionID kommen?

                  Danke nochmal und Gruß

                  Gregor

  2. hi,

    Hi, bei einer Tabelle folgender Art wird beim Ausfüllen des Formulars weder das Feld tabellenTeile noch das Feld tabellenBeendet mit Nein ausgefüllt, wenn ich die Checkbox (ja) leerlasse.

    Kann mir jemand sagen, warum?

    nicht, ohne deine query zu sehen, die die daten einträgt.

    m.W. darfst du dort das feld gar nicht erwähnen - es mit einem leerstring "" zu füllen, ist schon eine explizite wertbelegung.

    gruss,
    wahsaga