Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Escapen von mysql? *g*

  1. #1
    Registrierter Benutzer
    Registriert seit
    16.05.2001
    Beiträge
    88

    Escapen von mysql? *g*

    Hallo

    Ich mache grad meine ersten mysql Schritte und habe mir das Beispiel von simple-mysql-tutorial
    angesehen. Es laueft jetzt mit ein paar kleinen Aenderungen, und ich bekomme auch eine Verbindung zum Server. Leider klappt INSERT bereits nicht.
    Auf der mysql Console klappt es. Es liegt wohl an den Escapes, bzw. an der
    Art wie die Daten bei mysql ankommen. Problem ist: Das Prog uebergibt das Insert Statement so:

    INSERT INTO test VALUES("foo 1");

    statt

    INSERT INTO test VALUES("foo", "1");

    http://nopaste.de/p/aeWTqxIIN

    Wegen des Terminator ';' bin ich mir auch nicht sicher ob der direkt in die Query gehoert oder auf die Konsole. Im Beispiel war gar keiner.
    Wie macht man das INSERT Statement denn nun? Habe schon diverse Versuche mit Escapes hinter mir:

    sprintf(query, "INSERT INTO demotable VALUES('%s')\';\''", encdata); /* Build query */
    sprintf(query, "INSERT INTO demotable VALUES('%s')\;'", encdata); /* Build query */
    sprintf(query, "INSERT INTO demotable VALUES('%s')", encdata); /* Build query */


    Jemand ne Idee?

    Gruss 403
    Geändert von 403 (09-07-2007 um 16:15 Uhr)
    ;)

  2. #2
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Erstens gibt MySQL immer eine Fehlermeldung zurück. Diese sollte man natürlich auch auswerten. Da kann man sich auch "ansehen" wo der Fehler aufgetreten ist (MySQL gibt immer die dem Fehler folgenden Zeichen aus).
    Falls das im Programm direkt nicht möglich ist, vielleicht das Logging in MySQL anschalten und dann im entsprechenden Log-File nachsehen.

    Bei der Übergabe in PHP immer ohne Semikolon. PHP kann die gleichzeitige Übergabe mehrer Befehle an MySQL nicht (ich weiss, Ausnahmen bestätigen die Regel). Das Semikolon wird aber nur zur Trennung von Befehlen benötigt.

    Ansonsten, weiss ich nicht ob die Tabelle demotable nun 1 oder 2 Spalten hat. Dementsprechend muss auch die Anzahl der Variablen stimmen.

    EDIT: Ich sehe gerade, dass es C und nicht PHP ist. Aber trotzdem gilt oben gesagtes. Du müsstest in der API-Doku mal nachsehen, ob die Übergabe mehrerer Kommandos erlaubt ist oder nicht. Dementsprechend muss die Übergabe mit oder ohne Semikolon erfolgen.

    EDIT2: Ein kleines "man mysql_real_query" in Google hat mich zu folgender Seite geführt: http://www.pronix.de/pronix-351.html
    Damit können Sie SQL-Anweisungen (Anfragen) als nullterminierten String ausführen, welche am Ende allerdings im Gegensatz zur MySQL-Shell kein Semikolon oder \g haben darf.
    Geändert von Pingu (09-07-2007 um 16:52 Uhr)
    Homepage: www.pingu.info

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.05.2001
    Beiträge
    88
    ok, sieht aus als wenn das Beispiel nur ein raw Proof of Concept ist. ich les
    mal weiter.

    Achso, und Danke fuer edit2
    ;)

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.05.2001
    Beiträge
    88
    ok, das 1 .Problem bei mir war jetzt erstmal, dass das SQL INSERT Statement
    nicht richtig geformt ward. Naja es haut immer noch Fehler raus, aber updatet
    schonmal die DB

    http://nopaste.de/p/atgwTh8KL
    ;)

  5. #5
    Registrierter Benutzer
    Registriert seit
    22.06.1999
    Beiträge
    677
    Code:
    INSERT INTO test VALUES("foo 1");
    Du solltest Dir angewöhnen, immer die Spaltenbezeichnung beim INSERT mit anzugeben (erfolgt vor der VALUES Klausel). Wenn Du sie weglässt, dann kann das zu unerwarteten Effekten führen, je nachdem welche Auffassung die Datenbank von der Spaltenreihenfolge in der Tabelle hat.

    Ein weiterer Fehler sind die doppelten Quotes: die stehen laut SQL2-Standard nämlich für Identifier, nicht für Stringkonstanten! Grundsätzlich braucht man double quotes nur in Fällen, die besser gar nicht vorkommen sollten (z.B. wenn man Leerzeichen in Tebbelen-/Spalten-Namen verwendet oder Case-sensitive Tabellennamen möchte).

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •