Browsers cannot display a table until it has enough information about
the table, this includes the end table tag. Even if you flush output,
the browser does not display until it encounters the end table tag. So
from the looks of your example, the end table tag
is not printed until all records are retreived, which is what I think
you are trying to avoid.

You might want to try printing smaller tables at a time. And use width
property of the TD tag to maintain the same format for all tables. This
will display the retreived data incrementally, which is what you want,
right?

-Carlos


quagly wrote:
> 
>         I posted something like this a week ago, but typos in my message kept
> anyone from understanding the issue.
> 
>         I am trying to return each row to the client as it comes from the
> database, instead of waiting for all the rows to be returned before
> displaying them.
> 
>         I have set $|=1 and added $r->flush; after every print statement ( I
> realize this is redundant ) but to no avail.
> 
> This is the relevant code:
> 
> while ($sth->fetch) {
>    $r->print ("<TR>",
>        map("<TD>$_</TD>",@cols),
>        "</TR>");
>   $r->rflush;
> }
> 
> Here is the complete package:
> 
> package Sql::Client;
> 
> use Apache::Request;
> use strict;
> use warnings;
> use Apache::Constants qw(:common);
> 
> my $r;                                      #request
> my $apr;                                   #Apache::Request
> my $host;                                  #hostname of remote user
> my $sql;                                    #sql to execute
> 
> $|=1;
> 
> sub getarray ($) {
> 
>         my $dbh;              # Database handle
>         my $sth;                # Statement handle
>         my $p_sql;             # sql statement passed as parameter
>         my @cols;              #column array to bind results
>         my $titles;               # array ref to column headers
> 
>         $p_sql = shift;
> 
>         # Connect
>         $dbh = DBI->connect (
>                 "DBI:mysql:links_db::localhost",
>                 "nobody",
>                 "somebody",
>                 {
>                         PrintError => 1,            # warn() on errors
>                         RaiseError => 0,           # don't die on error
>                         AutoCommit => 1,        # commit executes
> immediately
>                 }
>         );
> 
>         # prepare statment
>         $sth = $dbh->prepare($p_sql);
> 
>         $sth->execute;
> 
>         $titles = $sth->{NAME_uc};
>         #--------------
>         # for minimal memory use, do it this way
>         @cols[0..$#$titles] = ();
>         $sth->bind_columns(\(@cols));
>         $r->print( "<TABLE BORDER>");
>         $r->print ("<TR>",
>                 map("<TD>$_</TD>",@$titles),
>                                                 "</TR>");
>         while ($sth->fetch) {
>                 $r->print ("<TR>",
>                         map("<TD>$_</TD>",@cols),
>                                                         "</TR>");
>                 $r->rflush;
>         }
>         $r->print ("</TABLE>");
>         return;
> }
> 
> sub handler {
>         $r = shift;
>         $apr =  Apache::Request->new($r);
>         $sql = $apr->param('sql') || 'SELECT';
>         $sql='SELECT' if  $apr->param('reset');
> 
>         $r->content_type( 'text/html' );
>         $r->send_http_header;
>         return OK if $r->header_only;
>         $host = $r->get_remote_host;
>         $r->print(<<HTMLEND);
> <HTML>
> <HEAD>
> <LINK REL="stylesheet" TYPE="text/css"
>     HREF="/styles/lightstyle.css"
> >
> <TITLE>Hello $host</TITLE>
> <BODY>
> <H1>Sql Client</H1>
> <FORM METHOD="POST">
> <P>Enter your Select Statement:
> <BR>
> <TEXTAREA  NAME="sql" ROWS=8 COLS=60 WRAP>$sql</TEXTAREA>
> <BR>
> <INPUT TYPE="SUBMIT" VALUE="Submit">
> <INPUT TYPE="SUBMIT" NAME="reset" VALUE="Reset">
> </FORM>
> HTMLEND
>         $r->rflush;
>         getarray($sql) unless $sql =~ /^SELECT$/;
> 
>         $r->print(<<HTMLEND);
> </BODY>
> </HTML>
> HTMLEND
>         return OK;
> }
> 1;

-- 
RTFM: Not just an acronym, it's the LAW!

Reply via email to