• Publicidad

Parámetro a BD MYSQL

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

Parámetro a BD MYSQL

Notapor panterozo » 2010-03-29 14:16 @636

Hola nuevamente.

Tengo una base de datos MySQL y no había tenido problemas en enviarle datos, ya sea para select, delete, insert y update.

Estoy tratando de cambiar una fecha, de la forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. SELECT DATE_ADD(NOW(), INTERVAL 3 YEAR)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Escribo esta línea en phpMyAdmin y me indica la fecha que será en 3 años más, indicando la hora que corresponda.

Para pasarlo a Perl, he intentado lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. 1.- SELECT DATE_ADD(NOW(), INTERVAL ? ?)
  2.  
  3. 2.- SELECT DATE_ADD(NOW(), INTERVAL ?)
  4.  
  5. 3.- SELECT DATE_ADD(NOW(), ?)
  6.  
  7. 4.- SELECT ?
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y para la llamada a estas funciones...

1.- 3 YEAR (por separado)

2.- 3 YEAR (En una sola variable)

3.- INTERVAL 3 YEAR (En una sola variable)

4.- DATE_ADD(NOW(), INTERVAL 3 YEAR) (En una sola variable)


Si ejecuto esto en Perl, pero sin enviarle valores, es decir

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. DATE_ADD(NOW(), INTERVAL 3 YEAR)
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


tal cual, no existe problemas, me indica la fecha y hora que serán dentro de 3 años.

Para los casos anteriores, a lo más me muestra lo siguiente:

2010-03-29 16:12:49 (Fecha y hora actual) 0000-00-00 00:00:00 (Fecha y hora dentro de 3 años)

Así, como se puede observar, no estoy obteniendo los resultados que necesito.

Espero me puedan ayudar ;)

Saludos
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Publicidad

Re: Parámetro a BD MYSQL

Notapor explorer » 2010-03-29 14:58 @665

Sería interesante ver el código Perl que estás usando, porque me temo que el problema y la solución están ahí.
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: Parámetro a BD MYSQL

Notapor kidd » 2010-03-29 15:15 @677

El problema es que cuando haces:

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. SELECT DATE_ADD(NOW(), INTERVAL ?)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Después de hacer la depuración de las variable te va a resultar en el siguiente query:

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. SELECT DATE_ADD(NOW(), 'INTERVAL 3 YEAR')
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Esto no será reconocido por MySQL y por eso te está regresando resultados que no esperas.

Lo que tienes que hacer sería:

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. SELECT DATE_ADD(NOW(), INTERVAL ? YEAR)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


ó

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. SELECT NOW() + INTERVAL ? YEAR
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Parámetro a BD MYSQL

Notapor panterozo » 2010-03-29 15:43 @696

Muchas gracias por las respuestas ;)

Ha funcionado con la solución de kidd...

Lo he escrito así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
  1. DATE_ADD(NOW(), INTERVAL + ? YEAR)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y devuelve las fechas correspondientes, para tres años más:

2010-03-29 17:40:02 (Fecha Actual) 2013-03-29 17:40:02 (Fecha en tres años mas)

Aún no pruebo para los meses (MONTH), pero debe ser lo mismo ;)

Muchas gracias
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Parámetro a BD MYSQL

Notapor panterozo » 2010-03-29 16:07 @713

No es solución para MONTH y YEAR, es decir, para pasarlos como variables:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $mes = 'MONTH';
  2. my $year = 'YEAR';
  3. my $unidad = 3;
  4.  
  5. executeQuery(SQL::HASH{YEAR_MONTH},$unidad,$mes);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La solución es la siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
executeQuery(SQL::HASH{YEAR_MONTH},$unidad);
...
YEAR_MONTH => "INSERT INTO Datos (Fecha_futuro) VALUES (DATE_ADD(NOW(), INTERVAL + ? YEAR))",
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero para pasar además de la unidad el atributo mes o año, no funciona :s

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
executeQuery(SQL::HASH{YEAR_MONTH},$unidad,$mes);
...
YEAR_MONTH => "INSERT INTO Datos (Fecha_futuro) VALUES (DATE_ADD(NOW(), INTERVAL + ? +?))",
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


También intenté así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $unidad_mes_año = "3 YEAR";
executeQuery(SQL::HASH{YEAR_MONTH},$unidad_mes_año);
...
YEAR_MONTH => "INSERT INTO Datos (Fecha_futuro) VALUES (DATE_ADD(NOW(), INTERVAL + ?))",
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y nada :s...

Por el momento realizaré dos consultas, una por YEAR y otra para MONTH, es decir:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
executeQuery(SQL::HASH{YEAR},$unidad);
executeQuery(SQL::HASH{MONTH},$unidad);
...
YEAR => "INSERT INTO Datos (Fecha_futuro) VALUES (DATE_ADD(NOW(), INTERVAL + ? YEAR))",
MONTH => "INSERT INTO Datos (Fecha_futuro) VALUES (DATE_ADD(NOW(), INTERVAL + ? MONTH))",
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Alguna otra forma...?

Gracias ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Parámetro a BD MYSQL

Notapor kidd » 2010-03-29 16:15 @719

La razón por cual siempre es recomendable hacer el bind de nuestras variables, es justamente para evitar los ataques por medio de inyección de código dañino a nuestras sentencias de SQL.

En este caso eso no sirve pues el problema es que estás convirtiendo una expresión en una cadena de texto. Vas a tener que poner la variable directamente, pero deberás de cuidar en quitar cualquier posibilidad de inyección de código, por lo que te podría recomendar algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if( $INTERVAL !~ /^(DAY|WEEK|MONTH|YEAR)$/ ){
    die "Intervalo no válido.";
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


De esta manera cuidamos en que la variable $INTERVAL solamente contengan algún valor permitido (DAY, WEEK, MONTH, YEAR). Una vez que la tenemos verificada, entonces la podemos insertar directamente en la sentencia SQL sin riesgos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
INSERT INTO Datos (Fecha_futuro) VALUES (DATE_ADD(NOW(), INTERVAL ? $INTERVAL))
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Parámetro a BD MYSQL

Notapor panterozo » 2010-03-30 07:47 @366

Gracias, kidd, por la solución ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400


Volver a Básico

¿Quién está conectado?

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