Klaus Mock: Besondere SQL Query

Beitrag lesen

Hallo,

Gehen wir es der Reihe nach durch:

my (@qp,@qq,@qe) = ("");

@qp  hat jetz ein Element, @qq,@qe jeweil null. ISt das so gewollt? Ich denke nicht.
my (@qp,@qq,@qe);
reicht vollkommen. Da es jetzt leichter beim Lesen wäre, den Dingern  aussagekräftigere Namen zu geben.

foreach (@{$conf->{rg}->{ext_data}}) {push (@qq,"?",",");}
foreach (@{$conf->{rg}->{ext_data}}) {push (@qp,"$_",",");}
foreach (@{$conf->{rg}->{ext_data}}) {push (@qe,"$input->{$_}",",");}

Wozu drei Schleifen, wenn sowieso immer über das gleiche Array iteriert wird?
Aber dazu später.
Nemen wir uns vorher

my $sth = $dbh->prepare(" INSERT INTO $iconf->{dbt}->{ext_data} (id_key,@qp) VALUES (?,@qq) ");
$sth->execute($max_id,@qe);

vor.
Das $iconf könnte ein Tippfehlersein, aber auch nicht, kann ich nicht sagen, wolle es nur erwähnen.

Der erste Punkt ist mal:

$sth->execute();

das erwartet beispielsweise
$sth->execute(1,2,3,4,5,6,7,8,...);
Also einfach einel Liste von Werten oder eben ein Array von werten. Du hast aber

foreach (@{$conf->{rg}->{ext_data}}) {push (@qe,"$input->{$_}",",");}

geschrieben, daraus wird also ($max_id ist angenommen 1)
$sth->execute(1,'$input->{FELDNAME1}','$input->{FELDNAME2}',....);
wobei zu bemerken ist, daß Du also nicht die Werte aus dem Formular wiederfindest, sondern eben den Text '$input->{FELDNAME1}' im zweiten Feld. Also wirklich so wie es hier geschrieben ist.
Der Grund ist, daß Du mit dem \ das $ ausmaskiert hast, Perl also nicht auf den Inhalt des Hashes, dessen Referenz in $input liegt, zugreift. Ui klingt das jetzt kompliziert.

Das ist der eigentliche Grund, warum es nicht funktioniert.

Dann möchte ich jetzt noch kurz auf noch etwas eingehen, bevor ich zur fertigen Sache komme.
Da gibt es die Funktion join, die Du Dir ansehen solltest.
Beispiel:

my(@array) = (1,2,3,4);
my $text = join(' trennzeichen ',@array);
jetzt steht in $text
'1 trennzeichen 2 trennzeichen 3 trennzeichen 4'
Es wird also aus dem Array ein Scalar gemacht, wobei zwischen den einzelnen Elementen ein beliebiger Text eingefügt werden kann.

Du könntest also:

my (@fieldnames, @placeholders, @values);

foreach (@{$conf->{rg}->{ext_data}})
   {
   push @placeholders,'?';
   push @fieldnames,'$_';
   push @values,"$input->{$_}";
   }
my $fields = join(',',@fieldnames);
my $placeholders = join(',',@placeholders);

my $sth = $dbh->prepare("INSERT INTO $iconf->{dbt}->{ext_data} (id_key,$fields VALUES (?,$placeholders)");
$sth->execute($max_id,@values);

schreiben.
Da gibts sicherlich noch einiges zu optimieren, wie etwa der Einsatz von map, aber kommt Zeit kommt map:-)

Grüße
  Klaus

So,