[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