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"
TITLEHello $host/TITLE
BODY
H1Sql Client/H1
FORM METHOD="POST"
PEnter 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!