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

[MySQL] Quote: Problem ... was sonst...



<< >> 7 Einträge, 1 Seite
eisbeer
 2004-01-05 19:08
#35878 #35878
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also hallo zusammen.
Mein Problem:

Ich habe ein Sub namens &UpdateFromHash, die wird so
aufgerufen:
Code: (dl )
&UpdateFromHash($dbh,{'field' => 'new_value','nextfield'=>'new_value'},'tabelle',["field LIKE '%irgendwas%'","field2 = 'value'"],$limit);

Ich hoffe das erklärt soch von selbst :)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub UpdateFromHash {
my $DBH = $_[0] or &FatalError('DBx0001');
my %Fields = %{$_[1]} or &FatalError('DBx0006',['Fields']);
my $Table = $_[2] or &FatalError('DBx0006',['Table']);
my @Conds = @{$_[3]} or &FatalError('DBx0006',['Conditions']);
my $Limit = $_[4];
my $Statement;

$Statement = 'UPDATE '.$Table.' SET '.join (', ',&{sub{my @f;push @f, "$_ = ".$DBH->quote($Fields{$_}) for (keys(%Fields));return @f;}}).
' WHERE '.join (' AND ',@Conds).($Limit?" LIMIT $Limit":"").';';

if ($DBH->do($Statement)) {
return 1;
}
else {
&FatalError('DBx0007', [$Statement, $DBH->errstr()]);
}
}


Funktioniert prima. ABER:
Wenn ich jetzt zum Beispiel sowas machen will:
Code: (dl )
&UpdateFromHash($CFG{'DBH'},{ 'falselogins' => 'falselogins+1' }, 'users', ["name = '$Username'"],1);

also das bestehende Feld 'falselogins' um eins erhöhen,
setzt mir $dbh->quote() Hochkommas aussenrum, und
damit wird 'falselogins' nicht erhöht, sondern zu "falselogins+1"
gesetzt.

Also entweder lass ich diese (für meinen Zweck) sehr
komfortable Art des UPDATEs sein und schreibe meine
Statements jedesmal selber oder es gibt irgend ne blöde
Lösung dafür...\n\n

<!--EDIT|eisbeer|1073322809-->
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
eisbeer
 2004-01-07 14:36
#35879 #35879
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nich so schüchtern ... :)
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
format_c
 2004-01-07 15:19
#35880 #35880
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wie willst du der Methode denn bitte klar machen, dass sie noch rechnen soll? quote ist nun mal eine Mehtode um Zeichenketten SQL-konform zu machen.

Ich denke die einzige Chance die du hast ist, evtl. einen weiteren Key Bsp.: add => 1 mitzugeben und diese, wenn existent, mit Perl auszuwerten und entsprechend den SQL-Statement abändern.

Gruß Alex
jan10001
 2004-01-07 15:20
#35881 #35881
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Wenn du mit quote arbeitest kannst du eigentlich auf die Hochkommas verzichten. Zudem sollte Berechnungen mit Perl ausgeführt werden.\n\n

<!--EDIT|jan10001|1073481772-->
format_c
 2004-01-07 15:40
#35882 #35882
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hochkommas? Die seh ich lediglich nur um das SQL-Statement zusammenzubasteln.
Problem bei der Berechnung ist, dass der Wert der in der Datenbank steht gleich beim Update erhöht werden soll. Eine Vorläufige Abfrage würde zum einen Running Conditions verursachen und zum anderen nicht gerade effektiv sein

Er kann auch wie oben schon angesprochen die Zahl als parameter übergeben und immer auswerten und entsprechend ins SQL-statement einbauen. Wenn nichts addiert oder gerechnet werden soll übergibt er halt 0.

Gruß Alex
eisbeer
 2004-01-07 15:55
#35883 #35883
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Die berechnungen in Perl zu machen ist doch viel zu umständlich.
Warum kompliziert wenns auch einfach geht ?

Mein Problem ist ja garnicht da quote, das kann ich eigentlich weglassen.
$dbh->quote() hat sowieso keine andere Funktion als die Hochkommas zu
setzen. Mehr macht es nicht. Zumindest seh ich nix anderes im Code von
der sub quote.

Aber ich denke, ich werds irgendwie ganz anders lösen. so wie ich das will,
geht das wahrscheinlich nicht :)
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
format_c
 2004-01-07 17:18
#35884 #35884
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=eisbeer,07.01.2004, 14:55]$dbh->quote() hat sowieso keine andere Funktion als die Hochkommas zu
setzen. Mehr macht es nicht. Zumindest seh ich nix anderes im Code von
der sub quote.[/quote]
Ne. Es escaped noch alle im Content enthaltenen Hochkommas. Zumindest weis ich es. Was es u.U. noch macht weis ich allerdings auch nicht.

Gruß Alex
<< >> 7 Einträge, 1 Seite



View all threads created 2004-01-05 19:08.