• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Warum funktioniert mein DELETE nicht?

Liskel

Mitglied
Hey,
bin am Verzweifeln und finde beim besten Willen nicht heraus, warum folgendes Problem auftritt. Was übersehe ich ?

Für mein momentanes Skript habe ich eine Datanbankklasse verwendet - funktioniert perfekt!
Ich möchte gerne einen Datensatz löschen und zwar dort, wo user_key='$user_key' (64-stellige Zeichenfolge 0-9a-z). Folgender Code:
PHP:
$sql="DELETE FROM ".PREFIX."current WHERE user_key='$user_key'";
echo $sql;
$db->delete($sql);
Folgender Fehler mit echo des sql-statements:
Code:
DELETE FROM qz_current WHERE user_key='s2o6nv3od97y3j6drsnqvo5zo9vtu256qp6zoynt5bp7g8gdt2pa5fnzjhj4ppo1'
Fatal error: Uncaught exception 'Exception' with message 'Query Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'s2o6nv3od97y3j6drsnqvo5zo9vtu256qp6zoynt5bp7g8gdt2pa5fnzjhj4ppo1\'' at line 1

Die Datenbankklasse funktioniert auf jeden Fall, auch mit dem delete:
PHP:
$db->delete("DELETE FROM ".PREFIX."quiz WHERE id=$id")
In diesem Fall aber halt mit einem Integer-Wert.
Gibt es noch etwas, was ich bei einem string beachten muss? Bisher waren einfache Hochkommata ' ' z.B. beim SELECT immer zielführend!
Woher kommen die escapten Hochkommata in der Fehlermeldung?


Wäre super wenn jemand einen Denkanstoss hat!
Danke schonmal!

Ps.: Habe das in PHP gepostet, da ich denke, dass es sich um einen (simplen?) Verschreiber/Vergucker/Wasauchimmer handelt ...
 
Werbung:
Es wäre interessant zu wissen, wie die Methode delete ausieht. Im Moment würde ich sagen, dass in irgendeiner Form der String nochmal überarbeitet wird, denn wo sollte sonst das \' herkommen?
 
Dachte ich mir beides schon ;)

Hab eben mal die Klasse rausgesucht. Ist vielleicht auch anderen ein Begriff: Micah Carrick: https://github.com/Quixotix/PHP-MySQL-Database-Class

Bisher habe ich keine Probleme mit dem Verarbeiten der Querys gehabt (auch in anderen Projekten nicht) und in der Klasse auch keine Anhaltspunkte für eine Veränderung an der query finden können. Wär ja auch irgendwie schwachsinnig? ...

Wie gesagt, mit Integern funktioniert alles ohne Probleme ... Zur Not selecte ich mir vorher ne eindeutige id, aber ich finde die ganze Angelegenheit irgendwie merkwürdig!
 
Werbung:
Kontrolliere mal, was in $user_key steht. Eventuell irgendwelche Sonder- oder Steuerzeichen, die dir im Browser so nicht angezeigt werden. Was mir bei der Database-Klasse auffällt, dass die Daten einfach so übernommen werden und nicht durch mysql_real_escape_string gejagt werden.
 
PHP:
     public function delete($query) 
    {
	
        return $this->updateOrDelete(mysql_real_escape_string($query));
    }

Also bei mir werden sie durch mysql_real_escape_string gejagt - vielleicht hab ich das auch selbst eingebaut, aber danke für den Hinweis!

$user_key Inhalt besteht zu 100% nur aus a-z,0-9 - hab mir auch schon gedacht, dass da vllt Schlüsselworte oder anderes drin auftauchen, aber der String wird komplett zufällig generiert (Wär ja lustig wenn da zufällig irgendwelche Worte auftauchen die mir das ganze zerschießen ;)) ... Also eigentlich Fehlanzeige!
Den Inhalt von user_key siehst du sonst beim echo der query:
Code:
s2o6nv3od97y3j6drsnqvo5zo9vtu256qp6zoynt5bp7g8gdt2pa5fnzjhj4ppo1
hgahwk3i3uda7odziy1eljk4unxhe1zhco4b0ejai6292pexvyq8s5efnbfqc1je
4ke59n4hypip9yvb4rujdfv25nhdu3o5fupukttgnl6jmifikqhnklhdvop82b0l

Sind die Zahlen vielleicht in irgendeiner Weise ein Problem? - Wie du merkst, bin ich schon beim Raten und bei eigentlich sinnfreien Ideen(?) angekommen ...
 
vielleicht hab ich das auch selbst eingebaut
Bestimmt, denn das Original sieht so aus:
PHP:
public function delete($query)     {        return $this->updateOrDelete($query);    }
Und das dürfte dein Problem sein, weil so nicht nur die Werte, sondern den kompletten String durch mysql_real_escape_string jagst
 
Werbung:
Verdammt, klar ... :( und Integert störts nicht, da da keine Hochkommata sind ...

DANKE!

Hättest du eine Idee, wie man die mysql_real_escape_string-Sache mit in die Klasse integrieren könnte?
 
Baue einfach eine Funktion escape_string in die Klasse und nutze diese mit den Werten
 
Hey,

das hieße doch aber, die Abfrage dann ähnlich wie folgend zu ändern?

PHP:
$db->delete("DELETE FROM table WHERE x='".$db->escape_string($y)."'");

Doof eigentlich, dass du mich auf diesen Fehler gestoßen hast :D, fand das vorher viel schöner ...
 
Werbung:
Besserer Vorschlag:
Baue diese Funktion in die Klasse ein: PHP: sprintf - Manual
Und dann passt du die anderen Funktionen an, damit du sie z.B. so aufrufen kannst

$db->delete("Delete from table where x='%s'", $y);
$db->query("Select a,b,c where a='%s' and b='%d'", $a, $b);
 
Zurück
Oben