[caracas-pm] Re: [l-desarrollo] Consulta a Informix mediante Perl DBI

Francisco Obispo fobispo at nic.ve
Mon Sep 6 09:53:57 CDT 2004


Hola,


Ernesto Hernandez-Novich wrote:

>On Fri, 3 Sep 2004, Alexis Arnal wrote:
>  
>
>>Ya pude conectarme a la base de datos Informix, sin embargo ahora me
>>surgió un problema al realizar una consulta.
>>    
>>
>[...]
>  
>
>>$statement=$dbh->prepare("SELECT nombre from tpersona where
>>                         cedula='12345678'")
>>    
>>
>
>No es una buena idea usar "comilleo" (lo mejor que se me ocurre por
>"quoting") explícito en  DBI porque cada manejador las trabaja
>diferentes. En Oracle y PostgreSQL, las cadenas se encierran entre
>comillas sencillas, pero en Informix (si mal no recuerdo) con comillas
>dobles. De modo que una solución primitiva sería
>
>  my $sql = q{ select nombre from tpersona where cedula = "12345678" };
>  $stmt = $dbh->prepare($sql);
>
>Pero aún así, esto tiene dos cosas feas: primero, el hecho de usar
>las comillas explícitamente; segundo, como el query tiene "cableado" el
>valor de búsqueda, el query no es reutilizable con facilidad. La manera
>adecuada de hacer este tipo de cosas es
>
>  my $sql = q{ select nombre from tpersona where cedula = ? };
>  $stmt = $dbh->prepare($sql);
>  $stmt->execute("12345678");
>
>porque el execute() se encarga del "comilleo" adecuado (le deja ese
>trabajo al DBD, como debe ser), el query está parametrizado con lo que
>cualquier otra consulta _idéntica_ en la cual sólo cambie el valor de
>búsqueda utilizará la misma consulta, y se puede reutilizar en el propio
>programa Perl con facilidad.
>
>La solución final, y más elegante, es hacer la ligadura de variables del
>programa a las variables libres, i.e. vincular una variable $cedula al ?
>en el query, de ese modo basta hacer
>
>$cedula = "12345678"; $stmt->execute;
>
>
>  
>
No debería ser:
$stmt->execute($cedula);

Para lo cual el orden de izquierda a derecha en que aparezcan los ? , 
serán reemplazados
por las variables debidamente "comilladas" según el tipo de datos.

En caso de que se quiera efectuar este tipo de comportamiento,
tendrás que "ligar" estas variables con los "Marcadores de lugar" o 
Placeholders,
a través de metodos como bind_param_inout, donde puedes establecer
una referencia a un escalar, el cual será leido al momento de llamar 
execute,


así que con un query como:

$usuario="fobispo";
$sql="SELECT * FROM users WHERE user=?";


puedes hacer:

$sth=$dbh->prepare($sql);

# 1 = primer Placeholder, Referencia al escalar $usuario, $len max 
tamaño posible para $usuario)
$sth->bind_param_inout(1,\$usuario,$len); 
 
luego podrás llamar:

$sth->execute;

y de esta forma, el paquete DBI, sabrá obtener el valor a pasarle a 
user=?, según el valor de $usuario.


Por ahora, yo prefiero pasarle los valores directamente en el 
$sth->execute();


saludos


>y DBI sabe que debe utilizar el valor de $cedula en el lugar del ?.
>Revisa la documentación de DBI al respecto. Con ésta técnica los
>programas resultan mucho más claros, fáciles de mantener, y aprovechas
>mejor las facilidades del manejador de base de datos.
>
>  
>
>>while (( $cedula,$nombre)=$statement->fetchrow_array){
>>		print " $cedula|$nombre|\n";
>>    
>>
>
>Lo mismo aquí. Usar ligaduras es mucho más elegante y eficiente, sobre
>todo si piensas manipular grandes cantidades de datos.
>
>  
>
>>Otro problema es que al parecer no valida el usuario y el password, ya
>>que los cambie arbitrariamente y se seguía conectándose.
>>    
>>
>
>Ese es un problema de configuración del manejador de base de datos; el
>DBA no está siendo suficientemente estricto al aceptar conexiones
>remotas. No es un problema de Perl ni del DBI/DBD.
>  
>

-- 
-------------------------
\ Ing. Francisco Obispo   \     _         ______ |
 \  Coordinador del NIC-VE \  /   \___-=0`/|0`/__|
  \  CNTI - REACCIUN        \_\          / | /    )
  / ----------------------- /  `/-==__ _/__|/__ -|
 / Tlf. +58 212 771 8584   /   *             \ | |
/ email: fobispo at nic.ve   /                   (o)
--------------------------



More information about the caracas-pm mailing list