• Publicidad

Acerca de un error en UPDATE SQL

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Acerca de un error en UPDATE SQL

Notapor piero66 » 2011-07-28 10:48 @491

Buen día...Tengo el siguiente problema al momento de actualizar una base de datos SQL a partir de un arreglo.

Cabe mencionar que el arreglo contiene 3 registros pero solo el primero lo actualiza bien, y después manda el error.

El código es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @field = split /\*/, $in{'checks'};
  2.  
  3. foreach $f (@field) {
  4.  
  5.     ( $cup, $sec, $subs, $calle, $ext, $int, $lext, $lint, $col ) = split /-/, $f;
  6.  
  7.     $sth = $dbh->do("use serverboxdu");    # or MiError($DBI::errstr);
  8.  
  9.     $sth
  10.         = $dbh->prepare(
  11.         "update serverboxdu.dbo.cupgral set sec='$sec',subsec='$subs',calle='$calle',numext='$ext',numint='$int',letra_ext='$lext' where cup='x'"
  12.         ) or MiError($DBI::errstr);
  13.  
  14.     $sth->execute or MiError($DBI::errstr);
  15.     $sth->finish;
  16.  
  17.     $cOK++;
  18.  
  19. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


y el error es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Error: Server message number=105 severity=15 state=1 line=1 server=SRV-CARTO text=Unclosed quotation mark after the character string ''.Server message number=102 severity=15 state=1 line=1 server=SRV-CARTO
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4



¿Me podrían echar manasoo? ¡¡ Gracias !!
Última edición por explorer el 2011-07-28 17:23 @766, editado 3 veces en total
Razón: Formateado de código con Perltidy y poner marcas Perl y texto
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Publicidad

Re: Acerca de un error en UPDATE SQL

Notapor explorer » 2011-07-28 11:08 @505

Pues yo no veo el problema, salvo que alguna de las variables contenga una (').

Y no entiendo el porqué pones el "use serverboxdu". Con la llamada connect() ya tienes la variable $dbh asignada a esa base de datos.

Es mejor usar posicionadores, y que sea la propia base de datos la que se encargue de escapar los caracteres peligrosos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @fields = split /\*/, $in{'checks'};
  2.  
  3. foreach my $f (@fields) {
  4.     my ( $cup, $sec, $subs, $calle, $ext, $int, $lext, $lint, $col ) = split /-/, $f;
  5.      
  6.     my $sth = $dbh->prepare("
  7.            update serverboxdu.dbo.cupgral
  8.            set sec=?, subsec=?, calle=?, numext=?, numint=?, letra_ext=?
  9.            where cup='x'
  10.        ")
  11.         or MiError($DBI::errstr)
  12.         ;
  13.      
  14.     $sth->execute($sec, $subs, $calle, $ext, $int, $lext)
  15.         or MiError($DBI::errstr)
  16.         ;
  17.      
  18.     $cOK++;
  19. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

P.D. Que se pueda poner la sentencia SQL en varias líneas (como he puesto) depende del motor de base de datos 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

Re: Acerca de un error en UPDATE SQL

Notapor piero66 » 2011-07-28 14:11 @632

Copié y pasé tal cual el ejemplo que me pasaste en la compilación NO me marca errores pero al ejecutarlo me marca lo siguiente:


Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, eflow@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.


--------------------------------------------------------------------------------

Apache/2.2.3 (CentOS) Server at linuxdu.leon.gob.mx Port 443
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4





:?


Quedó así:

my @field = split /\*/,$in{'checks'};

foreach my $f (@field)

{

my ($cup,$sec,$subs,$calle,$ext,$int,$lext,$lint,$col)= split /-/,$f;

$cup =~ s/\s+$//; $sec =~ s/\s+$//; $subs =~ s/\s+$//; # quita espacios en blanco de la derecha
$calle =~ s/\s+$//;$ext =~ s/\s+$//;$int =~ s/\s+$//;
$lext =~ s/\s+$//;$lint =~ s/\s+$//;$col =~ s/\s+$//;



$condicion="sec=?,subsec=?,calle=?";
if ($ext){$condicion="$condicion,numext=?";}
if ($int){$condicion="$condicion,numint=?";}
if ($lext){$condicion="$condicion,letra_ext=?";}
if ($lint){$condicion="$condicion,letra_int=?";}
if ($col){$condicion="$condicion,colonia=?";}

$sql ="update serverboxdu.dbo.cupgral set $condicion WHERE cup='$cup'";
MiError($DBI::errstr);
print "$cOK: $sql <br>";
$sth = $dbh->prepare($sql) or MiError($DBI::errstr);

$sth->execute($sec,$subs,$calle,$ext,$int,$lext,$lint,$col) or MiError($DBI::errstr);

$cOK++;

}
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Re: Acerca de un error en UPDATE SQL

Notapor explorer » 2011-07-28 17:31 @771

Pero, entonces, no estamos hablando de un programa, sino de un CGI...

Debes consultar los ficheros de registro (log) para ver porqué falla.

Yo lo probaría primero como programa normal, para ver el mensaje de error.
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

Re: Acerca de un error en UPDATE SQL

Notapor piero66 » 2011-07-29 08:32 @397

¡¡ HOLA, YA REALICÉ LO QUE ME COMENTAS !! Y ME MANDA EL SIGUIENTE ERROR EN EL ARCHIVO LOG:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[Fri Jul 29 08:02:36 2011] [error] [client 192.1.47.111] script not found or unable to stat: /home/eflowweb/cgi-bin/reingenieria/none, referer: https://linuxdu.leon.gob.mx/cgi-bin/reingenieria/searchCUP.cgi

[Fri Jul 29 08:02:36 2011] [error] [client 192.1.47.111] script not found or unable to stat: /home/eflowweb/cgi-bin/reingenieria/none, referer: https://linuxdu.leon.gob.mx/cgi-bin/reingenieria/searchCUP.cgi

[Fri Jul 29 08:02:36 2011] [error] [client 192.1.47.111] script not found or unable to stat: /home/eflowweb/cgi-bin/reingenieria/none, referer: https://linuxdu.leon.gob.mx/cgi-bin/reingenieria/searchCUP.cgi

[Fri Jul 29 08:02:36 2011] [error] [client 192.1.47.111] script not found or unable to stat: /home/eflowweb/cgi-bin/reingenieria/none, referer: https://linuxdu.leon.gob.mx/cgi-bin/reingenieria/searchCUP.cgi

[Fri Jul 29 08:02:36 2011] [error] [client 192.1.47.111] script not found or unable to stat: /home/eflowweb/cgi-bin/reingenieria/none, referer: https://linuxdu.leon.gob.mx/cgi-bin/reingenieria/searchCUP.cgi

[Fri Jul 29 08:02:36 2011] [error] [client 192.1.47.111] script not found or unable to stat: /home/eflowweb/cgi-bin/reingenieria/none, referer: https://linuxdu.leon.gob.mx/cgi-bin/reingenieria/searchCUP.cgi

[Fri Jul 29 08:02:36 2011] [error] [client 192.1.47.111] script not found or unable to stat: /home/eflowweb/cgi-bin/reingenieria/none, referer: https://linuxdu.leon.gob.mx/cgi-bin/reingenieria/searchCUP.cgi

[Fri Jul 29 08:03:44 2011] [error] [client 192.1.47.111] ct_send(CS_DESCRIBE_INPUT) returned 0 at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/DBD/Sybase.pm line 133., referer: https://linuxdu.leon.gob.mx/cgi-bin/reingenieria/searchCUP.cgi

[Fri Jul 29 08:03:44 2011] [error] [client 192.1.47.111] Premature end of script headers: searchCUP.cgi, referer: https://linuxdu.leon.gob.mx/cgi-bin/reingenieria/searchCUP.cgi
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4




:(
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Re: Acerca de un error en UPDATE SQL

Notapor explorer » 2011-07-29 10:01 @459

Sale un error con el DBD::Sybase, pero no sale el error completo.

Sería recomendable usar CGI::Carp para ver el mensaje de error en la ventana del navegador web, pero, insisto, antes intentaría ejecutar el programa desde la línea de comandos, no como cgi.
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

Re: Acerca de un error en UPDATE SQL

Notapor piero66 » 2011-07-29 12:39 @568

¡¡ Ya lo probé y funcionó todo bien !! Así quedó:

#! /usr/bin/perl -w

use DBI;
my $dbh = DBI->connect('dbi:Sybase:server=192.1.47.120:1433','user','******') or MiError($DBI::errstr);

my $cOK=0;



$in="2202001000000002012000-22-20-DEL LIDERAZGO-203------*2202001000000002013000-22-20-DEL LIDERAZGO-201-----*2202001000000002011000-22-20-DEL LIDERAZGO-205-----*";



my @field = split /\*/,$in;

foreach my $f (@field)
{
my ($cup,$sec,$subs,$calle,$ext,$int,$lext,$lint,$col)= split /-/,$f;

$cup =~ s/\s+$//; $sec =~ s/\s+$//; $subs =~ s/\s+$//;$calle =~ s/\s+$//;

$ext =~ s/\s+$//;$int =~ s/\s+$//;$lext =~ s/\s+$//;$lint =~ s/\s+$//;

$col =~ s/\s+$//;

$sql ="update serverboxdu.dbo.cupgral set sec='$sec',subsec='$subs',calle='$calle',numext='$ext',numint='$int',letra_ext='$lext',letra_int='$lint',colonia='$col' WHERE cup='$cup'";

print "$cOK: $sql","\n";

$sth = $dbh->prepare($sql) or MiError($DBI::errstr);
$sth->execute() or MiError($DBI::errstr);
$cOK++;
}

¿¿¿Prácticamente es lo mismo que en CGI ??? ¿¿¡¡ Qué crees que sea !!??

:?
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Re: Acerca de un error en UPDATE SQL

Notapor explorer » 2011-07-29 14:04 @628

Hay un espacio entre '#!' y '/usr/bin/perl'

Y para que sea un CGI de verdad, el programa debe devolver las cabeceras típicas de un CGI.

Repasa la página dedicada a CGI en nuestra sección de Tutoriales.
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

Re: Acerca de un error en UPDATE SQL

Notapor piero66 » 2011-08-03 10:32 @480

hola , ya le probé , de otra manera CGI (según yo :oops: ) ¡¡ y caigo en el mismo error !!
:?
el archivo tal cual es el siguiente:


#!/usr/bin/perl -w

use DBI;

use CGI ':standard';

use CGI::Carp qw(fatalsToBrowser);

my $dbh = DBI->connect('dbi:Sybase:server=192.1.47.120:1433','user','******') or MiError($DBI::errstr);

my $cOK=0;

my $q = new CGI;

print "content-type: text/html \n\n";

my %Variables=$q->Vars;



if (!$Variables{'checks'}){print "No hay Datos"; exit 0;}

my @field = split /\*/,$Variables{'checks'};

foreach my $f (@field)

{

my ($cup,$sec,$subs,$calle,$ext,$int,$lext,$lint,$col)= split /-/,$f;

$cup =~ s/\s+$//; $sec =~ s/\s+$//; $subs =~ s/\s+$//;$calle =~ s/\s+$//;

$ext =~ s/\s+$//;$int =~ s/\s+$//;$lext =~ s/\s+$//;$lint =~ s/\s+$//;
$col =~ s/\s+$//;

$sql ="update serverboxdu.dbo.cupgral set sec=\"$sec\",subsec=\"$subs\",calle=\"$calle\",numext=\"$ext\",numint=\"$int\",letra_ext='$lext',letra_int=\"$lint\",colonia=\"$col\" WHERE cup=\"$cup\"";

$sth = $dbh->prepare($sql);

$sth->execute() or die("Couldn't execute statement: " . $sth->errstr);

print "$cOK: $sql <br>";

$cOK++;

}



# el siguiente mensaje indica que el registro num.1 lo actualizo

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
0: update serverboxdu.dbo.cupgral set sec="22",subsec="20",calle="DEL LIDERAZGO",numext="201",numint="",letra_ext='',letra_int="",colonia="CAJA POPULAR SAN NICOLAS" WHERE cup="2202001000000002013000"


y despues manda el error siguiente:

Software error:
Couldn't execute statement: Server message number=105 severity=15 state=1 line=1 server=SRV-CARTO text=Unclosed quotation mark after the character string ''.Server message number=102 severity=15 state=1 line=1 server=SRV-CARTO text=Incorrect syntax near ''. at /home/eflowweb/cgi-bin/reingenieria/conectar.cgi line 45.
For help, please send mail to the webmaster (eflow@localhost), giving this error message and the time and date of the error.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4



Solo actualiza el primer registro y después cuando trata de actualizar el segundo, ¡¡ manda el error !!

:(
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Re: Acerca de un error en UPDATE SQL

Notapor explorer » 2011-08-03 16:20 @722

Hay dos mensajes de error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Unclosed quotation mark after the character string ''.
Incorrect syntax near ''.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Viendo la instrucción $sql, están mezcladas las comillas simples con las dobles. No sé si eso será correcto, con tu motor de base de datos.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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