Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3339[/thread]

quoting: quoting beim input/output in/aus mysql

Leser: 1


<< >> 10 Einträge, 1 Seite
Froschpopo
 2003-09-20 18:08
#33842 #33842
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
habe folgendes Insert in eine MySQL Datenbank:
Code: (dl )
1
2
3
$betreff = quotemeta($betreff);
$dbh->do("INSERT INTO messages (von, receiver, betreff, message, status, datestamp) VALUES ('$username', '$receiver', '$betreff', '$message', '1', NOW())")
        or die "Fehler: $DBI::errstr";

Wenn ich $betreff nicht durch quotemeta() laufen lasse und der Wert von $betreff z.B. ein ' enthält, dann erhalte ich eine meldung, dass der Syntax fehlerhaft ist. Nun gut, mit quotemeta funktioniert ja auch alles bestens. Aber leider stört mich der quoting-backslash beim ausgeben des Datensatzes. Einfach ersetzen kann ich aber auch nicht, denn woher weiß dann der regex welcher \ gewollt ist oder auch nicht. Welche Möglichkeiten gibt es sowas zu lösen?
[code]
format_c
 2003-09-20 20:07
#33843 #33843
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Also bei der Eingabe Quote ich auch aber wenn der Text ausgegeben wird kommt der eigentlich korrekt rüber.

Gruß Alex
Froschpopo
 2003-09-21 13:41
#33844 #33844
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
aber nicht das % (Prozent)-Zeichen! den ' printet er normal, aber bei % macht er immer \%
Dubu
 2003-09-21 16:28
#33845 #33845
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
quotemeta() ist ja auch die vollkommen falshce Funktion dafuer.
Das DBI-Modul liefert eine Funktion quote(), die fuer das Quoten von Datenbankeingaben ist.
Noch besser ist aber IMHO die Verwendung von Platzhaltern mit prepare/execute oder anderen Funktionen. Siehe Abschnitt "Placeholders and Bind Values" sowie die Funktionen prepare() und execute() und andere, die Bind Values unterstuetzen, in perldoc DBI.

Dein Code oben saehe dann z.B. so aus:
Code: (dl )
1
2
3
do("INSERT INTO messages (von, receiver, betreff, message, status, datestamp) VALUES (?, ?, ?, ?, ?, NOW())", undef,
$username, $receiver, $betreff, $message, 1)
        or die "Fehler: $DBI::errstr";

(Das undef steht fuer die Hashreferenz \%attr, mit der optional Attribute an die Datenbank uebergeben werden koennen.)\n\n

<!--EDIT|Dubu|1064147622-->
Froschpopo
 2003-09-22 12:36
#33846 #33846
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
aber do ist ja jetzt das gegenteil von prepare/execute weil es sofort ausführt.
Dubu
 2003-09-23 01:10
#33847 #33847
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Naja, als "Gegenteil" wuerde ich es nicht bezeichnen. Und das do() habe ich nur benutzt, weil dein Beispiel es auch benutzte. Du kannst natuerlich auch mit prepare()/execute() arbeiten. Alle diese Funktionen unterstuetzen Platzhalter, nur muessen bei do() die Werte gleich mit im Funktionsaufruf angegeben werden (aber eben ohne explizites Quoten).
Froschpopo
 2003-09-23 02:52
#33848 #33848
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
okay, aber wie warum braucht man nicht zu quoten wenn man mit platzhaltern arbeitet, das verstehe ich noch nicht!
Dubu
 2003-09-24 00:46
#33849 #33849
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Weil das Quoten dann automatisch vorgenommen wird.
Froschpopo
 2003-09-24 15:54
#33850 #33850
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
jetzt quotet er. Aber das problem ist ja jetzt auch, dass er das quotingzeichen auch bei der Ausgabe ausgibt UND GENAU DAS wollte ich ja eben nicht!

Code: (dl )
1
2
      $dbh->do("INSERT INTO messages (von, receiver, betreff, message, status, datestamp) VALUES (?, ?, ?, ?, ?, NOW())", undef, $username, $receiver, $betreff, $message, 1)
or die "Fehler: $DBI::errstr";
\n\n

<!--EDIT|Froschpopo|1064404973-->
Froschpopo
 2003-09-25 15:41
#33851 #33851
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
format_c, wei machst du es denn dass er dir das nicht beim auslesen anzeigt?\n\n

<!--EDIT|Froschpopo|1064490212-->
<< >> 10 Einträge, 1 Seite



View all threads created 2003-09-20 18:08.