sceiler: sprintf und das %-Zeichen

Hallo,

ich bin total verwirrt und ratlos.

Ich benutze für meine Queries sprintf und seit heute werden % in die DB geschrieben anstatt sie leer zu lassen wenn die Variable leer ist.

Zum Beispiel:

$sql = sprintf("INSERT INTO kunde ( vorname, name, alter, strasse, ort, beschreibung)
VALUES ('%%', '%%', '%%', '%%', '%%', '%%')",
mysql_real_escape_string($vorname),
mysql_real_escape_string($name),
mysql_real_escape_string($alter),
mysql_real_escape_string($strasse),
mysql_real_escape_string($ort),
mysql_real_escape_string($beschreibung));

Die Variablen werden mittels $_POST abgefragt.

Das Problem ist: er schreibt in die Datenbank nur % Zeichen und selbst Zeitangaben mittels date() oder IDs aus einer Auswahl bekommt werden falsch geschrieben...

Die Ausgabe mit echo $sql bestätigt mir das es % sind die der Query bekommt aber auch das er zwar das richtige Datum mittels date bekommt aber nicht so reinschreibt wie es sollte. In der DB steht dann 0000-00-00 usw.

Das merkwürdige ist das ich nichts an dem Quellcode verändert habe. Vorher hat er Variablen die leer waren auch leer bzw nichts geschrieben.

Hat jemand eine Idee wieso das plötzlich anders ist?

  1. Tach!

    Ich benutze für meine Queries sprintf und seit heute werden % in die DB geschrieben anstatt sie leer zu lassen wenn die Variable leer ist.
    $sql = sprintf("INSERT INTO kunde ( vorname, name, alter, strasse, ort, beschreibung)
    VALUES ('%%', '%%', '%%', '%%', '%%', '%%')",

    Kein Wunder, denn %% steht für ein %. Du willst %s haben.

    mysql_real_escape_string($vorname),
    Die Variablen werden mittels $_POST abgefragt.

    Das ist für das Problem egal, aber warum verwendest du nicht gleich die Elemente aus dem $_POST-Array sondern nimmst neue Variablen?

    Das merkwürdige ist das ich nichts an dem Quellcode verändert habe. Vorher hat er Variablen die leer waren auch leer bzw nichts geschrieben.
    Hat jemand eine Idee wieso das plötzlich anders ist?

    Das kommt kaum von "ganz plötzlich". An den Platzhaltern von sprintf() hat sich seit Ewigkeiten nichts grundlegendes geändert.

    dedlfix.

    1. Das kommt kaum von "ganz plötzlich". An den Platzhaltern von sprintf() hat sich seit Ewigkeiten nichts grundlegendes geändert.

      Das ist ganz sicher plötzlich, weil als ich es vorher getestet habe mehrmals gab es keine Probleme mit %% jetzt aber halt.

      Aber darüber zu "streiten" macht jetzt auch keinen Sinn. Wie müsste es den richtig heißen, wenn ich eine Abfrage machen möchte aber kein exakten Typ angebe? Also weder string s noch integer d??

      $sql = sprintf("INSERT INTO kunde ( vorname, name, alter, strasse, ort, beschreibung)
      VALUES ('%', '%', '%', '%', '%', '%')",

      usw...

      dann verschwinden die Kommata und er zeigt nur noch die ' an.

      1. Tach!

        Wie müsste es den richtig heißen, wenn ich eine Abfrage machen möchte aber kein exakten Typ angebe? Also weder string s noch integer d??

        %s ist in jedem Fall richtig, wenn du die Zahlen nicht in irgendeiner Weise formatieren willst. PHP hat eine automatische Typumwandlung eingebaut, die im Falle von Zahlentypen zuschlägt. Außerdem kommen in $_POST sowieso nur Strings an.

        $sql = sprintf("INSERT INTO kunde ( vorname, name, alter, strasse, ort, beschreibung)
        VALUES ('%', '%', '%', '%', '%', '%')",
        dann verschwinden die Kommata und er zeigt nur noch die ' an.

        Das ist ja auch Unfug. Wie im PHP-Handbuch nachzulesen ist, ist der Type Specifier nicht optional. Der muss also vorhanden sein.

        dedlfix.

  2. Hi,

    $sql = sprintf("INSERT INTO kunde ( vorname, name, alter, strasse, ort, beschreibung)

    alter ist in zweierlei Hinsicht problematisch.

    1. alter ist ein reserviertes Schlüsselwort in SQL (alter table ...), müßte daher entsprechend behandelt werden.

    2. in den meisten Fällen ist es günstiger, nicht das Alter, sondern das Geburts-/Entstehungsdatum (je nachdem, ob Person oder Sache) zu speichern.
    Das Alter ändert sich im Laufe der Zeit, das Geburtsdatum nicht ...

    Hat jemand eine Idee wieso das plötzlich anders ist?

    Weil Du plötzlich aus %s %% gemacht hast?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      1. in den meisten Fällen ist es günstiger, nicht das Alter, sondern das Geburts-/Entstehungsdatum (je nachdem, ob Person oder Sache) zu speichern.
        Das Alter ändert sich im Laufe der Zeit, das Geburtsdatum nicht ...

      Und obwohl sich die derzeitige Zeit ändert, lässt sich aus dieser und dem "Erstellungsdatum" das Alter erreichnen - eine einfache Subtraktion (bzw. die Verwendung einer Helferfunktion wie DATEDIFF).