Foros del Web » Programación para mayores de 30 ;) » Programación General »

Php a Perl

Estas en el tema de Php a Perl en el foro de Programación General en Foros del Web. Cordial saludo, tengo el siguiente script en php: $sql=" select max(campo_id)+1 numero from tabla"; $rs = mysql_query($sql,$conn); $row = mysql_fetch_array($rs); $nummax = $row["numero"]; $sql2="insert into ...
  #1 (permalink)  
Antiguo 15/06/2006, 10:40
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 19 años
Puntos: 0
Php a Perl

Cordial saludo, tengo el siguiente script en php:

$sql=" select max(campo_id)+1 numero from tabla";
$rs = mysql_query($sql,$conn);
$row = mysql_fetch_array($rs);
$nummax = $row["numero"];

$sql2="insert into tabla2 (campo1, campo2) values (1, $nummax)";
$rs2= mysql_query($sql,$conn);
$row2 = mysql_fetch_array($rs2);

como podria hacerlo en PERL usando el modulo de DBI?
  #2 (permalink)  
Antiguo 15/06/2006, 10:47
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
http://perlenespanol.baboonsoftware....ut/000045.html

Te recomiendo este tutorial, te conecta a la base de datos mediante DBI en una forma muy eficiente y tiene ejemplos sobre como hacer selects e inserts...Por sierto el SQL es lo mismo para todos...

Lo que veo que en la línea $rs2= mysql_query($sql,$conn); debería ser $sql2

leete el tutorial y decime si te queda alguna duda...

Saludos
__________________
Esteban Quintana
  #3 (permalink)  
Antiguo 15/06/2006, 13:57
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 19 años
Puntos: 0
Esteban, gracias por tu respuesta, con base a ello contruí el sig. script:

Código:
#!/usr/bin/perl -w

package file;

use strict;
use DBI;

my $db_user = "aaa";
my $db_pass = "bbb";
my $host_name = "10.10.10:2210";
my $db_name = "base";
# vars
my $q_string = "DBI:mysql:host=$host_name;database=$db_name";
sub connect{
return (DBI->connect ($q_string, $db_user, $db_pass,
{PrintError => 0, RaiseError => 1}));
}
my($dbh,$sth);

$dbh = file->connect();
$sth = $dbh->prepare('select max(id_tabla1)+1 numero from tabla1') or die("Couldn't prepare statement: " . $dbh->errstr);
$sth->execute() or die("Couldn't execute statement: " . $sth->errstr);
my $maxnum = $sth->fetchrow_array();
$sth->finish;

$sth1-> $dbh->prepare('insert into tabla1 (id_tabla1) values ($maxnum')
$sth1->execute() or die("Couldn't execute statement: " . $sth->errstr);
$sth1->finish;
$dbh->disconnect;

1
exit;
  #4 (permalink)  
Antiguo 15/06/2006, 14:20
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
son dos archivos los que tenés que crear uno el file.pm y otro el script.pl en donde solo tienes

Código:
my($dbh,$sth);

$dbh = file->connect();
$sth = $dbh->prepare('select max(id_tabla1)+1 numero from tabla1') or die("Couldn't prepare statement: " . $dbh->errstr);
$sth->execute() or die("Couldn't execute statement: " . $sth->errstr);
my $maxnum = $sth->fetchrow_array();
$sth->finish;

$sth1-> $dbh->prepare('insert into tabla1 (id_tabla1) values ($maxnum')
$sth1->execute() or die("Couldn't execute statement: " . $sth->errstr);
$sth1->finish;
$dbh->disconnect;
Pero tienes un error en
$sth1-> $dbh->prepare('insert into tabla1 (id_tabla1) values ($maxnum')
$sth1->execute() or die("Couldn't execute statement: " . $sth->errstr);

debe ser así
$sth1-> $dbh->prepare('insert into tabla1 id_tabla1 values ?');
$sth1->execute($maxnum) or die("Couldn't execute statement: " . $sth->errstr);

Así le estás mandando el $maxinum a través de la función execute

Obviamente antes de esas líneas (en script.pl) tenés que llamar al intérprete y llamara tu librería file.pm...Lo tienes en el tutorial...

Saludos
__________________
Esteban Quintana
  #5 (permalink)  
Antiguo 15/06/2006, 15:06
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 19 años
Puntos: 0
Muchas Gracias!! Esteban, entonces la cuestión sería asi:

archivo auto.pm:

Código:
#!/usr/bin/perl -w

package AUTO;

use strict;
use DBI;

my $db_user = "aaa";
my $db_pass = "bbb";
my $host_name = "10.10.10.10:3306";
my $db_name = "base;
# vars
my $q_string = "DBI:mysql:host=$host_name;database=$db_name";
sub connect{
return (DBI->connect ($q_string, $db_user, $db_pass,
{PrintError => 0, RaiseError => 1}));
}

1
y el otro llamado script.pl:

Código:
use AUTO
my($dbh,$sth);

$dbh = AUTO->connect();
$sth = $dbh->prepare('select max(id_tabla)+1 num from tabla') or die("Couldn't prepare statement: " . $dbh->errstr);
$sth->execute() or die("Couldn't execute statement: " . $sth->errstr);

my $maxnum = $sth->fetchrow_array();
$sth->finish;

$sth1-> $dbh->prepare('insert into tabla (id_tabla) values (?)');
$sth1->execute($maxnum) or die("Couldn't execute statement: " . $sth->errstr);
$dbh->disconnect;
exit;
  #6 (permalink)  
Antiguo 15/06/2006, 15:14
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
bien pero el #!/usr/bin/perl -w debes de ponerlo en el script.pl, no en el package...

Pruébalo y me dices...

Saludos
__________________
Esteban Quintana
  #7 (permalink)  
Antiguo 16/06/2006, 09:22
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 19 años
Puntos: 0
Arg 6 - Serbia 0

Saludos!! acabo de probar el script (por fin instale active perl) y tengo el siguiente error... Can't call method "DBI::db=HASH(0x1ad02f4)" on an undefined value at C:\auto.pl
  #8 (permalink)  
Antiguo 16/06/2006, 09:30
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
instalaste el módulo DBI y el DBD::mysql ???

Para intalarlos checkea el tutorial de www.perlenespanol.com o este faq

http://www.forosdelweb.com/showpost....1&postcount=26

Saludos
__________________
Esteban Quintana
  #9 (permalink)  
Antiguo 16/06/2006, 09:33
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 19 años
Puntos: 0
Efectivamente tengo instalado los modulos necesarios, ya que imprimo la variable $maxnum que proviene de un query (select max) y lo trae sin problemas..

Un saludo
  #10 (permalink)  
Antiguo 16/06/2006, 09:34
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
Perdón, esta línea esta mal

$sth1-> $dbh->prepare('insert into tabla (id_tabla) values (?)');

debería ser

$sth1 = $dbh->prepare('insert into tabla (id_tabla) values (?)');

Saludos
__________________
Esteban Quintana
  #11 (permalink)  
Antiguo 16/06/2006, 09:50
 
Fecha de Ingreso: mayo-2005
Mensajes: 15
Antigüedad: 19 años
Puntos: 0
Me funcionó!!!!!!! muchas gracias!!!!!!!!!
  #12 (permalink)  
Antiguo 18/06/2006, 22:09
 
Fecha de Ingreso: mayo-2003
Mensajes: 328
Antigüedad: 21 años
Puntos: 0
Hola:

Hablando del temas, aquí vienen unos tips que no puse en el tutorial pero que les podrían servir para el futuro.

Las conexiones las base de datos son algo costosas en cuanto a recursos, así que cuando realices una conexión no la finalices sino hasta que hayas terminado de ejecutar todos los querys que deseas realizar.

Lo siguiente es en cuanto al uso de nuestro objeto DBI, en este caso el que inicializamos con nuestra variable $sth.

Muy a menudo sucede que deseamos ejecutar el mismo query una y otra vez por medio de un loop. Podríamos estar tentados a hacer algo así:

Código:
use strict;
use AUTO;


my @frutas = ('platano', 'manzana', 'pera');

my $dbh = AUTO->connect();


    for my $fruta(@frutas){

        my $sth = $dbh->prepare('SELECT COUNT(*) FROM frutas WHERE fruta=?') or die("Couldn't prepare statement: " . $dbh->errstr);
        $sth->execute($fruta) or die("Couldn't execute statement: " . $sth->errstr);
        my $conteo = $sth->fetchrow_array();
        $sth->finish;

        print "$fruta aparece $conteo veces\n";

    }

$dbh->disconnect;
En el ejemplo estoy suponiendo que usamos un módulo como el tuyo. Parece estar bien, pero el chiste del prepare() que ejecutamos al momento de inicializar la variable $sth, es el poder preparar un query que podremos rehúsar. En este caso la sintáxis correcta sería:


Código:
        my $sth = $dbh->prepare('SELECT COUNT(*) FROM frutas WHERE fruta=?') or die("Couldn't prepare statement: " . $dbh->errstr);

    for my $fruta(@frutas){

        $sth->execute($fruta) or die("Couldn't execute statement: " . $sth->errstr);
        my $conteo = $sth->fetchrow_array();

        print "$fruta aparece $conteo veces\n";

    }

        $sth->finish;

$dbh->disconnect;
Ahora si estamos haciendo un uso "correcto" de nuestro query, lo preparamos y ya podemos usarlo las veces que nosotros querramos.

Bueno, estos son mis dos centavos de la noche.


Saludos
__________________
Uriel Lizama, Perl Developer

Aprende Perl en Perl en Español.
  #13 (permalink)  
Antiguo 19/06/2006, 08:38
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 2 meses
Puntos: 90
Gracias kidd por tus comentarios...Siempre es bueno aprender algo de buenos estilos de programación...

Saludos
__________________
Esteban Quintana
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:10.