• Publicidad

Consulta sobre toma de valores en un query

Todo acerca de las bases de datos que existen: SQL, MySQL, Oracle, Postgres, CSV, etc.

Consulta sobre toma de valores en un query

Notapor Guille » 2006-11-27 18:27 @811

Hola a todos. Estoy empezando a utilizar base de datos en mis scripts y tengo muchas dudas... lo que estoy intentando hacer es tomar de un campo de una tabla donde se guardan los correos todos los que hay en la misma (o sea tomar todos los correos :p) y una vez que lo haga poder pasar todos a una variable independiente, parece algo bastante fácil pero se me esta complicando bastante... (he leído el tutorial del sitio sobre este tema varias veces)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;
use DBI;


my $SQL = DBI->connect('DBI:mysql:nombrebd:localhost','root','root');
my $query = $SQL->prepare('select campo from tabla');
$query->execute();

while (my @correos = $query->fetchrow())
{
print @correos;
};

$query->finish;
$SQL->disconnect;
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Los correos se me listan siempre. ¿como se podría decir correos [0]...? ¿alguien podría darme una mano a ver como podría pasar estas direcciones a variables independientes...?

Gracias a todos otra vez... :D
Avatar de Usuario
Guille
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2006-05-31 13:30 @604
Ubicación: Argentina

Publicidad

Notapor explorer » 2006-11-27 19:21 @848

Pero una vez que tengas el correo en la variable independiente, querrás hacer algo con él, ¿no?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use DBI;
use warnings;
use strict;

my $SQL = DBI->connect('DBI:mysql:nombrebd:localhost','root','root');
my $query = $SQL->prepare('select campo from tabla');
$query->execute();

my $correos;
while ( my @correos = $query->fetchrow_array() )
{
    # @correos contiene todos los campos de la fila extraída de la consulta
    # $correos[0] será el primer campo, y suponemos que único, porque en el
    # select sólo hemos pedido un solo campo: campo
    #print "Correo: $correos[0]\n";

    # Vamos acumulando los correos en una variable escalar
    $correos .= $correos[0];
};

# Aquí tendremos todos los $correos reunidos

$query->finish;
$SQL->disconnect;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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 Guille » 2006-11-27 20:01 @876

Claro, lo que quería es que luego a cada correo independiente puede enviarle un mail... y también poder acceder a un correo de todos en particular. ¿Cómo debería ser?

¿Podrías indicarme también cual es la función de .= ?? o sea del punto al lado del igual.

Muchas gracias como siempre Explorer.. You Rock!!!

¡¡¡Saludos!!! :D
Avatar de Usuario
Guille
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2006-05-31 13:30 @604
Ubicación: Argentina

Notapor explorer » 2006-11-27 20:38 @901

El '$correos .= $correos[0];' es la abreviatura de '$correos = $correos . $correos[0];'

Ya veo lo que quieres. Es tener todos los correos en una variable.

Entonces lo mejor será guardarlos en un array.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @correos;
while ( my @correo = $query->fetchrow_array() )
{
    # Vamos acumulando los correos en una variable array
    push @correos, $correo[0];
};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Después de estas líneas ya tienes todos los @correos.

Ahora, para enviarles una carta, se pueden meter en un bucle:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $correo ( @correos ) {
    # Enviar a la dirección del $correo
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y para acceder a un correo en particular (el $i-ésimo): $correo[$i].
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

Creo que hay un error....

Notapor Guille » 2006-11-29 22:16 @969

Seguí intentando sacar los correos de la consulta pero al querer verlos me tiran direcciones hexadecimales algo así :(

HASH(0x9c552f8)HASH(0x9c5537c)HASH(0x9c55400)HASH(0x9c55484)HASH(0x9c55508)HASH(0x9c5558c)HASH(0x9c55610)
HASH(0x9c55694)HASH(0x9c55718)HASH(0x9c5579c)HASH(0x9c55820)HASH(0x9c558a4)HASH(0x9c55928)HASH(0x9c559ac)
HASH(0x9c55a30)HASH(0x9c55ab4)HASH(0x9c55b38)HASH(0x9c55bbc)HASH(0x9c55c40)HASH(0x9c55cc4)HASH(0x9c55d48)
HASH(0x9c55dcc)HASH(0x9c55e50)HASH(0x9c55ed4)HASH(0x9c55f58)HASH(0x9c55fdc)HASH(0x9c56060)HASH(0x9c560e4)
HASH(0x9c56168)HASH(0x9c561ec)HASH(0x9c56270)HASH(0x9c5ae50)HASH(0x9c5aed4)HASH(0x9c5af58)HASH(0x9c5afdc)
HASH(0x9c5b060)HASH(0x9c5b0e4)HASH(0x9c5b168)HASH(0x9c5b1ec)HASH(0x9c5b270)HASH(0x9c5b2f4)HASH(0x9c5b378)
HASH(0x9c5b3fc)HASH(0x9c5b480)HASH(0x9c5b504)HASH(0x9c5b588)HASH(0x9c5b60c)HASH(0x9c5b690)HASH(0x9c5b714)
HASH(0x9c5b798)HASH(0x9c5b81c)HASH(0x9c5b8a0)HASH(0x9c5b924)HASH(0x9c5b9a8)HASH(0x9c5ba2c)HASH(0x9c5bab0)
HASH(0x9c5bb34)HASH(0x9c5bbb8)HASH(0x9c5bc3c)HASH(0x9c5bcc0)HASH(0x9c5bd44)HASH(0x9c5bdc8)HASH(0x9c478c8)
HASH(0x9c4794c)HASH(0x9c479d0)HASH(0x9c47a54)HASH(0x9c47ad8)HASH(0x9c47b5c)HASH(0x9c47be0)HASH(0x9c47c64)
HASH(0x9c61d24)HASH(0x9c61da8)HASH(0x9c61e2c)HASH(0x9c61eb0)HASH(0x9c61f34)HASH(0x9c61fb8)HASH(0x9c6203c)
HASH(0x9c620c0)HASH(0x9c62144)HASH(0x9c621c8)HASH(0x9c6224c)HASH(0x9c622d0)HASH(0x9c62354)HASH(0x9c623d8)
HASH(0x9c6245c)HASH(0x9c624e0)HASH(0x9c62564)HASH(0x9c625e8)HASH(0x9c6266c)HASH(0x9c626f0)HASH(0x9c62774)
HASH(0x9c627f8)HASH(0x9c6287c)HASH(0x9c62900)HASH(0x9c62984)HASH(0x9c62a08)HASH(0x9c62a8c)HASH(0x9c62b10)
HASH(0x9c62b94)HASH(0x9c62c18)HASH(0x9c68810)HASH(0x9c68894)HASH(0x9c68918)HASH(0x9c6899c)HASH(0x9c68a20)
HASH(0x9c68aa4)HASH(0x9c68b28)HASH(0x9c68bac)HASH(0x9c68c30)HASH(0x9c68cb4)HASH(0x9c68d38)HASH(0x9c68dbc)H
ASH(0x9c68e40)HASH(0x9c68ec4)HASH(0x9c68f48)HASH(0x9c68fcc)HASH(0x9c69050)HASH(0x9c690d4)HASH(0x9c69158)
HASH(0x9c691dc)HASH(0x9c69260)HASH(0x9c692e4)HASH(0x9c69368)HASH(0x9c693ec)HASH(0x9c69470)HASH(0x9c694f4)
HASH(0x9c69578)HASH(0x9c695fc)HASH(0x9c69680)HASH(0x9c69704)HASH(0x9c69788)HASH(0x9c6e1e0)HASH(0x9c6e264)


Mi pregunta es si cada una de esta direcciones representan a una dirección de correo de la tabla y así poder enviar el mail. ¿¿ Me he podido explicar ?? ¿Y en caso de que sea que si por no aparece [email protected], [email protected].... etc..?

¿que son esas direcciones?

¡Muchas gracias como siempre por sus respuestas!

Saludos!!!
Avatar de Usuario
Guille
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2006-05-31 13:30 @604
Ubicación: Argentina

Notapor explorer » 2006-11-30 04:34 @232

Es mejor que pongas el trozo de código que estás usando...
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

Código

Notapor Guille » 2006-11-30 09:32 @439

Ok, explorer no hay problema, sólo no lo había colocado porque como estoy tratando de empezar a trabajar con módulos y es probable que este ahí el error. Copio el método del módulo que estoy utilizando y luego el script :wink:

Método:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub get_user_by_status{
        my $self        = shift;

        my %params      = @_;
        my $status      = $params{status} || 0;

        my $rs = $self->{SQL}->prepare("SELECT * FROM USR_CORP WHERE UCORP_STATUS = ?");
        $rs->execute($status);

        return $rs->fetchall_arrayref({});
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use lib '/usr/local/apps/apache/lib/perl';

use strict;
use DBI;
use CorporateSales;

my $SQL = DBI->connect('DBI:mysql:basedatos:localhost','usr','pass');

my $corpSales   = CorporateSales->new(SQL => $SQL);
my $rs          = $corpSales->get_user_by_status( status => 1);

foreach my $row (@{$rs})
{
print $row;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Cuando ejecuto esto es cuando salen las direcciones anteriores hexadecimales, por eso nuevamente lo que quieres es poder tener cada dirección de correo en una variable para realizar el foreach... ¿esas direcciones hexadecimales estan mal?...

¡Saludos a todos y gracias como siempre!
Avatar de Usuario
Guille
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2006-05-31 13:30 @604
Ubicación: Argentina

Notapor explorer » 2006-11-30 12:47 @574

El tema es que la función te devuelve una referencia a un array. Tu, correctamente, lo desreferencias con un @{$rs}. Pero cada elemento de ese array es otro array.

Eso es lo que dice el manual, por lo que en pantalla, en vez 'HASH' deberían aparecer 'ARRAY'.

En lugar de hacer un print, debes averiguar la estructura que tiene cada $row.

Una forma de hacerlo es usando Data::Dumper:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Data::Dumper;
#... tu programa
{
#print $row
print Dumper $row;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Supongamos que $row es una referencia a un array y que el correo electrónico está en 4ª posición. Entonces print $row->[3] sacará esa dirección.

Si en lugar de ser un array es un hash, entonces el acceso podría ser algo como $row->{correo}.
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 Bases de datos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados