[l-desarrollo] Problema llenando base de datos Mysql con perl.

Ernesto Hernandez-Novich emhn at telcel.net.ve
Wed Apr 9 07:20:23 CDT 2003


On Tue, 8 Apr 2003, Eladio Garcia wrote:
> este es parte del scritp resumido
[...]
> use CGI qw/:standard/;
> use DBI;
> $dbh =
> DBI->connect("DBI:mysql:base_de_datos:localhost","usaurio","pass") or
> die "No se pudo conectar a la base de datos";
> $q = new CGI;
> %data= $q->Vars;
> if ($data{'bandera'} eq "rent")
> {       $db_user = "l_rent";
>         $query = "INSERT INTO for_rent ( `id`, `login`, `price`, `city`,
> `neighborhood`, `street`, `no`, `phone`, `email`, `baths`, `bedrooms`,
> `pets`, `smoker`, `negotiable`, `terms`, `comments`, `date`) values ('',
> '$data{'login'}', '$data{'phone2'}', '$data{'city'}',
> '$data{'neighborhood'}', '$data{'street'}', '$data{'no'}',
> '$data{'phone'}', '$data{'email'}', '$data{'baths'}',
> '$data{'bedrooms'}', '$data{'pets'}', '$data{'smoke'}',
> '$data{'negotiable'}', '$data{'terms'}', '$data{'comments'}' ,
> '0000-00-00')";
> }

Primero lo primero.

Esto

$x = "valor para bar"; $y = "valor para baz";
$query = "insert into foo ( bar, baz ) values ( $x, $y )";
$sth = $dbh->prepare($query);
$sth->execute;

es _lento_, ineficiente en el uso de la memoria y doloroso para
cualquier manejador de base de datos. Lo correcto es utilizar variables
posicionales (bind variables)

$x = "valor para bar"; $y = "valor para baz";
$query = "insert into foo ( bar, baz ) values ( ? , ? )";
$sth = $dbh->prepare($query);
$sth->execute($x,$y);

pues le permite al manejador analizar y optimizar el query _una_ sola
vez, mantenerlo en su cache propio y simplemente sustituir las variables
posicionales con diferentes valores cada vez. Haz un ejemplo simple para
convencerte

for (1..100_000) {
  my $sth = $dbh->prepare("insert into numeros ( numero ) values ( $_ )");
  $sth->execute;
}

my $sth = $dbh->prepare("insert into numeros ( numero ) values ( ? )");
for (1..100_000) {
  $sth->execute($_);
}

y verás que el segundo es muchísimo más rápido. Revisa el manual de DBI
para ver más ejemplos al respecto, al igual que las técnicas para
detectar los errores. Es una buena costumbre de programación verificar
los valores de retorno de todas las funciones que puedan fallar, porque
alguna vez van a fallar y va a interesar saber por qué.
-- 
Ernesto Hernández-Novich - Running Linux 2.4.19 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3
¿Sabe leer? Elimine mi firma de sus respuestas; sé quién soy ;)

------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list