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

Problema con datos en BD

Estas en el tema de Problema con datos en BD en el foro de Mysql en Foros del Web. Hola amigos del foro, el problema que tengo es el siguiente: Hace ya algunos meses, hice una aplicación web para registrar fichas que contienen datos ...
  #1 (permalink)  
Antiguo 29/09/2013, 21:25
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Problema con datos en BD

Hola amigos del foro, el problema que tengo es el siguiente:

Hace ya algunos meses, hice una aplicación web para registrar fichas que contienen datos de personas que han realizado denuncias en una institución local, dicho sistema lo desarrollé con PHP, HTML5, CSS3 y la librería jQuery de JavaScript, mientras que para la BD utilicé el gestor MySQL. Todo marchaba con normalidad hasta hace unos días, cuando los digitadores de dicha institución me reportaron que varios de los nombres que asignaron a las fichas, se habían recortado. Por ejemplo, si habían guardado una ficha con el nombre "María Hurtado Vega", el nombre se acortó a "Mar", el mismo caso sucede con nombres y apellidos que tienen otra vocal tildada o una letra Ñ, lo curioso es que no todos los nombres que llevan vocales tildadas o letras Ñ tienen este problema, sin embargo, son alrededor de 140 fichas que presentan el problema que les explico.

No tengo clara la causa de este inconveniente, el campo "nombre" en la BD tiene cotejamiento utf8_unicode_ci, por lo que -supongo- no deben haber problemas con vocales tildadas ni la Ñ. ¿Qué puede haber pasado?

Aprovechando la ocasión, quisiera saber porqué los datos con vocales tildadas y letras Ñ (los que no se acortaron), se ven con un símbolo de interrogación ? en el lugar en donde debe de estar ese caracter especial, los documentos tienen por charset "utf-8" e incluso intenté (con PHP) mostrar esos caracteres haciendo uso de la función utf8_encode(), pero se muestran caracteres extraños en su lugar; ese es otro detalle curioso pues al inicio, dichos caracteres (las vocales tildadas y las Ñ) se mostraban, pero dejaron de hacerlo desde hace unas semanas y en su lugar aparece el signo de interrogación en un fondo negro. Cabe acotar que este problema (el de los caracteres, no el del acortamiento de los nombres), se presentó desde que implementé Ajax, antes los formularios se guardaban mediante la manera tradicional, pero implementé la función Ajax de jQuery para que la carga se aligere y no se recargue la página.

Les agradezco su deferencia de antemano, saludos.

Última edición por Alexis88; 29/09/2013 a las 22:21
  #2 (permalink)  
Antiguo 30/09/2013, 03:23
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con datos en BD

Regla básica de desarrollo de aplicaciones con bases de datos: Si los nombres acentuados se almacenan bien al insertarlos manualmente, entonces el problema no está en la base.
Está en alguna parte de la interfaz de usuario que envía el INSERT a la base.

Te hago notar una cosa:
Cita:
Todo marchaba con normalidad hasta hace unos días, cuando los digitadores de dicha institución me reportaron que varios de los nombres que asignaron a las fichas, se habían recortado.
Cita:
Cabe acotar que este problema (el de los caracteres, no el del acortamiento de los nombres), se presentó desde que implementé Ajax
Como conclusión lógica es que en alguna parte de la codificación Ajax, se está manejando esas cadenas de texto con una codifiación incorrecta. Con sólo que en una etapa no se esté controlando la codificación, alcanza.
Revisa todo el código nuevo en cada etapa.
El problema está alli.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 30/09/2013, 11:45
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con datos en BD

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Regla básica de desarrollo de aplicaciones con bases de datos: Si los nombres acentuados se almacenan bien al insertarlos manualmente, entonces el problema no está en la base.
Está en alguna parte de la interfaz de usuario que envía el INSERT a la base.

Te hago notar una cosa:

Como conclusión lógica es que en alguna parte de la codificación Ajax, se está manejando esas cadenas de texto con una codifiación incorrecta. Con sólo que en una etapa no se esté controlando la codificación, alcanza.
Revisa todo el código nuevo en cada etapa.
El problema está alli.
A ver, no estoy seguro de que el error se encuentre en donde dices por lo siguiente: En la función Ajax, serializo los campos del formulario, la cual (la función Ajax) los envía a otro archivo el cual, mediante el uso de una clase, lo guarda en la BD, algo similar a esto:
Código Javascript:
Ver original
  1. function guardar(formulario, destino){
  2.     $.ajax({
  3.         type: "POST",
  4.         url: destino,
  5.         dataType: "HTML",
  6.         data: $("#"+formulario).serialize(),
  7.         beforeSend: function(){
  8.           $("#cargando").show();
  9.         },
  10.         success: function(response){
  11.             $("#principal").html($(response).fadeIn(1000));
  12.             $("#cargando").hide();
  13.         }
  14.     });
  15. }
Código PHP:
Ver original
  1. $cls_ficha_test = new Cls_Ficha_Test();
  2.  
  3. if($_POST){
  4.     $cls_ficha_test->nombre = $_POST['nombre'];
  5.     $cls_ficha_test->genero = $_POST['genero'];
  6.     $cls_ficha_test->instruccion = $_POST['instruccion'];
  7.     $cls_ficha_test->ocupacion = $_POST['ocupacion'];
  8.     $cls_ficha_test->direccion = $_POST['direccion'];
  9.    
  10.     if($cls_ficha_test->AnadirFicha())
  11.         echo "Datos guardados";
  12.     else
  13.         echo "Error al guardar los datos";
  14. }

El código está un poco recortado pues abarca más líneas de código, pero esto es esencialmente lo que realiza el proceso de guardado de datos en la BD.

En la clase, los guardo en la BD como normalmente se realiza mediante un simple INSERT, aunque ahora, en otras aplicaciones, valido los datos recibidos con el uso de expresiones regulares y los guardo con procedimientos almacenados, pero bueno, eso no viene al caso ahora.

Otro detalle que vuelvo a recalcar es que estos datos se visualizaban completos hasta hace no menos de un par de semanas, luego es que ocurrió el acortamiento de algunos de estos datos, además, el uso de Ajax lo implementé HACE MÁS DE 2 MESES, es por eso que no encuentro coherencia en estos hechos pues si fuera por implementar Ajax, el problema se hubiera suscitado hace más de 2 meses y no desde hace poco.

Y solo por si a caso, los datos que se han recortado, fueron guardados hace ya más de 1 mes (otros desde que empezó a usarse el sistema con Ajax).
  #4 (permalink)  
Antiguo 30/09/2013, 11:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con datos en BD

Dos cosas: Las normas del foro dicen específicamente que no se postea código de programación ni se tratan temas de programación en los foros de BBDD. Si quieres analizarlo desde esa óptica, deberé mover tu post al Foro de Ajax, donde probablemente tenas mejores respuestas.
En segundo término, y por tu descripción, yo sigo pensando en que el problema está en otra parte fuera de la base, en esencia porque ese tipo de cambios no suelen producirse en esa etapa, y menos aún si se hacen los INSERT por stored procedures. Menos que menos.
SI ese es el método usado para almacenar, entonces los datos ya están llegando mal al momento de invocar el SP. Eso es seguro. Por tanto se está produciendo el problema en algún punto previo... y eso no es SQL.

Insisto en que tienes que verifcar paso a paso. Si quieres mejores guías, paso el POST a AJAX.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 30/09/2013, 13:27
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con datos en BD

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Dos cosas: Las normas del foro dicen específicamente que no se postea código de programación ni se tratan temas de programación en los foros de BBDD. Si quieres analizarlo desde esa óptica, deberé mover tu post al Foro de Ajax, donde probablemente tenas mejores respuestas.
En segundo término, y por tu descripción, yo sigo pensando en que el problema está en otra parte fuera de la base, en esencia porque ese tipo de cambios no suelen producirse en esa etapa, y menos aún si se hacen los INSERT por stored procedures. Menos que menos.
SI ese es el método usado para almacenar, entonces los datos ya están llegando mal al momento de invocar el SP. Eso es seguro. Por tanto se está produciendo el problema en algún punto previo... y eso no es SQL.

Insisto en que tienes que verifcar paso a paso. Si quieres mejores guías, paso el POST a AJAX.
Disculpa si infringí las normas del foro, sucede que he visto tantos temas en donde publican el código, por lo que asumí que es algo normal, además de que quería aclararte con pruebas que no hay error alguno en el código.

Creo que no leíste bien lo que escribí en mi respuesta, los SP los estoy usando EN OTRAS APLICACIONES, no en esta, por eso es que al final del párrafo dije que era algo que no venía al caso. Una vez más lo recalco, este problema se suscitó desde hace poco menos de 2 semanas, el trabajo con Ajax lo implementé HACE MÁS DE 2 MESES, por lo que no hay coherencia en los sucesos recientes y el módulo que procesa los datos. Es más, actualmente se vienen guardando los datos del mismo modo y no tienen inconvenientes, son solo ALGUNOS registros los que misteriosamente se han visto afectados, que por cierto, algunos son recientes y muchos otros son antiguos.

He verificado y probado todos los módulos paso a paso, con toda la paciencia del mundo pues dispongo de tiempo libre y el resultado es el esperado: ingreso datos en el formulario, los guardo y al momento de visualizarlos, están exactamente como los ingresé, como te digo por enésima vez, el problema del recortamiento de datos, específicamente del nombre porque los otros datos siguen intactos, se presentó sólo en algunos registros. Yo relaciono esto al uso de vocales tildadas y letras Ñ, pues los nombres se acortan justo cuando debe de aparecer uno de estos caracteres, sin embargo, hay muchos otros registros en la BD con vocales tildadas y letras Ñ que siguen intactas, es por eso que no encuentro una explicación lógica a lo sucedido.
  #6 (permalink)  
Antiguo 30/09/2013, 13:29
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con datos en BD

Vuelvo a publicar esta respuesta pues me faltó añadir información y no puedo editar la anterior:

Cita:
Iniciado por Alexis88 Ver Mensaje
Disculpa si infringí las normas del foro, sucede que he visto tantos temas en donde publican el código, por lo que asumí que es algo normal, además de que quería aclararte con pruebas que no hay error alguno en el código.

Creo que no leíste bien lo que escribí en mi respuesta, los SP los estoy usando EN OTRAS APLICACIONES, no en esta, por eso es que al final del párrafo dije que era algo que no venía al caso, en esta aplicación uso simples y sencillas sentencias INSERT INTO tabla (campos) VALUES (valores). Una vez más lo recalco, este problema se suscitó desde hace poco menos de 2 semanas, el trabajo con Ajax lo implementé HACE MÁS DE 2 MESES, por lo que no hay relación lógica entre los sucesos recientes y el módulo que procesa los datos. Es más, actualmente se vienen guardando los datos del mismo modo y no tienen inconvenientes, son solo ALGUNOS registros los que misteriosamente se han visto afectados, que por cierto, algunos son recientes y muchos otros son antiguos.

He verificado y probado todos los módulos paso a paso, con toda la paciencia del mundo pues dispongo de tiempo libre y el resultado es el esperado: ingreso datos en el formulario, los guardo y al momento de visualizarlos, están exactamente como los ingresé, como te digo por enésima vez, el problema del recortamiento de datos, específicamente del nombre porque los otros datos siguen intactos, se presentó sólo en algunos registros. Yo relaciono esto al uso de vocales tildadas y letras Ñ, pues los nombres se acortan justo cuando debe de aparecer uno de estos caracteres, sin embargo, hay muchos otros registros en la BD con vocales tildadas y letras Ñ que siguen intactas, es por eso que no encuentro una explicación lógica a lo sucedido.
  #7 (permalink)  
Antiguo 30/09/2013, 14:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Problema con datos en BD

Algunas preguntas importantes:
- ¿Se realizó algún cambio de configuración al servidor donde se encuentra la base de datos, en los días previos a cuando comenzaran los problemas?
- ¿Las query se usan por parametrización, o se construyen como cadenas de texto?
- Según informas, realizaste un debuggeo detallado. ¿Qué obtuviste en el paso previo a enviar la query a ejecutar, en cuanto a datos que iban a viajar con esa llamada?
- ¿Se realizaron verificaciones insertando y verificando los datos manualmente a la base en cuestión? ¿Qué resultados se pudieron apreciar?
- ¿Realizaste pruebas con un escenario idéntico, es decir, con iguales nombres de personas con y sin acentos, y con y sin eñes?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 30/09/2013, 15:28
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Problema con datos en BD

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Algunas preguntas importantes:
- ¿Se realizó algún cambio de configuración al servidor donde se encuentra la base de datos, en los días previos a cuando comenzaran los problemas?
- ¿Las query se usan por parametrización, o se construyen como cadenas de texto?
- Según informas, realizaste un debuggeo detallado. ¿Qué obtuviste en el paso previo a enviar la query a ejecutar, en cuanto a datos que iban a viajar con esa llamada?
- ¿Se realizaron verificaciones insertando y verificando los datos manualmente a la base en cuestión? ¿Qué resultados se pudieron apreciar?
- ¿Realizaste pruebas con un escenario idéntico, es decir, con iguales nombres de personas con y sin acentos, y con y sin eñes?
Buenas preguntas, aquí van mis respuestas:

- ¿Se realizó algún cambio de configuración al servidor donde se encuentra la base de datos, en los días previos a cuando comenzaran los problemas?

Rpta.: No trabajo en dicha oficina, estoy haciendo outsourcing, pero tengo entendido que llevaron la computadora que usan de servidor (no dedicado) a la oficina central de la organización para la cual trabajan, esto fue para actualizar el antivirus que usan pues no cuentan con una conexión a internet. Esto último se debió a que muchas personas en esa oficina, colocan sus dispositivos USB en esa estación de trabajo para entregar archivos de texto y aparentemente, el ordenador sufrió una infección a consecuencia de esto. Les he sugerido muchas veces que creen una red de trabajo, pero parece ser que por temas burocráticos, no se ha concretado. En un momento llegué a imaginar que se puedan haber dañado archivos del sistema por una infección, incluyendo a los archivos de la BD, pero eso no pasa de ser una especulación.


- ¿Las query se usan por parametrización, o se construyen como cadenas de texto?

Rpta.: No, no he parametrizado las query, se que es una forma segura de trabajar, pero cuando hice ese módulo (el del guardado de datos en la BD), no conocía sobre eso; debo confesar que en ese entonces, me confié por las validaciones que hice del lado del cliente, ahora se realizar validaciones del lado del servidor, pero he estado ocupado con otros proyectos y no me ha alcanzado el tiempo para actualizarlo, además de que me confié porque antes de dejar de prestarle atención a este proyecto, lo dejé funcionando sin problemas. Las construyo como cadenas de texto de la forma INSERT INTO tabla (campos) VALUES (valores).


- Según informas, realizaste un debuggeo detallado. ¿Qué obtuviste en el paso previo a enviar la query a ejecutar, en cuanto a datos que iban a viajar con esa llamada?

Rpta.: Antes de ejecutar el query, lo deshabilito e imprimo la cadena con la función var_dump() (aunque también lo he hecho directamente con echo), la cual solamente corroboraba que los datos eran correctos. Por otro lado, ya que uso la función Ajax de jQuery, me fijé con el debugger de Chrome y Firebug de Firefox cuál era la data serializada que se transfería en cada petición asíncrona, con lo que obtenía, nuevamente, el resultado esperado, por ejemplo: data: nombre=Juan Sánchez Vega&edad=28&ocupacion=Abogado

No se si hayan otras formas de verificar los datos, ya intenté con mensajes de alerta de JavaScript, impresiones de datos con PHP, inserción directa en la BD con código Transact-SQL y el resultado siempre es el esperado, por eso me desconcierta este problema. Si conoces otras formas, te agradeceré mucho que las menciones, siempre es bueno aprender algo nuevo cada día.


- ¿Se realizaron verificaciones insertando y verificando los datos manualmente a la base en cuestión? ¿Qué resultados se pudieron apreciar?

Rpta.: Como te contesté en el último párrafo del punto anterior, realicé inserciones de manera directa (manual) a la BD con phpMyadmin y dichas inserciones siempre fueron exitosas.


- ¿Realizaste pruebas con un escenario idéntico, es decir, con iguales nombres de personas con y sin acentos, y con y sin eñes?

Rpta.: Así es, por el mismo hecho de que hay nombres que llevan vocales tildadas y/o letras Ñ y otros no, hice varias pruebas con distintos nombres antes de poner en marcha la aplicación, incluso hace poco que fui a la oficina para ver ese problema, yo mismo ingresé los datos de un formulario real (de los que ellos usan), con un nombre que tuviera estos caracteres y la inserción de datos fue exitosa, la verifiqué tanto en la BD como en el listado de datos y módulo de edición de la aplicación y todo estaba bien.

Como te dije, el problema es sólo con algunos datos, por ejemplo (datos aproximados), de las más de 5000 fichas ingresadas, 850 tienen nombres con vocales tildadas y/o letras Ñ y de esas 850, hay 200 con el problema del acortamiento del nombre (únicamente del nombre, pues el campo "domicilio" también lleva vocales tildadas y no se presentaron problemas) y todo esto se presentó hace poco tiempo, no menos de 2 semanas, mientras que la implementación de Ajax tiene ya más de 2 meses. Lo curioso es que los datos que tienen este problema fueron ingresados en diversas fechas y no son consecutivos, por ejemplo, hay catorce que fue digitados en Junio, mientras que hay trentaiocho del mes de Julio pero en distintos días, otros veinticuatro de Agosto y así sucesivamente.

Dudo mucho que hayan realizado a propósito estos cambios de manera manual pues serían los propios digitadores los que perderían ya que son ellos los que tendrán que corregirlos.

Ahora, la pregunta del millón es: ¿Qué pudo haber sucedido?

Última edición por Alexis88; 01/10/2013 a las 01:15

Etiquetas: jquery, php
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 03:08.