String escapen für SQL Insert
Badboy46
- php
0 Badboy460 Robert Bienert0 Badboy46
Hallo,
ich hab mir hier eine Funktion gebastelt
function _db_insert($tabelle, $spalte, $wert){
global $db;
$spalte1 = '';
$wert1 = '';
foreach ($spalte as $text) $spalte1 .= $text.',';
foreach ($wert as $text) $wert1 .= '''.$db->escapeSimple($text).'',';
$spalte = substr($spalte1, 0, strlen($spalte1)-1);
$wert = substr($wert1, 0, strlen($wert1)-1);
$sql = sprintf ('INSERT INTO %s (%s) VALUES (%s)', _DBTAB.$tabelle, $spalte, $wert);
$result = $db->query($sql);
if(DB::isError($result)){
die($result->getMessage());
exit();
}
}
wenn ich dann in phpMyAdmin schaue, wurde der Nick so eingetragen
kay'"aad statt so kay'"aad
kann mir einer sagen, warum das so ist?
$spalte und $wert sind arrays
$db = http://pear.php.net/manual/de/package.database.php
Kay
wenn ich die eine Zeile so schreibe
foreach ($wert as $text) $wert1 .= '''.$db->escapeSimple($db->escapeSimple($text)).'',';
klappt es.
Mmuss ich das verstehen, warum ich die 2mal escapen muss?
Hallo,
Moin!
ich hab mir hier eine Funktion gebastelt
function _db_insert($tabelle, $spalte, $wert){
Kleine Frage nebenbei: Warum beginnt der Name der Funktion mit einem Unterstrich? AFAIK ist so etwas doch eigentlich PHP intern vorbehalten.
wenn ich mir da $sql ausgeben lasse, kommt soetwas bei raus:
»»
INSERT INTO user (_username_r, _username, _password, _email, _reg_email, _reg_date, _last_login, _rang, _fehlversuche, _fehlversuchzeit) VALUES ('kay'"aad','kay'"aad','200820e3227cf69c1756a6b531e7e0d2','kay@xxx.de','kay@xxx.de','1090147928','1090147928','user','0','1090147928')
»»
Sieht gut aus, alle "gefährlichen" Zeichen escaped, selbst Zahlen in Hochkomma, sehr schön.
wenn ich dann in phpMyAdmin schaue, wurde der Nick so eingetragen
kay'"aad statt so kay'"aad
Ist klar, weil phpMyAdmin bei der Ausgabe automatisch die Backslashes entfernt. Mit 'kay'"add' sorgst du ja nur dafür, dass MySQL wirklich kay'"add in die Datenbank einträgt, statt nach kay\ einen Syntaxfehler (den nächsten Backslash) zu melden. Also: In der Datenbank steht, was auch die Ausgabe zeigt, in der Tat kay'"add. Willst du hingegen selbst die Backslashes auch dort _in der Datenbank_ stehen haben, musst diese natürlich ebenfalls escapen. Im Gegensatz zu PHP, Perl, ... unterscheidet SQL nicht bei den Quotes, ob Backslashes aufgelöst werden oder nicht.
Kay
Gruß, Robert
Hallo
ich hab mir hier eine Funktion gebastelt
function _db_insert($tabelle, $spalte, $wert){
Kleine Frage nebenbei: Warum beginnt der Name der Funktion mit einem Unterstrich? AFAIK ist so etwas doch eigentlich PHP intern vorbehalten.
also das mit den _ am anfang klappt einwandfrei
falls ich doch mal ein Funktionsname von PHP erwische, läuft mein Script weiter, wie ich das möchte ;)
wenn ich mir da $sql ausgeben lasse, kommt soetwas bei raus:
»»
INSERT INTO user (_username_r, _username, _password, _email, _reg_email, _reg_date, _last_login, _rang, _fehlversuche, _fehlversuchzeit) VALUES ('kay'"aad','kay'"aad','200820e3227cf69c1756a6b531e7e0d2','kay@xxx.de','kay@xxx.de','1090147928','1090147928','user','0','1090147928')
»»Sieht gut aus, alle "gefährlichen" Zeichen escaped, selbst Zahlen in Hochkomma, sehr schön.
das wird ja auch generiert :)
wenn ich dann in phpMyAdmin schaue, wurde der Nick so eingetragen
kay'"aad statt so kay'"aadIst klar, weil phpMyAdmin bei der Ausgabe automatisch die Backslashes entfernt. Mit 'kay'"add' sorgst du ja nur dafür, dass MySQL wirklich kay'"add in die Datenbank einträgt, statt nach kay\ einen Syntaxfehler (den nächsten Backslash) zu melden. Also: In der Datenbank steht, was auch die Ausgabe zeigt, in der Tat kay'"add. Willst du hingegen selbst die Backslashes auch dort _in der Datenbank_ stehen haben, musst diese natürlich ebenfalls escapen. Im Gegensatz zu PHP, Perl, ... unterscheidet SQL nicht bei den Quotes, ob Backslashes aufgelöst werden oder nicht.
das es zu keinen bösen Überraschungen kommen kann, wenn nur ' und " statt ' udn " in der MySQL Tabelle steht?
Hallo
Nabend!
Kleine Frage nebenbei: Warum beginnt der Name der Funktion mit einem Unterstrich? AFAIK ist so etwas doch eigentlich PHP intern vorbehalten.
also das mit den _ am anfang klappt einwandfrei
Dann ist ja gut, ich wollte nur darauf hinweisen.
falls ich doch mal ein Funktionsname von PHP erwische, läuft mein Script weiter, wie ich das möchte ;)
Soso
INSERT INTO user (_username_r, _username, _password, _email, _reg_email, _reg_date, _last_login, _rang, _fehlversuche, _fehlversuchzeit) VALUES ('kay'"aad','kay'"aad','200820e3227cf69c1756a6b531e7e0d2','kay@xxx.de','kay@xxx.de','1090147928','1090147928','user','0','1090147928')
»»Sieht gut aus, alle "gefährlichen" Zeichen escaped, selbst Zahlen in Hochkomma, sehr schön.
das wird ja auch generiert :)
Wahrscheinlich mit einer dieser *sql_escape_string Funktionen, recht praktische Dinger.
wenn ich dann in phpMyAdmin schaue, wurde der Nick so eingetragen
kay'"aad statt so kay'"aadIst klar, weil phpMyAdmin bei der Ausgabe automatisch die Backslashes entfernt. [...] In der Datenbank steht, was auch die Ausgabe zeigt, in der Tat kay'"add. Willst du hingegen selbst die Backslashes auch dort _in der Datenbank_ stehen haben, musst diese natürlich ebenfalls escapen. Im Gegensatz zu PHP, Perl, ... unterscheidet SQL nicht bei den Quotes, ob Backslashes aufgelöst werden oder nicht.
das es zu keinen bösen Überraschungen kommen kann, wenn nur ' und " statt ' udn " in der MySQL Tabelle steht?
Was für böse Überraschungen? MySQL ist es vollkommen gleichgültig was in der Datenbank steht, siehe z.B. die BLOB-Felder. Das Escapen ist nur für die Abfragen notwendig, damit MySQL weiß, wo jeder Wert beendet ist.
HTH, Robert
Hallo
das es zu keinen bösen Überraschungen kommen kann, wenn nur ' und " statt ' udn " in der MySQL Tabelle steht?
Was für böse Überraschungen? MySQL ist es vollkommen gleichgültig was in der Datenbank steht, siehe z.B. die BLOB-Felder. Das Escapen ist nur für die Abfragen notwendig, damit MySQL weiß, wo jeder Wert beendet ist.
hm... soweit sogut...
wenn ich mit addslashes dei Werte eintragen sehen die erst so aus ' in der Datenbank aber so '
wenn ich die Daten jetzt auslese, brauche ich doch kein stripslashes mehr, oder? denn die Daten sind ja in der Datenbank nicht mit ' gespeichert, oder versteh ich das falsch
Kay