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