Schrift
[thread]8873[/thread]

Platzhalter und undef

Leser: 2


<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
Froschpopo
 2007-03-25 12:57
#75375 #75375
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Folgendes:

Code: (dl )
1
2
3
4
my $sth = "UPDATE users SET name = ? WHERE id = ?";
@bind_values = ($cgi->param('test'), $id);

$dbh->do($sth, undef, @bind_values) or die DBI::errstr;


wenn das Script keinen Parameter namens test bekommt, gibts einen SQL-Error, weil vermutlich $id durch das fehlen von 'test' einen Platz nach vorn rutscht.

Das hier funktioniert aber:
Code: (dl )
1
2
3
4
my $test = $cgi->param('test');
@bind_values = ($test, $id);

$dbh->do($sth, undef, @bind_values) or die DBI::errstr;


warum funktioniert letzteres Script wenn doch param('test') in meinem beispiel undef ist.\n\n

<!--EDIT|Froschpopo|1174818439-->
GwenDragon
 2007-03-25 13:51
#75376 #75376
User since
2005-01-17
14554 Artikel
Admin1
[Homepage]
user image
Was ist das?
Code: (dl )
@bind_values ($cgi->param('test'), $id);

Eine Arrayzuweisung mit Fehlern? Ein Typecast einer Funktion?
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

jan
 2007-03-25 14:09
#75377 #75377
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich nehme mal eine arrayzuweisung mit transzendemten gleichzeichen an
Froschpopo
 2007-03-25 14:28
#75378 #75378
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ups, hab ich mich doch glatt vertippt. Kann derzeit kein Copy&Paste machen weil ich mit zwei Rechnern arbeite und zu Faul bin das Netzwerk einzurichten.
Der Beitrag wurde editiert.\n\n

<!--EDIT|Froschpopo|1174818524-->
GwenDragon
 2007-03-25 15:01
#75379 #75379
User since
2005-01-17
14554 Artikel
Admin1
[Homepage]
user image
Kennst du den Unterschied zwischen einer Liste/Array und einem Skalar?
param() liefert nämlich entweder den einzelnen Wert oder ein Array.

Code: (dl )
@bind_values = ($cgi->param('test'), $id);

Im Listenkontext erhält nämlich $bind_values[0] nicht undef sondern die Länge des Array der Parameter test; also 0!

Dann meckert wohl dein SQL.\n\n

<!--EDIT|GwenDragon|1174820720-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

pq
 2007-03-25 15:28
#75380 #75380
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,25.03.2007, 10:57]
Code: (dl )
@bind_values = ($cgi->param('test'), $id);
[/quote]
ganz einfach:
param() liefert nun mal eine leere liste, wenn kein parameter dieses
namens existiert. lösung:
Code: (dl )
my @bind_values = (scalar $cgi->param('test'), $id);

dadurch machst du aus der leeren liste ein undef.\n\n

<!--EDIT|pq|1174822361-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2007-03-25 15:31
#75381 #75381
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=GwenDragon,25.03.2007, 13:01]Kennst du den Unterschied zwischen einer Liste/Array und einem Skalar?
param() liefert nämlich entweder den einzelnen Wert oder ein Array.[/quote]
nein, param liefert immer eine liste. die kann leer sein, ein element
haben oder mehrere.
Quote
Code: (dl )
@bind_values = ($cgi->param('test'), $id);

Im Listenkontext erhält nämlich $bind_values[0] nicht undef sondern die Länge des Array der Parameter test; also 0!

nein, bei nicht existentem parameter 'test' liefert param die leere liste
(keine funktion liefert übrigens ein array, es wird immer eine liste
zurückgegeben). dadurch verschiebt sich, wie frosch schon richtig
vermutet hat, die $id nach vorne.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
GwenDragon
 2007-03-25 15:41
#75382 #75382
User since
2005-01-17
14554 Artikel
Admin1
[Homepage]
user image
Täusche ich mich so?
Quote
Pass the param() method a single argument to fetch the value of the named parameter. If the parameter is multivalued (e.g. from multiple selections in a scrolling list), you can ask to receive an array. Otherwise the method will return a single value.
Doku CGI.pm

Dann ist das doch ungenau beschrieben. Oder meinen die, dass list und array das selbe sind? Kann doch nicht sein.
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

Froschpopo
 2007-03-25 16:03
#75383 #75383
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
wird schon so sein, im Kochbuch ist ja auch immer nur von Listen die Rede wenn ein Array gemeint ist.
Dann bleibt mir wohl nichts anderes übrig, als jeden einzelnen aller dynamischen (kann fehlen) parameter durch DBI::quote() zu schicken. Ist halt mehr Schreibarbeit.
betterworld
 2007-03-25 16:10
#75384 #75384
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=GwenDragon,25.03.2007, 13:41]Täusche ich mich so?
Quote
Pass the param() method a single argument to fetch the value of the named parameter. If the parameter is multivalued (e.g. from multiple selections in a scrolling list), you can ask to receive an array. Otherwise the method will return a single value.
Doku CGI.pm

Dann ist das doch ungenau beschrieben. Oder meinen die, dass list und array das selbe sind? Kann doch nicht sein.[/quote]
Funktionen koennen nie Arrays zurueckgeben, nur Listen.

Und wenn das Ergebnis im Listenkontext steht (was ja der Fall ist), ist es sowieso nie die Anzahl der Elemente.
Aber selbst, wenn es im Skalarkontext stehen wuerde, waere es nicht die Anzahl der Argumente, weil es eben kein Array ist.
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2007-03-25 12:57.