david: werte in datenbank eintragen

hallo forum,

so will ich eintragen

$query="INSERT INTO kalenderdaten VALUES(NULL,'$Datum','$Uhrzeit','$Beschreibung')";

in meiner mysql datenbank:

-- Datenbank: kalender

--
CREATE DATABASE kalender DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci;
USE kalender;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle kalenderdaten
--
CREATE TABLE kalenderdaten (
  id int(11) NOT NULL default '0',
  Datum date NOT NULL default '0000-00-00',
  Uhrzeit int(11) NOT NULL default '0',
  Beschreibung varchar(100) collate latin1_general_ci NOT NULL default '',
  PRIMARY KEY  (id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
--
-- Daten für Tabelle kalenderdaten
--
warum kann ich da nix eintragen?
vielen dank
  1. Hi,

    $query="INSERT INTO kalenderdaten VALUES(NULL,'$Datum','$Uhrzeit','$Beschreibung')";

    Zwei Anmerkungen:

    1. Bitte poste mal ein "fertiges" Statement, d.h. mit befüllten Werten
    2. Du solltest dir angewöhnen auch die beim Insert die Spalten mit anzugeben, also im Stil von INSERT INTO tab (s1, s2) VALUES (v1, v2)

    Ansonsten: Kriegst du gar nichts eingefüllt oder nur einen Satz? Du hast deine ID nur als NOT NULL default '0' definiert UND als Primary Key. Wenn du jetzt aber NULL als Wert angibst wird die DB (vermute ich) versuchen den Standardwert einzufügen. Ist der aber bereits vorhanden verletzt das das Primary Key-Constraint.
    Entweder du gibst also einen eindeutigen Wert an oder du definierst die Spalte aus auto_increment o.ä.

    MfG
    Rouven

    --
    -------------------
    ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
    1. hallo

      1. Bitte poste mal ein "fertiges" Statement, d.h. mit befüllten Werten

      meinst du damit die eingetragenen werte?geht nicht siehe unten

      1. Du solltest dir angewöhnen auch die beim Insert die Spalten mit anzugeben, also im Stil von INSERT INTO tab (s1, s2) VALUES (v1, v2)
        ok

      Ansonsten: Kriegst du gar nichts eingefüllt oder nur einen Satz?

      es wird nix eingetragen

      $query="INSERT INTO kalenderdaten VALUES(NULL,'$Datum','$Uhrzeit','$Beschreibung')";

      $insert_ok=@mysql_query($query);
         if($insert_ok==false){
        echo("Eintrag konnte nicht eingetragen werden");

      nur die fehlermeldung kommt zurück

      Du hast deine ID nur als NOT NULL default '0' definiert UND als Primary Key.

      wollte ihn auch als NULL definieren geht aber nicht(ppMyadmin - ich kann zwar ändern aber dem speichern is es wieder NOT NULL)
      in meinem formulat hat der user ja sowieso nicht die möglichkeit eine  id zu setzen

      vielen dank

      1. Hi,

        1. Bitte poste mal ein "fertiges" Statement, d.h. mit befüllten Werten
          meinst du damit die eingetragenen werte?geht nicht siehe unten

        Nein, ich meine das fertige Statement, also gewissermaßen
        echo $query;

        if($insert_ok==false){
          echo("Eintrag konnte nicht eingetragen werden");

        Gib mir mal noch mysql_error() mit aus. Oder nimm halt deine Ausgabe von oben und lass sie mal direkt in PHPMyAdmin laufen.

        Du hast deine ID nur als NOT NULL default '0' definiert UND als Primary Key.
        wollte ihn auch als NULL definieren geht aber nicht(ppMyadmin - ich kann zwar ändern aber dem speichern is es wieder NOT NULL)

        Das ist klar, ein Primary Key darf auch nicht NULL werden. Nur du hast dem System nicht gesagt, wo es denn jetzt einen herzaubern soll - Bisher hast du ihr nur gesagt "wenn ich nichts sage, dann nimm 0". Es gibt zwei grundsätzliche Möglichkeiten:

        1. Du sagt der Datenbank "nimm den hier", also müsstest du bei deinem Query irgend einen eindeutigen Wert für die ID-Spalte angeben
        2. Du lässt die Datenbank einen eindeutigen Wert generieren. Gewöhnlicherweise verwendet man hier Mechanismen wie auto_increment.

        MfG
        Rouven

        --
        -------------------
        ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
        1. so vielen dank an alle jetzt gehts

          stand irgendwie auf der leitung und hab den primary key mit autoincrement gleichgesetzt.
          also NULL in der DB heisst wenn der user nix angibt nimm den standart wert!
          wichtig autoincrement bei der id(NOT NULL) da sonst fehler weil werte (id) dopppelt.
          NOT NULL heißt schrei wenn der user nix eingibt, sonderfall: die db befüllt die spalte selber durch autoincrement.oder?

          $query="INSERT INTO kalenderdaten VALUES(NULL,'$Datum','$Uhrzeit','$Beschreibung')";

          das script stammt ja von nem lehrer.
          warum gibt man hier NULL an? es ist doch eh von der datenbank her geregelt

          $insert_ok=@mysql_query($query,$link);
          echo mysql_errno($link) . ": " . mysql_error($link). "\n";
          --------er sagt dass das argument falsch is--------------

          1. Ich fang mal hiermit an:

            $query="INSERT INTO kalenderdaten VALUES(NULL,'$Datum','$Uhrzeit','$Beschreibung')";
            warum gibt man hier NULL an? es ist doch eh von der datenbank her geregelt

            Wenn man beim INSERT NICHT die Spalten angibt, dann müssen auch für alle Spalten (und in der richtigen Reihenfolge) Werte zugewiesen werden. Deine Tabelle hat vier Spalten, das Statement
            INSERT INTO kalenderdaten VALUES ('$Datum', '$Uhrzeit', '$Beschreibung')
            hätte der Datenbank Fragezeichen ins Gesicht getrieben: welcher Wert ist denn hier wofür?? Um das verwenden zu können brauchst du eben genau die Spaltennamen...

            Wegen der Sache mit dem Primary-Key, da interpretierst du zu viel hinein.

            1. NULL vs. NOT NULL
              Jeder Spalte einer Tabelle kann als NULL oder eben als NOT NULL festgelegt werden. Umgangssprachlich ist NOT NULL nichts anderes als eine Pflichtangabe, während man eine NULL-bare Spalte getrost ignorieren kann.

            2. PRIMARY KEY
              Durch dieses Flag wird der Datenbank signalisiert, dass die angegebenen Spalte(n) (ja, dürfen auch mehrere sein) zusammen einen eindeutigen Wert in jeder möglichen Befüllung der Tabelle annehmen. Per Definition muss hierbei gelten, dass keiner der Werte NULL sein darf (deswegen setzt PHPMyAdmin dir das  auch automatisch).

            3. DEFAULT
              Du kannst für jede Spalte einen Default-Wert angeben. Wenn du an die Datenbank rantrittst und bei einem INSERT keinen Wert angibst, wird dieser Wert automatisch eingetragen. Ist z.B. sehr praktisch wenn man einen Zeitstempel "last modified" mitführen möchte. Man setze den Defaultwert auf NOW oder CURRENT TIMESTAMP oder was auch immer die jeweilige Datenbank da gerne nimmt und schon spart man sich das Eintragen per Skriptsprache oder die Angabe beim SQL-Befehl.

            MfG
            Rouven

            --
            -------------------
            ie:| fl:| br:> va:| ls:& fo:) rl:( n4:{ ss:) de:] js:| ch:? mo:} zu:|
      2. yo,

        die syntax (ohne angaben von spaltennamen), die du beim INSERT verwendest, setzt vorraus, dass das DBMS alle spaltenwerte in der gleichen reihenfolge mit werten füllen kann. Falls du nicht alle Werte einträgst, dann musst du auch die Spalten, welche gefüllt werden sollen mit angegeben.

        die ID spalte kannst du weglassen, falls es sich um eine spalte mit auto-increment hält. Da die spalte id bereits primary key ist, kannst du dir den contraint NOT NULL sparen. per defintiion ist jeder primary key NOT NULL und UNIQUE.

        Ilja