[Perl] PROBLEMAS CGI-DBI
Gunnar Wolf
gwolf@gwolf.cx
Tue, 27 May 2003 23:33:31 -0500
Jose Antonio Galicia dijo [Tue, May 27, 2003 at 06:14:29PM -0500]:
Abundo un poco más sobre lo que dice Toño - Esto va a hacer que tu
programa corra más rápido y sea menos pesado para el servidor, tal cual
como él dice:
> Si estas leyendo toda la consulta en una sola operación
> usando "fetchall_arrayref" deberias soltar la conexión de
> inmediato. Si vas a mantenerla abierta hasta este punto
> podrias hacer un fetch por cada registro y ahorrarte toda la
> memoria y procesador para crear el contenido de "$table".
Palabras muy ciertas. Acá estás pidiendo a la BD que te mande TODOS los
datos de un jalón. De hecho, usar un sth para esto es bastante ridículo
- En vez de el prepare y execute podrías haber hecho directamente:
$tabla = $dbh->selectall_arrayref($sql);
Sin embargo, usar un sth en este caso es lo más adecuado... Y muy
simple. No tengo a la mano tu código original completo, pero básicamente
te sugiero cambiar (incluyo ya los comentarios que mandó Toño):
$sth=$dbh->prepare($sql) or die $dbh->errstr;
$sth->execute;
$tabla=$sth->fetchall_arrayref;
for $row (@{$table}) {
(...)
print join('',map{"<td>$_</td>"}@{$row}) . "\n";
(...)
}
por
$sth=$dbh->prepare($sql) or die $dbh->errstr;
$sth->execute;
while (my @row = $sth->fetchrow_array) {
(...)
print join('', map{"<td>$_</td>"} @row), "\n";
(...)
}
(notita lateral - Cambio el . de concatenación de Toño por una , - es
más eficiente mandar una lista que concatenar en un sólo elemento)
O, usando HTML::Table, substituyes ese print por simplemente:
$t->addRow(@row);
Más legible, ¿verdad? ;-)
> Esto en cuando al código, no al problema. :(
Ahí estoy de acuerdo... No entiendo por qué se presenta tu problema aún
:-( Sin embargo, seguir mejores prácticas llevará a menos bugs.
Saludos,
--
Gunnar Wolf - gwolf@gwolf.cx - (+52-55)5630-9700 ext. 1366
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF