Sarah Schüßler: MYSQL Fehler "Data truncated"

Hallo!
Ich will ein Anmeldeformular erstellen, in dem sich Leute für bestimmte Kurse anmelden können.
Ich habe die MySQL-Datenbank und PHP, etc installiert und implementiert.
Bei einfügen von Beispieldaten gibt er mir aber den Fehler "Data truncated for column 'termin' at row 1".
Hier mein Code:
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">

<title>Neue Aktivität hinzufügen</title>
</head>

<body>
<form name="form1" method="POST" action="Verbindung.php">
...
 <tr>
      <td>Termin</td>
      <td><select name="termin">
      <option value="13-10-2004">13-10-2004</option>
      <option value="b">b</option>
      </select></td>
    </tr>
...
</form>
</body>
</html>

Hier mein PHP-Code dazu:
<?php
include ('config.php');
$sarah = mysql_connect ($host, $user)
   or die(mysql_error());

$link = mysql_select_db($dbname,$sarah)
  or die(mysql_error());

$dbanfrage = 'INSERT into formular(id,titel,termin,arcgis,teilnehm,name,einricht,str,plz,ort,tel,fax,email) VALUES ("0","'.htmlspecialchars($_POST[titel]).'","'.htmlspecialchars($POST[termin]).'","'.htmlspecialchars($_POST['arcgis']).'","'.htmlspecialchars($_POST['teilnehm']).'","'.htmlspecialchars($_POST['name']).'","'.htmlspecialchars($_POST['einricht']).'","'.htmlspecialchars($_POST['str']).'","'.htmlspecialchars($_POST['plz']).'","'.htmlspecialchars($_POST['ort']).'","'.htmlspecialchars($_POST['tel']).'","'.htmlspecialchars($_POST['fax']).'","'.htmlspecialchars($_POST[email]).'")';
$fehler = mysql_query($dbanfrage,$sarah) or die(mysql_error());
echo 'Datenbankeintrag erfolgreich';
?>

Habe termin so definiert in meiner Datenbank/Tabelle:
termin enum('13-10-2004','b')

Weiß jemand woran es liegt? Habe auch schon die verschiedensten Änderungen bei den vordefinierten Variablen von termin gemacht(' anstatt ", etc)-hat aber alles nichts gebracht..
Hatte den Fehler auch schon bei titel, dort war in der HTML-Datei kein identischer Wert zu der Angabe(Länge, Set) in der Tabelle vorhanden. Aber diesmal stimmen sie ja überein, es kommt aber trotzdem der Fehler.
Hängt es vielleicht mit der Kollation zusammen?
Würde mich über Tipps, usw freuen!

  1. Hello,

    $dbanfrage = 'INSERT into formular(id,titel,termin,arcgis,teilnehm,name,einricht,str,plz,ort,tel,fax,email) VALUES ("0","'.htmlspecialchars($_POST[titel]).'","'.htmlspecialchars($POST[termin]).'","'.htmlspecialchars($_POST['arcgis']).'","'.htmlspecialchars($_POST['teilnehm']).'","'.htmlspecialchars($_POST['name']).'","'.htmlspecialchars($_POST['einricht']).'","'.htmlspecialchars($_POST['str']).'","'.htmlspecialchars($_POST['plz']).'","'.htmlspecialchars($_POST['ort']).'","'.htmlspecialchars($_POST['tel']).'","'.htmlspecialchars($_POST['fax']).'","'.htmlspecialchars($_POST[email]).'")';

    1. htmlspecialchars ist NICHT die adäquate Methode um die Datenbank vor fehlerhaften Eingaben zu schützen. Nutze stattdessen mysql_real_escape_string
    2. Lass dir das Statement bitte mal mit echo ausgeben, was steht denn _wirklich_ drin?

    Truncated klingt eigentlich nach "ich will da was einfügen aber das Feld ist zu klein"...

    MfG
    Rouven

    --
    -------------------
    Vegetarier essen meinem Essen das Essen weg.
    1. Hello,

      1. htmlspecialchars ist NICHT die adäquate Methode um die
        Datenbank vor fehlerhaften Eingaben zu schützen. Nutze
        stattdessen mysql_real_escape_string

      Habe ich jetzt umgestaltet, danke für euren Tipp!

      1. Lass dir das Statement bitte mal mit echo ausgeben, was steht »» denn _wirklich_ drin?

      Meinst du so:
      Wenn ich jetzt noch mit
      if( isset($_POST['submit']) ) {
      ...
      } else {echo mysql_error();}
      meine Fehler ausgeben lassen will erscheint ein  weißes Fenster. Ist auch kein neuer Datensatz in der Tabelle.

      Truncated klingt eigentlich nach "ich will da was einfügen aber das Feld ist zu klein"...

      MfG
      Rouven

      Das $dbanfrage habe ich in meiner PHP-Datei dort direkt angelegt. Es gibt nichts weiter dazu. Sorry, bin Anfänger. Dachte das wäre so richtig bzw. es müsste nirgendwo weiter "deklariert" werden.

      1. Hello,

        das meinte ich nicht. Lass mit echo $dbabfrage mal das wirkliche SQL-Statement ausgeben. Vielleicht steht da gar nicht das drin, was du glaubst!

        MfG
        Rouven

        --
        -------------------
        Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
        1. Hello,

          »» Lass mit echo $dbabfrage mal das wirkliche SQL-Statement ausgeben. Vielleicht steht da gar nicht das drin, was du glaubst!

          Wie mach ich das am dümmsten?? Einfach echo $dbanfrage nach meiner Insert into-Anweisung?
          Nehm ich besser Date oder Datetime für meine Termine? Habe jetzt erst einmal Date genommen,werden aber auch wieder keine datensätze übernommen.

          MfG
          Rouven

          1. Hello,

            Wie mach ich das am dümmsten?? Einfach echo $dbanfrage nach meiner Insert into-Anweisung?

            sobald das Ding halt vollständig zusammengebaut wurde, z.B. direkt vor mysql_query.

            Nehm ich besser Date oder Datetime für meine Termine? Habe jetzt erst einmal Date genommen,werden aber auch wieder keine datensätze übernommen.

            Na ja, da bietet sich die Frage an: speicherst du Zeitdaten? Wenn nein, warum solltest du dann Datetime verwenden wollen?

            MfG
            Rouven

            --
            -------------------
            Death is nature's way of telling you to slow down.
            1. Hello,

              Wie mach ich das am dümmsten?? Einfach echo $dbanfrage nach meiner Insert into-Anweisung?
              sobald das Ding halt vollständig zusammengebaut wurde, z.B. direkt vor mysql_query.

              Habe ich ja:
              $link = mysql_select_db($dbname,$sarah)
                or die(mysql_error());
              $dbanfrage = 'INSERT into ...';
              echo $dbanfrage;
              $fehler = mysql_query($dbanfrage,$sarah) or die(mysql_error());
              Wo ist mein Denkfehler?

              Nehm ich besser Date oder Datetime für meine Termine? Habe jetzt erst einmal Date genommen,werden aber auch wieder keine datensätze übernommen.
              Na ja, da bietet sich die Frage an: speicherst du Zeitdaten? Wenn nein, warum solltest du dann Datetime verwenden wollen?

              Na ich will Termine, also Tage bzw. Zeitspannen teilweise speichern, z.B. 12.10.-16-10.2007..Könnte ich das nicht durch xx.xx.xxxx=1 oder so (in einem Array) speichern? Aber das wäre ja wahrscheinlich umständlicher.

              MfG
              Rouven

              1. Hello,

                echo $dbanfrage;
                $fehler = mysql_query($dbanfrage,$sarah) or die(mysql_error());
                Wo ist mein Denkfehler?

                ja und was kommt da jetzt raus? Guck zur Not in den Quelltext, falls die Seite nicht angezeigt wird...

                Na ich will Termine, also Tage bzw. Zeitspannen teilweise speichern, z.B. 12.10.-16-10.2007..Könnte ich das nicht durch xx.xx.xxxx=1 oder so (in einem Array) speichern? Aber das wäre ja wahrscheinlich umständlicher.

                Zeitspannen ist mit einem Feld sowieso nicht. Wenn du 21.10.2007 19:00 bis 22.10.2007 09:00 speichern willst, brauchst du zwei Datetime Felder, oder ein Datetime für den Anfang und ein Zahlenfeld für die Dauer in Minuten, Stunden oder was auch immer (wobei diese Lösung suboptimal ist).

                MfG
                Rouven

                --
                -------------------
                Ambition is the last refuge of failure.  --  Oscar Wilde (Irish Poet, Novelist, Dramatist and Critic, 1854-1900)
                1. Hello,

                  echo $dbanfrage;
                  $fehler = mysql_query($dbanfrage,$sarah) or die(mysql_error());
                  Wo ist mein Denkfehler?
                  ja und was kommt da jetzt raus? Guck zur Not in den Quelltext, falls die Seite nicht angezeigt wird...

                  Dort ist nur die Überschrift zu sehen:
                  <html>
                  <head><title> Verbindungsaufbau</title></head>
                  <body>

                  </body>
                  </html>

                  Na ich will Termine, also Tage bzw. Zeitspannen teilweise speichern, z.B. 12.10.-16-10.2007..Könnte ich das nicht durch xx.xx.xxxx=1 oder so (in einem Array) speichern? Aber das wäre ja wahrscheinlich umständlicher.
                  Zeitspannen ist mit einem Feld sowieso nicht. Wenn du 21.10.2007 19:00 bis 22.10.2007 09:00 speichern willst, brauchst du zwei Datetime Felder, oder ein Datetime für den Anfang und ein Zahlenfeld für die Dauer in Minuten, Stunden oder was auch immer (wobei diese Lösung suboptimal ist).

                  Also wenn dann natürlich die Lösung mit den 2 Datetime-Feldern, wobei ich mich frage ob man die Zeitspanne 12.10.-16.10.2007 nicht als in einem Feld bzw. mit einem String/Variable deklarieren könnte.

                  MfG
                  Rouven

                  1. Hello,

                    Dort ist nur die Überschrift zu sehen:
                    <html>
                    <head><title> Verbindungsaufbau</title></head>
                    <body>

                    dann hast du irgendwo einen dicken Bock geschossen. Wie ist jetzt deine genaue Struktur von Includes und ...
                    Vielleicht kommen einfach keine Daten an, weil nie ein Befehl ausgeführt wird?

                    Also wenn dann natürlich die Lösung mit den 2 Datetime-Feldern, wobei ich mich frage ob man die Zeitspanne 12.10.-16.10.2007 nicht als in einem Feld bzw. mit einem String/Variable deklarieren könnte.

                    Weiche von mir! Nein, bloß nicht. Die einfache Lösung ist so gut wie nie die zukunftsträchtige. Dann kommst du nächste Woche ins Forum und fragst "wie kriege ich alle Termine für nächste Woche raus" und die Antwort lautet: "aus dem Format gar nicht".

                    MfG
                    Rouven

                    --
                    -------------------
                    Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
                    1. Hello,

                      Dort ist nur die Überschrift zu sehen:
                      <html>
                      <head><title> Verbindungsaufbau</title></head>
                      <body>
                      dann hast du irgendwo einen dicken Bock geschossen. Wie ist jetzt deine genaue Struktur von Includes und ...
                      Vielleicht kommen einfach keine Daten an, weil nie ein Befehl ausgeführt wird?

                      Ich hab nicht mehr Code wie ich in meinem ersten Posting geschrieben hab.
                      <?php
                      include ('config.php');...
                      ?>
                      Dort steht nur:(config.php)
                      <?php
                      $host="localhost";
                      $user="root";
                      $dbname="anmeldung";
                      $tabelle="formular";
                      ?>
                      Sollte ich dort die Datenbank verbinden?

                      Also wenn dann natürlich die Lösung mit den 2 Datetime-Feldern, wobei ich mich frage ob man die Zeitspanne 12.10.-16.10.2007 nicht als in einem Feld bzw. mit einem String/Variable deklarieren könnte.
                      Weiche von mir! Nein, bloß nicht. Die einfache Lösung ist so gut wie nie die zukunftsträchtige. Dann kommst du nächste Woche ins Forum und fragst "wie kriege ich alle Termine für nächste Woche raus" und die Antwort lautet: "aus dem Format gar nicht".

                      Na du hast mich überredet;-)Einen Tipp wie ich das am besten realisier?
                      Mmmh, wenn ich dich noch was fragen dürft:
                      wie mach ich das am besten wenn ich einen Eintrag aus dem Drop-down-Menü auswähle dass dann noch ein zusätzlicher Menüpunkt auftaucht? A la: Termin x -> Haben Sie x?

                      MfG
                      Rouven

                      1. Hello,

                        Sollte ich dort die Datenbank verbinden?

                        Du solltet vor allem erst einmal Struktur reinbringen in dein Projekt. :-)
                        Das Geheimnis heißt immer noch EVA, und das schon seit Herman Holerith.

                        Soweit ich das vorhin gesehen habe, sollte das Script zum Testen genügen.
                        Die Verbindung stellst Du ja her und fragst auch danach, ob es geklappt hat.

                        Das Statement kann man allerdings besser lesbar schreiben

                        $dbanfrage = "
                        INSERT into formular
                        set id = '".intval($id)."', ".
                            titel = '".mysql_real_escape_string($_POST['title'],$sarah)."', ".
                            termin = '".mysql_real_escape_string($_POST['termin'],$sarah)."', ".

                        usw.

                        Die Namen der Elemente des $_POST-Arrays sollten tunlichst in Häkchen geschrieben werden, damit si als Bezeichner erkannt werden und nicht versehentlich der Inhalt einer Konstante verwendet wird.

                        Ich bevorzuge die Variante mit SET beim Insert.
                        Ob Du die id zuweisen musst, hängt ganz von Deiner Tabellendefinition ab. Wenn sie als Autoincrement-Key angelegt wurde, ist dies nicht notwendig.

                        Dann wäre noch zu beachten, dass mysql_real_escape_string() die Daten nur wunschgemäß bearbeiten kann, wenn sie als Rohdaten zur Verfügung stehen. Bei ist PHP aber meistens die eigene Escape-Funktion eigeschaltet (siehe MAGIC QUOTES http://de.php.net/manual/de/ref.info.php#ini.magic-quotes-gpc und http://de.php.net/manual/de/function.get-magic-quotes-gpc.php).

                        Die muss man entweder ausschalten in der php.ini oder im virt-host oder in einer .htaccess-Datei oder man muss die Quotierungen erst wieder entfernen, bevor man mit den Daten aus $_POST etwas anfangen kann.

                        Wie das rekursiv für das ganze $_POST-Array geht, steht in den Benutzerkommentaren (UCN) der Beschreibung zur Funktion.

                        Das Truncating rührte mit sicherheit aus der falschen Maskierung.

                        Harzliche Grüße vom Berg
                        http://bergpost.annerschbarrich.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                        Nur selber lernen macht schlau
                        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                        1. Hello,

                          Sollte ich dort die Datenbank verbinden?

                          Du solltet vor allem erst einmal Struktur reinbringen in dein Projekt. :-)
                          Das Geheimnis heißt immer noch EVA, und das schon seit Herman Holerith.

                          Soweit ich das vorhin gesehen habe, sollte das Script zum Testen genügen.
                          Die Verbindung stellst Du ja her und fragst auch danach, ob es geklappt hat.

                          Das Statement kann man allerdings besser lesbar schreiben

                          $dbanfrage = "
                          INSERT into formular
                          set id = '".intval($id)."', ".
                              titel = '".mysql_real_escape_string($_POST['title'],$sarah)."', ".
                              termin = '".mysql_real_escape_string($_POST['termin'],$sarah)."', ".

                          Muss dort wirklich noch ". hinten stehen? Habe es vielfach ohne dies gesehen.

                          Die Namen der Elemente des $_POST-Arrays sollten tunlichst in Häkchen geschrieben werden, damit si als Bezeichner erkannt werden und nicht versehentlich der Inhalt einer Konstante verwendet wird.

                          Ich bevorzuge die Variante mit SET beim Insert.
                          Ob Du die id zuweisen musst, hängt ganz von Deiner Tabellendefinition ab. Wenn sie als Autoincrement-Key angelegt wurde, ist dies nicht notwendig.

                          Dann wäre noch zu beachten, dass mysql_real_escape_string() die Daten nur wunschgemäß bearbeiten kann, wenn sie als Rohdaten zur Verfügung stehen. Bei ist PHP aber meistens die eigene Escape-Funktion eigeschaltet (siehe MAGIC QUOTES http://de.php.net/manual/de/ref.info.php#ini.magic-quotes-gpc und http://de.php.net/manual/de/function.get-magic-quotes-gpc.php).

                          Die muss man entweder ausschalten in der php.ini oder im virt-host oder in einer .htaccess-Datei oder man muss die Quotierungen erst wieder entfernen, bevor man mit den Daten aus $_POST etwas anfangen kann.

                          Wie das rekursiv für das ganze $_POST-Array geht, steht in den Benutzerkommentaren (UCN) der Beschreibung zur Funktion.

                          Meinst du damit was in deinen 2 geposteten Links steht?
                          Habe in der php.ini die magic_quotes auf off gestellt, geht aber immer noch nicht.

                          Das Truncating rührte mit sicherheit aus der falschen Maskierung.

                          Harzliche Grüße vom Berg
                          http://bergpost.annerschbarrich.de

                          Tom

                          1. Hello,

                            $dbanfrage = "
                            INSERT into formular
                            set id = '".intval($id)."', ".
                                titel = '".mysql_real_escape_string($_POST['title'],$sarah)."', ".
                                termin = '".mysql_real_escape_string($_POST['termin'],$sarah)."', ".
                            Muss dort wirklich noch ". hinten stehen? Habe es vielfach ohne dies gesehen.

                            wenn es weiter gehen soll, ja.
                            Sonst natürlich nicht. Nach dem letzten SET steht dann nur noch   )."'";

                            Wenn Dein Script immer noch nicht funktioniert, muss es doch irgendwelche Fehlermeldungen ausspucken. Wie lauten die denn?

                            Harzliche Grüße vom Berg
                            http://bergpost.annerschbarrich.de

                            Tom

                            --
                            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                            Nur selber lernen macht schlau
                            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                            1. Hello,

                              $dbanfrage = "
                              INSERT into formular
                              set id = '".intval($id)."', ".
                                  titel = '".mysql_real_escape_string($_POST['title'],$sarah)."', ".
                                  termin = '".mysql_real_escape_string($_POST['termin'],$sarah)."', ".
                              Muss dort wirklich noch ". hinten stehen? Habe es vielfach ohne dies gesehen.

                              wenn es weiter gehen soll, ja.
                              Sonst natürlich nicht. Nach dem letzten SET steht dann nur noch   )."'";

                              Bei sind die Spalten bzw- Teile davon jeweils grün-schwarz markiert, er gibt mir auch eine Fehlermeldung aus:
                              Parse error: syntax error, unexpected '='
                              Stimmt das mit den ganzen ' und " auch? Hatte es nämlich ja erst ander herum, also anstatt " ' und anstatt '". Da war alles ok.

                              Wenn Dein Script immer noch nicht funktioniert, muss es doch irgendwelche Fehlermeldungen ausspucken. Wie lauten die denn?

                              Harzliche Grüße vom Berg
                              http://bergpost.annerschbarrich.de

                              Tom

                              1. Hello,

                                Stimmt das mit den ganzen ' und " auch? Hatte es nämlich ja erst ander herum, also anstatt " ' und anstatt '". Da war alles ok.

                                Wenn Dein Script immer noch nicht funktioniert, muss es doch irgendwelche Fehlermeldungen ausspucken. Wie lauten die denn?

                                Du solltest für den Anfang auch nicht gleich solche "Hammerstatements" produzieren.
                                Es reicht für den Anfang, wenn man ein Textfelt im HTML-Formular hat oder eine Textarea.
                                Dann erstmal das "Affenformular" aufbauen.
                                Wenn das fehlerfrei funktioniert, kannst Du an den Datenbankzugriff denken.
                                Und dann eben den Inhalt des einen Feldes in die Datenbank manövrieren.
                                Dabei kann schon genug schief gehen.

                                Wenn es mit dem Spaltentyp TEXT geklappt hat, kannst Du daran denken, andere Datentypen rein und raus zu transportieren.

                                Brich Dir nicht den Hals, weil Du gleich alles auf einmal anfängst.
                                Dann verlierst Du eher früher als später nur die Lust daran.

                                Setze Dir kleine Aufgaben und genieß die Erfolgserlebnisse "Hach, wieder 'was geklappt!"

                                Harzliche Grüße vom Berg
                                http://bergpost.annerschbarrich.de

                                Tom

                                --
                                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                Nur selber lernen macht schlau
                                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                1. Hello,

                                  Stimmt das mit den ganzen ' und " auch? Hatte es nämlich ja erst ander herum, also anstatt " ' und anstatt '". Da war alles ok.

                                  Wenn Dein Script immer noch nicht funktioniert, muss es doch irgendwelche Fehlermeldungen ausspucken. Wie lauten die denn?

                                  Du solltest für den Anfang auch nicht gleich solche "Hammerstatements" produzieren.
                                  Es reicht für den Anfang, wenn man ein Textfelt im HTML-Formular hat oder eine Textarea.
                                  Dann erstmal das "Affenformular" aufbauen.
                                  Wenn das fehlerfrei funktioniert, kannst Du an den Datenbankzugriff denken.
                                  Und dann eben den Inhalt des einen Feldes in die Datenbank manövrieren.
                                  Dabei kann schon genug schief gehen.

                                  Habe eine einfache datenbankstruktur und -Skript mal aufgebaut. Klappt aber trotzdem nicht.
                                  <?php
                                  include ('config2.php');
                                  ini_set('error_reporting', E_ALL);

                                  if( isset($_POST['submit']) ) {
                                  $sarah = mysql_connect ($host, $user)
                                     or die(mysql_error());

                                  $link = mysql_select_db($dbname,$sarah)
                                    or die(mysql_error());

                                  $dbanfrage = " INSERT into test SET name= '".mysql_real_escape_string($POST['name'])."', ".vorname= '".mysql_real_escape_string($POST['vorname'])."',".geburtstag = '".mysql_real_escape_string($_POST['geburtstag'])."'";
                                  } else {echo mysql_error();}
                                  ?>
                                  Habe name, vorname und geburtstag als Text bzw. Date in der DB deklariert.
                                  Kommt die Fehlermeldung:
                                  Parse error: syntax error, unexpected '=' in C:\ms4w\Apache\htdocs\Einfachertest.php on line 15  -> nun ist aber in Zeile 15 gar kein = mehr, sondern die else {echo()}-Anweisung..
                                  Müsste eigentlich viel weiter sein, muss das für meine Arbeit machen und morgen ein erster Entwurf von meinem Anmeldeformular zeigen..und ich hab nichts..

                                  Wenn es mit dem Spaltentyp TEXT geklappt hat, kannst Du daran denken, andere Datentypen rein und raus zu transportieren.

                                  Brich Dir nicht den Hals, weil Du gleich alles auf einmal anfängst.
                                  Dann verlierst Du eher früher als später nur die Lust daran.

                                  Setze Dir kleine Aufgaben und genieß die Erfolgserlebnisse "Hach, wieder 'was geklappt!"

                                  Danke für deine aufmunternden Worte!
                                  Schönen Gruß

                                  Harzliche Grüße vom Berg
                                  http://bergpost.annerschbarrich.de

                                  Tom

                                  1. Hello,

                                    da ist was im Argen mit den Quotes, ich schreibs mal um, damit es übersichtlicher wird:

                                    $dbanfrage =
                                    " INSERT into test SET name= '"                             OK
                                    .                                                             OK
                                    mysql_real_escape_string($POST['name'])                       OK
                                    .                                                             OK
                                    "', "                                                         OK
                                    .                                                             OK
                                    vorname= '"                                                   hier ist was schief
                                    .                                                             OK
                                    mysql_real_escape_string($POST['vorname'])                    OK
                                    .                                                             OK
                                    "',"                                                          OK
                                    .                                                             OK
                                    geburtstag = '"                                               hier ist was schief
                                    .                                                             OK
                                    mysql_real_escape_string($_POST['geburtstag'])                OK
                                    ."'";                                                         OK

                                    MfG
                                    Rouven

                                    --
                                    -------------------
                                    Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
                                    1. Hello,

                                      $dbanfrage =
                                      " INSERT into test SET name= '"
                                      vorname= '"                                                   hier ist was schief
                                      geburtstag = '"                                               hier ist was schief

                                      Danke Rouven, werde da nochmal drüber schauen..!
                                      Schöne Grüße

                                      MfG
                                      Rouven

                                    2. Hello,

                                      $dbanfrage =
                                      " INSERT into test SET name= '"                             OK
                                      .                                                             OK
                                      mysql_real_escape_string($POST['name'])                       OK
                                      .                                                             OK
                                      "', "                                                         OK
                                      .                                                             OK
                                      vorname= '"                                                   hier ist was schief
                                      .                                                             OK
                                      mysql_real_escape_string($POST['vorname'])                    OK
                                      .                                                             OK
                                      "',"                                                          OK
                                      .                                                             OK
                                      geburtstag = '"                                               hier i

                                      Aber wie du schriebst müsste es aber auch noch bei name falsch sein(wenn es um die 'und " geht)..oder es hängt damit zusammen: ".vorname=...... was ich eher annehme..

                                      MfG
                                      Rouven

                                      1. Hello,

                                        mir scheint, du hast da was grundsätzliches noch nicht verstanden. Gehen wir es also der Reihe nach mal durch:
                                        Eine SQL-Abfrage von PHP an MySQL zu überreichen wird mittels eines einzigen Strings durchgeführt. In PHP haben wir somit die Möglichkeit, entweder einen mit ' begrenzten oder einen mit " begrenzten String zu verwenden. Wir entscheiden uns für die Variante mit " und nennen die Variable, in der wir das Statement ablegen werden, $dbanfrage.
                                        Nun haben wir also
                                        $dbanfrage = "";
                                        Machen wir mit dem weiter, was wir wissen:
                                        $dbanfrage = "INSERT INTO ";
                                        Nun kommt die erste spannende Stelle: Um sicher zu sein, dass wir nicht in Probleme mit Sonderzeichen oder reservierten Worten geraten, schreiben wir den Tabellennamen nicht direkt in das Statement, sondern umrahmen ihn mit Backticks (): $dbanfrage = "INSERT INTO test";{:.language-php} Jetzt geht es also erstmal wieder normal weiter mit der Feldliste, wobei mir übrigens auffällt, dass dein Statement kein gewöhnliches SQL ist, machen wir das also mal (du scheinst da eher eine UPDATE-SET-Syntax zu haben): $dbanfrage = "INSERT INTO test (name, vorname, geburtstag) VALUES ()";{:.language-php} Nun haben wir die Felder, die stehen entweder einfach so da, oder konsequenterweise wieder mit Backticks - das sollte auch in deinem Beispiel oben so sein, sie sollten \_im\_ String mit " stehen. Nun bauen wir die Werte ein. Stringwerte, und solche die es eigentlich sind (in dem Fall dein Datum), müssen von SQL in Anführunszeichen stehen, und zwar in einfachen. $dbanfrage = "INSERT INTO test (name, vorname, geburtstag) VALUES ('', '', '')";{:.language-php} Was nun noch fehlt sind die Werte - wäre das Datumsfeld nicht, so würde das vorstehende Statement sogar problemlos funktionieren. Als Werte wollen wir jetzt den Inhalt der Postvariablen, aber er soll vorher noch durch eine Funktion gejagt werden - letzteres kann nicht innerhalb des Strings passieren. Wir müssen also den String kurzfristig unterbrechen, den Funktionsaufruf durchführen und das Ergebnis mit dem String verbinden - wir benutzen dazu den Konkatenationsoperator "." $dbanfrage = "INSERT INTO test (name, vorname, geburtstag) VALUES ('".mysql_real_escape_string($_POST['name']) ."', '".mysql_real_escape_string($_POST['vorname'])."', '".mysql_real_escape_string($_POST['geburtstag'])."')";`

                                        Klarer geworden?

                                        MfG
                                        Rouven

                                        --
                                        -------------------
                                        Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
                                        1. $dbanfrage = "INSERT INTO test (name, vorname, geburtstag) VALUES ('".mysql_real_escape_string($_POST['name']) ."', '".mysql_real_escape_string($_POST['vorname'])."', '".mysql_real_escape_string($_POST['geburtstag'])."')";

                                          In PHP gibt es doch auch printf bzw. sprintf, damit kann man sowas übersichtlicher machen

                                          $dbanfrage = sprintf "INSERT INTO `test` (name, vorname, geburtstag) VALUES ('%s', '%s', '%s') ",  
                                          mysql_real_escape_string($_POST['name']),  
                                          mysql_real_escape_string($_POST['vorname']),  
                                          mysql_real_escape_string($_POST['geburtstag'])  
                                          ;
                                          

                                          Struppi.

                                          1. $dbanfrage = "INSERT INTO test (name, vorname, geburtstag) VALUES ('".mysql_real_escape_string($_POST['name']) ."', '".mysql_real_escape_string($_POST['vorname'])."', '".mysql_real_escape_string($_POST['geburtstag'])."')";

                                            In PHP gibt es doch auch printf bzw. sprintf, damit kann man sowas übersichtlicher machen

                                            $dbanfrage = sprintf "INSERT INTO test (name, vorname, geburtstag) VALUES ('%s', '%s', '%s') ",

                                            mysql_real_escape_string($_POST['name']),
                                            mysql_real_escape_string($_POST['vorname']),
                                            mysql_real_escape_string($_POST['geburtstag'])
                                            ;

                                            
                                            >   
                                            
                                            Danke euch beiden!  
                                            Werde ich nachher ausprobieren. Hatte ich aber (die Lösung von Rouven)aber schon so und es hat nicht geklappt mein ich.  
                                            
                                            > Struppi.
                                            
                                  2. Hello Sarah,

                                    Stimmt das mit den ganzen ' und " auch? Hatte es nämlich ja erst ander herum, also anstatt " ' und anstatt '". Da war alles ok.

                                    Das hängt davon ab, ob PHP noch etwas ersetzen soll, oder nicht.
                                    Ich bevorzuge diese Variante.
                                    http://de3.php.net/manual/en/language.types.string.php

                                    Habe eine einfache datenbankstruktur und -Skript mal aufgebaut. Klappt aber trotzdem nicht.
                                    <?php

                                    error_reporting', E_ALL;                       ### ist eine eigene Funktion

                                    include ('config2.php');

                                    >

                                    if( isset($_POST['submit']) )

                                    {
                                        $sarah = mysql_connect ($host, $user)        ### wo ist das Passwort geblieben?
                                         or die("keine Verbindung ".mysql_error());  ### wenn es schief geht, kann hier noch kein
                                                                                     ### echter MySQL-Error kommen. Es gibt dann ja
                                                                                     ### keine Verbindung zur DB

                                    $link = mysql_select_db($dbname,$sarah)
                                      or die(mysql_error());

                                    $dbanfrage = "

                                    INSERT into test
                                    SET
                                      name       = '".mysql_real_escape_string($_POST['name'])      ."', ".    ## $_POST, nicht $POST
                                      vorname    = '".mysql_real_escape_string($_POST['vorname'])   ."', ".    ## $_POST, nicht $POST
                                      geburtstag = '".mysql_real_escape_string($_POST['geburtstag'])."'";

                                    $res = mysql_query($dbanfrage,$sarah);      ### wo hattest Du das denn gelassen?

                                    if (mysql_error($sarah)==0)
                                         {
                                           echo "<p>Eintragung war erfolgreich</p>\n";
                                         }
                                         else
                                         {
                                           echo mysql_error($sarah);
                                         }
                                      }

                                    ?>

                                    Du hattest die Hälfte vergessen.
                                    Es heißt $_POST und nicht $POST. da hätte es aber eigentlich eine Notice geben müssenDu hattest allerdings nicht die Funktion error_reporting() aufgerufen, sondern ein ini_set().
                                    Außerdem gehört das dann ganz an den Anfang. im include() kann schließlich auch schon was fehlen....

                                    Es gibt die explizite Variante mit

                                    INSERT into tablename SET ...

                                    http://dev.mysql.com/doc/refman/5.1/en/insert.html

                                    Es waren keine Häkchenfehler zu finden. Da hat Rouven mMn selber schief geschaut.

                                    Versuche es so nochmal.
                                    Kann es sein, dass Dein Editor beim Abspeichern "merkwürdige Zeichen" abspeichert?
                                    Ich entnehme dem Pfad in der Fehlermeldung, dass Du mit XAMPP arbeitest.
                                    Hast Du z.B. auch Heidi-SQL installiert, um direkt mit der DB Übungen machen zu können?
                                    das ist sehr zu empfehlen, denn über Heidi odre einen phpMyAdmin kannst Du Statements "mal eben schnell" in einem Frontend testen, bevor Du sie in den PHP-Code übernimmst.

                                    http://www.heidisql.com/

                                    Harzliche Grüße vom Berg
                                    http://bergpost.annerschbarrich.de

                                    Tom

                                    --
                                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                    Nur selber lernen macht schlau
                                    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                    1. Hello,

                                      Ok, Ok... Rouven hat doch richtig geguckt. *duck*

                                      $dbanfrage = "
                                       INSERT into test
                                       SET
                                         name       = '".mysql_real_escape_string($_POST['name'],$sarah)      ."',
                                         vorname    = '".mysql_real_escape_string($_POST['vorname'],$sarah)   ."',
                                         geburtstag = '".mysql_real_escape_string($_POST['geburtstag'],$sarah)."'";

                                      So wäre es richtig.
                                      Der String, der hinter mysql_real_escape_string begonnen wird, wird einfach nur fortgesetzt auf der nächsten Zeile. Entweder, man schreibt es dann so wie oben, oder man setzt nochmal Häkcen am Anfang der nächsten Zeile *schäm*

                                      $dbanfrage =
                                       "INSERT into test ".
                                       "SET ".                                                                        ## hier können
                                       "name       = '".mysql_real_escape_string($_POST['name'],$sarah)      ."', ".  ## jetzt auch
                                       "vorname    = '".mysql_real_escape_string($_POST['vorname'],$sarah)   ."', ".  ## Kommentare
                                       "geburtstag = '".mysql_real_escape_string($_POST['geburtstag'],$sarah)."'";    ## stehen

                                      Im obigen Besipiel stehen die Zeilenumbrüche dann auch im Statement mit drin, was aber erlaubt ist und sogar empfohlen wird, so zu schreiben.

                                      Im unteren Beispiel landet das gesamte Statement in einer Zeile.
                                      Wie lang die bei MySQL werden darf, habe ich noch nicht gefunden.

                                      Harzliche Grüße vom Berg
                                      http://bergpost.annerschbarrich.de

                                      Tom

                                      --
                                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                      Nur selber lernen macht schlau
                                      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                                      1. Hello,

                                        Ok, Ok... Rouven hat doch richtig geguckt. *duck*

                                        ...und ich find kurzfristig an, an mir selbst zu zweifeln :-)

                                        MfG
                                        Rouven

                                        --
                                        -------------------
                                        "I wish it need not have happened in my time" - "So do I, and so do all who live to see such times. But that is not for them to decide. All we have to decide is what to do with the time that is given us."  --  J.R.R. Tolkien: "The Lord Of The Rings: The Fellowship Of The Ring"
                                        1. Hello,

                                          Ok, Ok... Rouven hat doch richtig geguckt. *duck*
                                          ...und ich find kurzfristig an, an mir selbst zu zweifeln :-)

                                          Naja, ich hatte vorhin noch ein wenig Zeit, das mal selber auszuprobieren und bekam plötzlich so ein merkwürdiges Syntax-Highlighting in meinem Textpad...
                                          Und dann natürlich auch dieselbe Fehlermeldung, wie Sarah sie hatte.

                                          Gesehen habe ich fehlenden führenden Häkchen aber immer noch nicht.
                                          Manchmal ist man doch blind.

                                          Es waren aber noch genügend andere Dinge falsch.
                                          Schlussendlich hat es dann aber funktioniert bei mir.

                                          Ich vergesse nur immer die Usernamen und Passworte für meine diversen SQL-Testuser :-(
                                          Da muss ich dann jedes Mal erst wieder anfangen, zu basteln.
                                          Oder eben mein geliebtes "Heidi" aufrufen.
                                          Die Version 3.0/572 kann aber leider immer noch keine Trigger setzen. :-(
                                          Ich muss gleich mal die neue 3.1RC1 ausprobieren.

                                          Harzliche Grüße vom Berg
                                          http://bergpost.annerschbarrich.de

                                          Tom

                                          --
                                          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                                          Nur selber lernen macht schlau
                                          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                        2. echo $begrüßung;

                          [Magic Quotes]
                          Die muss man entweder ausschalten in der php.ini oder im virt-host oder in einer .htaccess-Datei oder man muss die Quotierungen erst wieder entfernen, bevor man mit den Daten aus $_POST etwas anfangen kann.

                          Zu den Magic Quotes gibt es doch ein eigenes Handbuch-Kapitel. Auch eine Seite zur Deaktivierung ist da enthalten, inklusive einer Funktion zum ihrem generellen Entfernen.

                          Da das Entfernen der Magic Quotes zum E von EVA gehört, sollte man die Deaktivierfunktion auch in seinem Script entsprechend ansiedeln, also das Beispiel unter Disabling Magic Quotes direkt am Scriptanfang einfügen.

                          Wie das rekursiv für das ganze $_POST-Array geht, steht in den Benutzerkommentaren (UCN) der Beschreibung zur Funktion.

                          Auf der Seiten der von dir geposteten Links ist nur eine Abhandlung über das ungleichmäßige Magic Quoting bei Keys zu finden. Die dargebotenen Lösungsvorschläge kann man natürlich einsetzen, wobei man dazu noch die unterschiedlichen PHP-Versionen berücksichtigen muss. Doch für den üblichen Gebrauch finde ich das ein wenig übertrieben, da die Keys selten als Werte verwendet werden. Wer immer nur lesend auf $_FOO['bar'] zugreift, braucht sich über die Keys und eine Verfälschung seitens des Clients keine Gedanken zu machen. Wenn der Client die Keys versaut, geht der Zugriff ins Leere, aber das fängt man ja eh mit isset($_FOO['bar']) ab. Und wer Keys mit Magic-Quotes-relevanten Zeichen absichtlich verwendet hat es nicht besser verdient :-)

                          echo "$verabschiedung $name";

  2. Hi,

    $dbanfrage = 'INSERT into formular(id,titel,termin,arcgis,teilnehm,name,einricht,str,plz,ort,tel,fax,email) VALUES ("0","'.htmlspecialchars($_POST[titel]).'","'.htmlspecialchars($POST[termin]).'","'.htmlspecialchars($_POST['arcgis']).'","'.htmlspecialchars($_POST['teilnehm']).'","'.htmlspecialchars($_POST['name']).'","'.htmlspecialchars($_POST['einricht']).'","'.htmlspecialchars($_POST['str']).'","'.htmlspecialchars($_POST['plz']).'","'.htmlspecialchars($_POST['ort']).'","'.htmlspecialchars($_POST['tel']).'","'.htmlspecialchars($_POST['fax']).'","'.htmlspecialchars($_POST[email]).'")';
    $fehler = mysql_query($dbanfrage,$sarah) or die(mysql_error());

    Warum verwendest du hier htmlspecialchars? Diese Funktion ist für die Ausgabe von HTML-Code gedacht. Was du verwenden solltest ist mysql_real_escape_string. Das schützt dich dann auch vor SQL-Injektions.

    Außerdem wäre dir besser zu helfen, wenn du den Inhalt von $dbanfrage mal ausgeben lassen und hier posten würdest, da das Problem ja offensichtlich an mySql und nicht an PHP liegt.

    Habe termin so definiert in meiner Datenbank/Tabelle:
    termin enum('13-10-2004','b')

    Das heißt, du kannst nur die Werte '13-10-2004' und 'b' in dieses Feld schreiben. Für Datumsangaben gibt es in mySql den Datentyp DATE.
    Das ist wohl der Fehler.

    mfG,
    steckl

    1. Hello,

      Das heißt, du kannst nur die Werte '13-10-2004' und 'b' in dieses Feld schreiben. Für Datumsangaben gibt es in mySql den Datentyp DATE.
      Das ist wohl der Fehler.

      das hab ich auch gedacht, bzw. das wäre auch immer noch mein Ansatz, aber unter der Prämisse, dass man sich nur für bestimmte Termine anmelden soll, _kann_ man auch für einen ENUM argumentieren - auch wenn das für schlechte Modellierung halte.

      MfG
      Rouven

      --
      -------------------
      He is entertaining both out of the car and in the car because if you tell him that a corner is almost flat then he is the guy who is going to try to take it flat even if it means shunting it the other side of it, he will come with the data and say 'hey, I may have crashed and destroyed the car, but I was flat-out'. That is an interesting quality that he has!  --  Team Member on Jacques Villeneuve