Página 1 de 1

Consulta sobre toma de valores en un query

NotaPublicado: 2006-11-27 18:27 @811
por Guille
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.002 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

NotaPublicado: 2006-11-27 19:21 @848
por explorer
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

NotaPublicado: 2006-11-27 20:01 @876
por Guille
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

NotaPublicado: 2006-11-27 20:38 @901
por explorer
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].

Creo que hay un error....

NotaPublicado: 2006-11-29 22:16 @969
por Guille
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!!!

NotaPublicado: 2006-11-30 04:34 @232
por explorer
Es mejor que pongas el trozo de código que estás usando...

Código

NotaPublicado: 2006-11-30 09:32 @439
por Guille
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!

NotaPublicado: 2006-11-30 12:47 @574
por explorer
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}.