Beispiel für "quote" Funktion?
jane
- perl
0 Klaus Mock0 jane
Hi,
ich bastle gerade an ein paar cgi Scripts in Perl herum.
Ich habe ein paar Formulare in die verschiedene Daten eingetragen werden sollen. Also nichts besonderes. Die Daten werden dann in Tabellen einer MySql Datanbank abgespeichert.
Vorher jedoch überprüfe ich die Richtigkeit und Vollständigkeit der Daten. Das hab ich bisher wohl ziemlich umständlich gemacht, denn ich bin erst jetzt über die DBI Funktion "quote" gestolpert.
Kann mit jemand von Euch erklären wie man damit quoted?
----------------
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");
----------------
--> so will ich das eigentlich nich machen, weil ich zu komplexe queries hab und deshalb alles zu undurchsichtig wird. Also lieber ohne Placeholders wenn das ginge ...
Kann ich meine Variablen schon vor der sql query quoten?
So daß ich einfach schreib: $var = $dbh->quote($var);
Aber irgendwie geht das net.
ne idee?
Danke schonmal ;-)
Hallo,
Vorher jedoch überprüfe ich die Richtigkeit und Vollständigkeit der Daten. Das hab ich bisher wohl ziemlich umständlich gemacht, denn ich bin erst jetzt über die DBI Funktion "quote" gestolpert.
Kann mit jemand von Euch erklären wie man damit quoted?
In SQL-Statements werden Strings mit einem (datenbankspezifischen) Quotezeichen eingefaßt. Sollte der String allerdings selbst dieses Quotezeichen beinhalten, muß es (ebenfalls datenbankspezifisch) ausmaskiert werden. Dies erledigt 'quote'. Ob der String richtig und vollständig ist, wird von quote natürlich nicht erkannt.
So könnte
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");
bespielsweise
"SELECT foo FROM bar WHERE baz = 'Don''t'"
ergeben. (Unter der Annahme, daß das Quotezeichen ' ist und das Maskieren durch Verdoppelung des Quotezeichens durchgeführt wird.
Kann ich meine Variablen schon vor der sql query quoten?
Ja, natürlich.
So daß ich einfach schreib: $var = $dbh->quote($var);
Zum Beispiel. Das würde analog zum obigen Beispiel eben
'Don''t' ergeben (Achtung: inklusive der ' am Anfang und Ende)
Aber irgendwie geht das net.
Erklär das genauer.
Bei komplexen Statements wäre es ohnehin besser, Du würdes Bindvariablen verwenden:
use DBI qw(:sql_types);
[...]
$sth = $dbh->prepare('SELECT foo FROM bar WHERE baz = ?');
$sth->bindparam(1,$var,SQL_VARCHAR);
$sth->execute();
Da wird das Quoting gleich mit erledigt. Außerdem hat das noch andere Vorteile. Wenn Du ein Statement mit unterschiedlichen Parameter aufrufen willst, brauchst Du nur ein prepare machen, kannst aber viele execute's ausführen. Das ist gerade bei Massendatenverarbeitung wesentlich schneller und ressourcenschonender.
Beispiel Import:
use DBI qw(:sql_types);
[...]
$sth = $dbh->prepare('INSERT INTO foo (bar,baz) values(?,?)');
$sth->bindparam(1,0,SQL_INTEGER);
$sth->bindparam(2,$var,SQL_VARCHAR);
while(($bar,$baz) ) readfromFile())
{
$sth->execute($bar,$baz);
}
$sth->finish();
$dbh->commit();
Grüße
Klaus
Hallo,
In SQL-Statements werden Strings mit einem (datenbankspezifischen) Quotezeichen eingefaßt. Sollte der String allerdings selbst dieses Quotezeichen beinhalten, muß es (ebenfalls datenbankspezifisch) ausmaskiert werden. Dies erledigt 'quote'. Ob der String richtig und vollständig ist, wird von quote natürlich nicht erkannt.
Ja soweit wollt ich auch nich gehen ;-) Quote kann ja natürlich nich ahnen, wann mein String vollständig ist.
Kann ich meine Variablen schon vor der sql query quoten?
Ja, natürlich.
So daß ich einfach schreib: $var = $dbh->quote($var);
Zum Beispiel. Das würde analog zum obigen Beispiel eben
'Don''t' ergeben (Achtung: inklusive der ' am Anfang und Ende)
Aber irgendwie geht das net.
Erklär das genauer.
Das war wohl mein Fehler.
Danke für Deine Antwort. Werd mich einfach mal dahinter setzen.
Liebe Grüße, Jane.