Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Unable to display data from hash array

by bar10der (Beadle)
on Jun 14, 2004 at 13:47 UTC ( #366541=perlquestion: print w/replies, xml ) Need Help??

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

Hi Monks,
I want to display contents of my oracle table for users to edit it. There are more than 60 fields in the table. I have a saperate table which hold the column names. This is what I am doing-
#Select fieldnames from accfields table in @fields. my @fields = getMultiRows($sql,1,$dbh); ##A saperate perl routine to e +xtract data. my $fields = join(",",@fields); $sql = "SELECT $fields FROM tran WHERE account=?"; my $sth = $dbh->prepare($sql); if(!$sth){$err= "Error preparing query " . $sql . " : ". $dbh->errstr; +} if(!$sth->execute(177)){$err = "Error Executing query " . $sql . " : " +. $dbh->errstr;} my %rows = $sth->fetchrow_hashref; # Now i get the html template and want to populate html form fields wi +th data extracted. All form field names are same as table column na +me. foreach(@fields){ $template->param($_=>$rows{$_}); } return $template->output;
The form is displayed but fields do not show data extracted from database! Where am I making mistake? The html tag in form is -
<input type="text" name="fname" size="40" maxlength="60" value="<!-- T +MPL_VAR fname -->"><!-- TMPL_VAR err_fname -->

Replies are listed 'Best First'.
Re: Unable to display data from hash array
by Happy-the-monk (Canon) on Jun 14, 2004 at 13:56 UTC

    Where am I making mistake?

    In a number of ways:
    You are not handling the possible error you store in   $err.
    Consult the DBI.pm documentation how to work with   fetchrow_hashref.
    You did not tell us much about the templating system to understand if there's anything wrong there.

    Cheers, Sören

      Thanks Sören
      I'll give it a go. By the way, there is no problem with the template. I have tested it with some localy defined vars.
Re: Unable to display data from hash array
by benrwebb (Scribe) on Jun 14, 2004 at 16:12 UTC
    I would look at two things:
    First, if you are using HTML:Template, your TMPL_VAR tags don't look right... they should have a "name" as well:
    <TMPL_VAR name="fname">
    Second, it looks like you are doing your assignments the hard way. If you return an AoH (Array of Hashes) from your call to DBI, you can assign that entire array to a loop within your template. For instance:

    my $p = Page->new(); # now we get the info from the database and pass it to the template # in this case, the template needs a reference to an array of hashes # in order to handle the TMPL_LOOP properly. Which is exactly what # dbselect returns. hard to believe :-) $newst->param(news => $p->dbselect($sql,1)); sub dbselect{ my Page $self = shift; my $sql = shift if @_; my $hash = shift if @_; my $db = $self->db(); my $h = $db->prepare($sql) or $self->errorpage("DB problem in sele +ct prepare: " . $db->errstr()); $h->execute() or $self->errorpage("DB problem in select execute: " + . $db->errstr()); my $arrayref; if ($hash){ $arrayref = $h->fetchall_arrayref({}); } else { $arrayref = $h->fetchall_arrayref(); } return $arrayref; }
    I'll break down what just happened there. I'm using an object called Page (I use it for web pages in general), it has a method called dbselect that will query the database for me (the connection is set up elsewhere). $newst is an HTML::Template that I have genereated, so I call the param method of $newst with the output from dbselect assigned to the TMPL_LOOP news. It then fills in my news page with rows of news. Some day I'll update it to limit the number of stories, but I'm basically boring so I don't have that much news to display :-)
    Note the call to fetchall_arrayref({}) within dbselect. Read up on the documentation for DBI, in this format it returns AoH.

    The template that uses this looks like this:
    <table border=0 width='98%' cellspacing=3 cellpadding=3> <TMPL_LOOP NAME="news"> <tr><td> <table width='100%' border=1 cellspacing=1 cellpadding=0> <tr> <th align='left'><TMPL_VAR NAME='summary'></th> <th align='right'><TMPL_VAR NAME='pubdate'></th> </tr> <tr> <td align='left' colspan=255><i>By: <TMPL_VAR NAME +='realname'></i></td> </tr> <tr> <td align='left' colspan=255><TMPL_VAR NAME='conte +nt'></td> </tr> </table> </td></tr> </TMPL_LOOP> </table>
    So you see, by using the AoH with a TMPL_LOOP, I was able to loop through everything with almost no code. Very easy once you understand it.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://366541]
Approved by Happy-the-monk
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (6)
As of 2020-02-19 16:42 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    What numbers are you going to focus on primarily in 2020?










    Results (84 votes). Check out past polls.

    Notices?