El primer error indica que $st no contiene un objeto DBI, así que hay un problema a la hora de pasar ese argumento.
Me dices que estoy pasando mal la variable $dbh, según entiendo, lo voy a verificar y cambiar el paso de variable de una rutina a otra.
La salida de
>> Found 0 Guerras.Mundo
es porque está comentada la línea 8 de imprime_mundo y la línea 10 está sacando el valor de $lineas de... no se sabe dónde.
La línea 8 en imprime_mundo está comentada, porque decía que no estaba disponible, pero todo esto se debe a la primera contestación, que la variable de “dbi” que equivale $dbh, no llega correctamente.
Y si te das cuenta esta variable $lineas solamente se utiliza en la línea 10, no es la razón planteada, ya que después del select se imprime la cantidad de registros y estos son tomados de lo que selección, y está en cero, por la primera respuesta que $dbh, no llega correctamente.
Muy divertidas las variables $numero_0, $numero_1, $numero_2... ¿se pusieron para despistar a los espías o para fastidiar a los programadores?
No soy muy afán a utilizar muchas constantes como sería preguntar por 0, o preguntar por “******algún texto******” porque, cuando tienes que cambiar por alguna razón, cambias en todo el texto, como por ejemplo preguntar por 10. Y ahora vas a preguntar por 20, solamente así cambias una variable no tienes que revisar todo el código. Claro, los nombre de $numero_0, no sería correcto con un valor de “2”, pero es más fácil, cambiar de $numero_0, por $numero_2, en todo el texto. Porque si tienes que hacer este cambio es más fácil de esta forma, que cambiar 0 por 2, porque te chutaría el 100, 10, 50, 60, y esos no los quieres cambiar, esa es mi razón.
Las líneas 8 y 9 de select_db2 definen la misma variable, así que eso me dice que no estás usando
use strict;
y sospecho de que tampoco tienes activado
use warnings;
La variable de la línea 8 que se define, no me interesa qué valor pueda tomar, por la plancho en la línea 9.
En serio: los necesitas. Perl es tu mejor amigo a la hora de programar. Él mismo te dirá dónde están los primeros errores. Quizás tengas que escribir más my(), pero el programa quedará muy sólido.
Estoy utilizando variable globales, como son las contantes entre ellas están todos los $numero_0, y se definen en una subrutina. Tendría que llamar como main::variable, y así no fue preparado el programa, para los próximos programas lo tomaré en cuenta. Este programa está arriba de 20 000 líneas.
El error grave está en el paso de $sth entre las funciones.
En la línea 44 de select_db2() dice
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
my $datos="$status|$sth";
Esa línea está interpolando las variables $status y $sth en cadena de caracteres. No hay problema con $status, porque contiene un valor escalar, pero $sth es un objeto, por lo que su interpolación será la versión texto del objeto. Por eso sale en pantalla "DBI::st=HASH(0xa27cea0)".
¿Al momento que se guarda en una cadena las variables en el caso de dbi, cambia su valor? Si la respuesta es sí, quiere decir que es por eso sin revisar el programa, que al momento del select, no encuentra nada, muy independientemente que los datos de la búsqueda estén bien.
¡Pero vuelvo a preguntar!
Cuando no se encuentran registros en el select, los inserta, de lo que en memoria tiene, ¿Porqué, en el insert sí funciona?
Using perl Syntax Highlighting
sub insert_mundo
{
print "$year/$mon/$mday:$hour:$min:insert_mundo entra \n";
my $dbh=$_[$numero_0];
my $table=$_[$numero_1];
my $indicador=$_[$numero_2];
&verifica_campos;
my $datos="\"$DB2_Mundo\",$DB2_Numero_Pueblos,$indicador,$DB2_Monedas,$DB2_Monedas_Generadas";
my $status=&insert_db2($dbh,$table,$datos);
return($status);
}
sub insert_db2
{
print "$year/$mon/$mday:$hour:$min:insert_db2 entra \n";
my $dbh=$_[$numero_0];
my $table=$_[$numero_1];
my $datos=$_[$numero_2];
my $comando_insert="insert into $table values($datos);";
print "################################################################\n";
print "$comando_insert\n";
print "################################################################\n";
my $db="$comando_insert";
my $sth = $dbh->prepare("$db") || die "$DBI::errstr";
my $status=$sth->execute();
if(!defined $status)
{
print "################################################################\n";
print "$year/$mon/$mday:$hour:$min:$table:ERROR:$DBI::errstr \n";
print "################################################################\n";
$status=$numero_1;
exit;
}
else
{
$status=$numero_0;
}
return($status);
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
No sé cómo será select_puntos(), pero me da la sensación de que tendrá las mismas líneas que select_db2(), porque, al llegar a la línea 20 de imprime_mundo(),
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
my $datos=&select_puntos($dbh,$table,$llave,$numero_1);
my ($status,$sth)=split(/\|/,$datos);
if($status==$numero_0)
{
&imprime_puntos($sth,$table);
La subrutina select_puntos solo varía en la cantidad de datos de la tabla select_mundo, pero para seleccionar de acuerdo a la llave, utiliza una sola rutina que es select_db2.
La línea 20 está recibiendo unos $datos desde select_puntos(), que según la línea 21, se trata de una cadena de caracteres. Esa cadena la partes con split() en la línea 21, y dejas el resultado en $status y $sth. En ese momento, esas variables siguen conteniendo cadenas de caracteres. Aunque la variable se llame $sth no significa que contenga un objeto DBI. Sólo es una cadena de caracteres.
No sé lo que hace imprime_puntos(), pero si ese método cree que $sth es un objeto DBI, se equivoca completamente.
El error es ese: pasar entre funciones la conversión a texto de un objeto DBI.
El código es un poco... lioso... Le faltan buenas técnicas de programación. Por ejemplo: cuando el programa se hace muy grande, es muy peligroso confiar en las variables globales. Y las variables locales con my() tienen su vida limitada al contexto donde se declaran. Por eso es importante trabajar bien con los argumentos que se pasan a las funciones.
Una cosa más: si quieres tener un sistema profesional de registrado, te recomiendo Log-Log4perl. Te abreviará mucho el código de logging.
Dame una idea de cómo pasar un objeto la variable $dbh y $sth, a las subrutinas.
O cómo regresar su valor por ejemplo al select, y después para el imprime. O estas dos variable lo más correcto sería convertirlas en globales. Porque, si es así como lo dices y como lo entiendo, es que ese el el problema de todo.