Mastershrimp: Merkwürdiger SQL-Fehler beim Beschreiben der Db (Anfänger)

Hallo!

mit folgendem Code möchte ich 6 Variablen in eine 6-spaltige Tabelle namens "news" schreiben:
 mysql_query("INSERT INTO news VALUES ($db_date,$db_creator,$db_heading,$db_logo,$db_text,$db_link)");

die Variablen sind folgendermaßen definiert:

$db_date = $datum;
    $db_creator = $cr_name;
    $db_heading = $title;
    $db_logo = $group;
    $db_text = $message;

$db_link = "<a class='news' href='";
    $db_link .= $link_url;
    $db_link .= "'>";
    $db_link .= $link_text;
    $db_link .= "</a>";

Die übrigen Variablen wie z.B. $message stammen aus einer Post-Variablen-Übergabe und wurden nur durch Funktionen wie htmlentities() bearbeitet.

Die Variable $datum lautet:
 $datum = date("d.m.Y");
 $datum .= " um ";
 $datum .= date("G:i");
 $datum .= " Uhr";

Wenn ich nun die Anfrage an die Datenbank sende, bekomme ich folgenden Fehler:
You have an error in your SQL syntax near '.2004 um 21:35 Uhr,Max,Gehts nun?,../inhalte/pics/news_tech.jpg,testetsettest,<a' at line 1

Wenn ich statt der Variablen in die INSERT-Anfrage einfache Zahlen setze, funktioniert's. Nur das mit den Variablen klappt irgendwie nicht - und aus der Fehlermeldung schließe ich, dass er ein Problem mit dem Datum hat. Dabei ist das doch lediglich ein simpler String, oder?

Was mache ich falsch?

Vielen Dank schonmal an dieser Stelle!

Gruß

Mastershrimp

  1. Hallo!

    mit folgendem Code möchte ich 6 Variablen in eine 6-spaltige Tabelle namens "news" schreiben:
     mysql_query("INSERT INTO news VALUES ($db_date,$db_creator,$db_heading,$db_logo,$db_text,$db_link)");

    die Variablen sind folgendermaßen definiert:

    $db_date = $datum;

    na vielleicht passt dein Datumsformat nicht zum Format des in der DB festgesetzten Datentypes .

    Wenn ich nun die Anfrage an die Datenbank sende, bekomme ich folgenden Fehler:
    You have an error in your SQL syntax near '.2004 um 21:35 Uhr,Max,Gehts nun?,../inhalte/pics/news_tech.jpg,testetsettest,<a' at line 1

    dito

    Gruss, Erwin

    --
    SELFforum - Das Tor zur Welt!
    Theoretiker: Wie kommt das Kupfer in die Leitung?
    Praktiker: Wie kommt der Strom in die Leitung?
    1. na vielleicht passt dein Datumsformat nicht zum Format des in der DB festgesetzten Datentypes .

      Hatte ich auch schon dran gedacht - aber das Datum wird ja in der Forum "am 01.01.1999 um 00:00 Uhr" abgespeichert. Es ist also ein String, oder sehe ich das falsch? Wie muss die Typenbezeichnung der Spalte lauten? Momentan ist es VARCHAR(50)

      Gruß

      Mastershrimp

  2. Hallo.

    You have an error in your SQL syntax near '.2004 um 21:35 Uhr,Max,Gehts nun?,../inhalte/pics/news_tech.jpg,testetsettest,<a' at line 1

    Sieht mir fast etwas aus, als wäre Deine SQL-Anweisung nicht ganz sauber. Wie sieht denn die Anweisung an mySQL aus?
    Und ist der Datentyp der Datumsspalte auch ein String wenn Du es als String übergibst? Warum nutzt Du nicht die Datentypen für Datums-/Zeitangaben?

    Grüße aus Würzburg
    Julian

    --
    "machines will eat itself." Bau Dir Deinen eigenen Bot.
    http://www.hgb-leipzig.de:83/~franz/hyperportrait/testers/
    1. Hallo!

      Wie sieht denn die Anweisung an mySQL aus?

      meinst du
      mysql_query("INSERT INTO news VALUES ($db_date,$db_creator,$db_heading,$db_logo,$db_text,$db_link)"); ?

      Und ist der Datentyp der Datumsspalte auch ein String wenn Du es als String übergibst?

      Der Datentype steht auf VARCHAR(50). Ob ich das Datum so wie es oben steht als String übergebe, weiß ich nicht ganz genau - schätze aber mal ja. Was sollte es sonst sein? Ein Datum wird in PHP doch immer als String gespeichert. Beantwortet das deine Frage?

      Warum nutzt Du nicht die Datentypen für Datums-/Zeitangaben?

      Ich lerne MySQL ja gerade erst. Deshalb wollte ich einfach nur das Datum mit PHP erstellen und in der Datenbank abspeichern. Das andere ist doch im Prinzip dasselbe, oder? Nur halt mit MySQL. Ich mach das lieber erst mal über PHP ;)

      Gruß

      Mastershrimp

      1. Ich habe mal mit PHPMyAdmin eine neue Zeile eingefügt und folgenden PHP-Code erhalten:

        $sql = 'INSERT INTO news ( date , creator , heading , logo , text , link ) ';
        $sql .= 'VALUES ( 'am 19.01.2004 um 19:41', 'Max', 'Warum klappt das nicht?', '<img src="bla.jpg">', 'Ich weiß es echt nicht', '<a class=\'news\' href=\'blabla.html\'>test</a>' );';
        $sql .= ''

        Ist es in der Zeile INSERT INTO news ( date , creator , heading , logo , text , link ) wichtig, dass man die Feldnamen nochmal wiederholt? Ich glaube nicht...Ansonsten ist es doch genau dasselbe! Und MySQL kommt damit klar.

        Doch kaum übergibt man dieselben Werte mit PHP an die Datenbank, will sie diese nicht mehr :(

        Ich stehe irgendwie auf dem Schlauch...

        1. Tach,

          $sql = 'INSERT INTO news ( date , creator , heading , logo , text , link ) ';
          $sql .= 'VALUES ( 'am 19.01.2004 um 19:41', 'Max', 'Warum klappt das nicht?', '<img src="bla.jpg">', 'Ich weiß es echt nicht', '<a class=\'news\' href=\'blabla.html\'>test</a>' );';
          $sql .= ''

          Der wichtige Unterschied zu Deinem Code sind die Anfuehrungszeichen um die Werte.
          String-Werte muessen immer mit Anfuehrungszeichen (einfach oder doppelt ist ein Deinem Fall denk ich wurscht) angegeben werden.
          Vergiss nicht das escapen.

          Viele Gruesse,
          Gero

          1. Der wichtige Unterschied zu Deinem Code sind die Anfuehrungszeichen um die Werte.

            Ich arbeite ja aber mit Variablen - und die kann ich ja schlecht in Anführungszeichen setzen, oder?

            Gruß

            Mastershrimp

      2. Hallo.

        Ob ich das Datum so wie es oben steht als String übergebe, weiß ich nicht ganz genau - schätze aber mal ja. Was sollte es sonst sein? Ein Datum wird in PHP doch immer als String gespeichert. Beantwortet das deine Frage?

        Mysql ist da etwas weiter und unterscheidet mehr Datentypen. Unter anderem gibt's auch einige für Datums- und Zeitangaben (http://www.mysql.de/doc/de/Date_and_time_types.html). Vorteil daran ist, dass Du viel leichter mit den Daten bei Abfragen arbeiten kannst. Willst Du beispielsweise alle News der letzten Woche ausgeben, so wird das über String-Daten schwer abzufragen. Oder ein Sortieren nach Datum. Oder oder oder

        Und gaaanz genau gesehen sparst Du auch noch Speicher ind er Datenbank, da Du "am" und "um" nicht zig mal mit abspeicherst. Aber das ist heute wohl eher vernachlässigbar.

        Grüße aus Würzburg
        Julian

        --
        "machines will eat itself." Bau Dir Deinen eigenen Bot.
        http://www.hgb-leipzig.de:83/~franz/hyperportrait/testers/
        1. Ok. Dann mach ichs mit dem Datum jetzt per MySQL.

          Wie genau läuft das dann ab? Muss ich das Datum an die Datenbank senden? Oder wird das Datum des Send-Befehls abgespeichert? Muss ich bei der Werte-Übergabe für das Datumsfeld einen Leerraum (sprich '') lassen, weil man ja immer alle Felder ausfüllen muss...

          Gruß

          Mastershrimp

  3. Hallo nochmal!

    Es tut mir leid, aber ich verstehe einfach nicht, wo der Fehler liegt! Warum kann man z.B. für eine Text nicht die Typenbezeichnung "TEXT" in der Datenbank nehmen?

    Ich habe 6 Werte, die gespeichert werden müssen:

    1. Datum (Wert: XX.XX.XXXX XX:XX) -> DATETIME
    2. Ersteller des Eintrags (Wert: blablabla) -> VARCHAR(50)
    3. Überschrift (Wert: blablablab) -> VARCHAR(255)
    4. Logo d. Eintrags (Wert: <img src="bla.jpg">) -> TEXT
    5. Inhalt des Eintrags (Wert: blababla) -> TEXT
    6. Info-Link (Wert: <a href="bla.html">blabal</a>) -> TEXT

    Dennoch kommt ein dieser merkwürdige Fehler. Was mache ich falsch?

    Ach, und noch eine Frage bzgl. des Datums: Welchen Wert muss ich an die Datenbank senden? Das mit date() generierte Datum? Einen leeren String '' ? Gar nichts?

    Wäre das so richtig:
    mysql_query("INSERT INTO news VALUES ($db_date,$db_creator,$db_heading,$db_logo,$db_text,$db_link)");

    wobei $db_date das genierierte Datum enthält.

    Ich stehe total vor'm Berg. Und die Fehlermeldungen von SQL sagen auch nicht wirklich, was kaputt ist... :(

    Kann mir jemand helfen? Danke schonmal

    Gruß

    Mastershrimp

    1. Ich habe es gerade selber geschafft. Ich musste sehr umständlich den Variablen-Wert in Anführungszeichen in die mysql_query packen - aber nur so scheints zu gehen.

      Danke an euch Helfer!

      Gruß

      Mastershrimp