PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Escapen von mysql? *g*



403
09-07-2007, 15:08
Hallo :D

Ich mache grad meine ersten mysql Schritte und habe mir das Beispiel von simple-mysql-tutorial (http://myblog.rsynnott.com/2006/02/simple-mysql-tutorial.html)
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

Pingu
09-07-2007, 15:46
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.

403
09-07-2007, 16:09
ok, sieht aus als wenn das Beispiel nur ein raw Proof of Concept ist. ich les
mal weiter.

Achso, und Danke fuer edit2 :)

403
10-07-2007, 15:31
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 :D

http://nopaste.de/p/atgwTh8KL

Christoph
12-07-2007, 08:36
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).