r_mehmed has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks,
I'm working on a small admin console,and am stuck on a part where users can update db entries using simple forms. Basically on a single page i have more than one form,(using a while loop to generate as many forms as there're entries in the db). With each iteration i have auto-incrementing $_++, that changes the name of the form to say form1,form2,form3 and so forth. Each form has a 'Delete' and 'Update' buttons. The trouble is no matter which 'Update' button of which form is pressed the result is one - only the first form is updated. i guess it would work if i auto-increment the names of the 'Update' buttons instead, but then i'm unsure of how to get the param for each different button name?!
this is the code that generates the forms:
while ( @row = $sth->fetchrow_array()) { $form++; print "<form name=\"$form\" method=\"post\" action=\"su +bmit_edited.pl\">"; print $q->state_field; print<<HTML; <table width="80%" border="0" cellpadding="0" align="center" class="pr +operty"> <tr> <td width="22%" valign="top"><p valign="center"> <img src="$row[9]" border="1"><br> <strong>Postal Code:</strong><br><input name="zip" type="textfield" si +ze="30" class="text_field" value="$row[5]"></p> </td> <td width="78%"> ... <input type="hidden" name="hidden_field_name" value="$row[0]"> <input type="submit" name="update" value="Update"> <input type="submit" name="delete" value="Delete"> </td> </tr> </table> <br> HTML
and this is the code that should handle the params:
if ($q->param("update")) { my $sql = "UPDATE property SET address_1= ?,address_2= ?, county= +?, city= ?, zip= ?, description= ?, bedroom= ? WHERE property_id= ?"; my $sth = $dbh->prepare($sql) or die $dbh->errstr; $sth->execute($address_1, $address_2, $county, $city, $zip, $d +escription, $bedroom,$property_id) or die $dbh->errstr; $dbh->disconnect; print $q->header(), $q->start_html("Cool "), $q->p("that worked fine\n $sql"), $q->end_html; }else { print $q->header(), $q->start_html("ERROR"), $q->p("life sucks dude"), $q->end_html; exit; }
PS. Is there a more efficient way of executing the $sth->execute, i tried putting the vars into an @_ and the execute it like so $sth->execute(@_[0..7]). That doesnt give me an error but doesnt execute either!
many thanks
r_mehmed
novice

Replies are listed 'Best First'.
Re: Multiple forms
by jobber (Sexton) on Mar 19, 2003 at 16:17 UTC
    Hello, Your problem appears to lie in the fact your not closing the <form> tag off. So just remember to have </form> in your while loop as well
    while ( @row = $sth->fetchrow_array()) { $form++; print "<form name=\"$form\" method=\"post\" action=\"su +bmit_edited.pl\">"; print $q->state_field; print<<HTML; <table width="80%" border="0" cellpadding="0" align="center" class="pr +operty"> <tr> <td width="22%" valign="top"><p valign="center"> <img src="$row[9]" border="1"><br> <strong>Postal Code:</strong><br><input name="zip" type="textfield" si +ze="30" class="text_field" value="$row[5]"></p> </td> <td width="78%"> ... <input type="hidden" name="hidden_field_name" value="$row[0]"> <input type="submit" name="update" value="Update"> <input type="submit" name="delete" value="Delete"> </td> </tr> </table> </form> #This is what is being left out <br> HTML
Re: Multiple forms
by digger (Friar) on Mar 19, 2003 at 16:47 UTC
    The execute method will take an array and process it correctly. So $sth->execute(@myarray) with an array of values should work just fine.

    I have found that bad sql statments don't always throw errors the way we would expect. I had a similar issue with a silently failing sql statement. See the response at node_id=231494.

    I would also reccomend the excellent HTML:Template, or other templating module to take the HTML out of your code. It really is easier to use a templating module and keep HTML and code separate.

    HTH,
    digger
      thank you both!
      my problem was the closing </form> tag. once in place it works perfectly. that sorted the issue with the array not executing too!
      cheers
      r_mehmed