• Publicidad

Función de DBI y TMPL

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Función de DBI y TMPL

Notapor zozo666 » 2007-05-31 12:57 @581

Tengo un problema con este código

Este código es una porción de el código que estrae la información de la tabla y la lista en un html en forma de tabla.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$t->param(ROWS => $dbh->selectall_arrayref('SELECT * FROM opiniones', { Slice => {} }));
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo implementé y me funciona. El problema es que no sé para que sirve cada cosa que hay ahí. Por ejemplo { Slice => {} } o $dbh->selectall_arrayref.

Saludos y Gracias de antemano.
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Publicidad

Notapor explorer » 2007-05-31 14:49 @659

{ Slice => {} } es un hash anónimo (está rodeado por '{}') que tiene una clave llamada Slice y como valor tiene otro hash anónimo que no tiene ningún componente o elementos.

$dbh->selectall_arrayref es una llamada al método selectall_arrayref del objeto $dbh.

Si suponemos que todo esto se debe a usar el módulo DBI, concluimos que:

a. Con Slice => {} quiere decir que recupere todos los campos de la base de datos y los almacene en un referencia a un hash, una vez por fila de la tabla de resultado de la consulta.

b. selectall_arrayref realiza las operaciones de prepare(), execute() y fetchall_arrayref() de la sentencia SQL indicada. Recupera todos los registros devueltos por la base de datos y los devuelve en una estructura de referencia a un array en que cada elemento es una referencia a un hash cuyas claves son los nombres de los campos de la base de datos y los valores los correspondientes a la fila de la tabla devuelta por la consulta.
Última edición por explorer el 2007-06-02 04:46 @240, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zozo666 » 2007-06-02 00:40 @069

Buenísimo, muchas gracias. Ahora... ¿hay alguna otra variante de realizar los mismo, algo más mecánico o más fácil? Muchas gracias
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Notapor explorer » 2007-06-02 06:36 @316

Lo mejor es ir al manual de DBI, y quizás empezar por la sección "Outline Usage":

http://search.cpan.org/~timb/DBI-1.56/D ... line_Usage

Pero, aparte del Tutorial incluido en este foro (Cómo conectarte a tu database), las reglas básicas son:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use DBI;
use strict;

# Conexión
# Parámetros:
# $dsn contiene la descripción del tipo y driver a usar con la base de datos, así como su posible localización
# $user contiene el nombre del usuario con el que nos conectamos a ella
# $password contiene la contraseña de ese usuario
# El resto de opciones, son eso, opcionales. Consultar el manual para ver su significado.
# Salida:
# $dbh almacenará el manipulador con la base de datos
my $dbh = = DBI->connect($dsn, $user, $password, { RaiseError => 1, AutoCommit => 0 })
   or die "ERROR en la conexión con la base de datos $dsn: $DBI::errstr";

# Preparación de la sentencia SQL
my $sql = 'SELECT * FROM opiniones';
my $sth = $dbh->prepare( $sql );

# Ejecución
$sth->execute();

# Obtención de los datos
while ( my @row = $sth->fetchrow_array ) {
    print "@row\n";
}

# Desconexión
$dbh->disconnect();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Aquí se elige la forma normal de recuperación: usar fetchrow_array que recupera una sola de las filas de la tabla de resultados y la devuelve como una lista de valores, que la almacenamos en la variable @row.

Hay otras formas de recuperación: en un hash por filas, todo el resultado en una referencia a un array en que cada elemento es un array con los valores de cada fila (selectall_arrayref), lo mismo pero con hashes, etc. etc.

El manual indica que la forma de obtención más rápida es la siguiente: usar fetchrow_arrayref() con el uso además de bind_columns(). Ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$sth->prepare( 'SELECT usuario,imagen,direccion FROM direcciones WHERE usuario=?' );
$sth->execute( 'Miguel' );
my ($usuario,$imagen,$direccion);
$sth->bind_columns( \$usuario, \$imagen, \$direccion); # que es lo mismo que poner bind_columns(\($usuario,$imagen,$direccion))
while ( $sth->fetch ) {                                # fecth() es un alias de fetchrow_arrayref()
    print "El usuario $usuario vive en $direccion.\n";
    print "Su imagen está en $imagen.\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Como vemos, el acceso a los campos es muy visual gracias a la ayuda de bind_columns(). Si no fuera por ella, tendríamos que recuperar los datos de esta manera:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while ( $fila_ref = $sth->fetchrow_arrayrey() ) {
    print "El usuario $fila_ref->[0] vive en $fila_ref->[2].\n";
    print "Su imagen está en $fila_ref->[1].\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
$fila_ref es una referencia a un array (que es lo que nos devuelve la función fetchrow_arrayref) por lo que debemos usar la 'indirección' (->) y luego, como es un array, accedemos a los campos de la fila por medio de sus índices. Sabemos el orden de los campos porque se los hemos puesto en el SELECT.

Hay más formas de obtener los datos, pero darían para explicarlo tanto como un libro (que ya está escrito, por cierto).

Otra gente más moderna prefiere usar otros módulos de la familia DBIx::Class, como por ejemplo DBIx::Simple, o DBIx::Easy.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado