La base de datos mySQL cambia cuando abro un campo en phpmyadmin, pero no realizo ningún cambio

5 minutos de lectura

avatar de usuario
Nodo TX

Tengo un sitio de wordpress y una plantilla con datos de demostración instalados. Cuando abro algunos campos en phpmyadmin, incluso si no hago cambios y selecciono algún otro campo, se actualiza el campo. No hay problema, no actualiza nada, porque no hice cambios. Lo que sucede entonces es que el front-end del sitio de wordpress se vuelve loco, porque ALGO cambió en el campo que simplemente estaba examinando. El campo en cuestión tiene una gran cantidad de código HTML y bastantes ; y “personajes en él…

Creo que cuando abro el campo y lo cierro, el comando de actualización analiza lo que hay en el campo y ve el ; y ” por todas partes… Podría estar equivocado. De todos modos, cuando miro los datos y los copio, ya sea mediante una consulta de shell mysql o mediante phpmyadmin, y los actualizo EXACTAMENTE en la base de datos como estaba antes, ALGO está cambiando , pero incluso usando un complemento de comparación de notepad ++ y mirando los datos de todas las formas posibles, no hay cambios en él …

¿Tiene esto algún sentido? ¡Me está volviendo loco!

Este es un sitio de wordpress que utiliza un tema de cohetes, con el marco de pórtico en caso de que alguien esté familiarizado…

Aquí hay un video de demostración de este problema.

https://www.youtube.com/watch?v=ljXTDKKmUUw

Ok, la respuesta parece ser que si los datos se almacenan serializados en una matriz dentro de un campo, primero se deben deserializar con php para leerlos y serializarlos nuevamente con php para escribirlos.

Aparentemente, este es un problema común con wordpress y causa mucha frustración cuando las personas intentan realizar migraciones de bases de datos que cambian la longitud de las URL.

Aprendí mucho más sobre este problema aquí:
http://wpgarage.com/tips/data-portability-and-data-serialization-in-wordpress/

  • Si el ; y " en el campo estaban lanzando phpmyadmin, uno pensaría que habría más de unas pocas personas quejándose de eso…

    – Marc B.

    2 de diciembre de 2013 a las 14:48

  • ¿Está utilizando algún carácter especial? Tal vez la codificación se estropee.

    – Peón

    2 de diciembre de 2013 a las 14:49

  • ¿Qué sucede específicamente con la parte delantera?

    – Jim

    2 de diciembre de 2013 a las 14:52

  • Aquí hay una demostración en video narrada de todo este problema que acabo de filmar para esta publicación. Estoy desconcertado por qué sucede esto, pero espero cubrir todos los ángulos para descubrir por qué. youtu.be/ljXTDKKmUUw

    – Nodo TX

    2 de diciembre de 2013 a las 23:57


  • El código que está viendo en el campo son datos serializados, y lo más probable es que sea una matriz u objeto que se serializa y almacena como un valor de cadena.

    – artesano

    3 de diciembre de 2013 a las 1:34

avatar de usuario
wp78de

La cuestión es que las entradas de la base de datos en cuestión no solo contienen “texto con un montón de dos puntos”, esto es PHP serializado datos. Cierto, es texto, pero debe considerarse como una especie de binario. Cuando realiza cambios arbitrarios en los datos serializados, por ejemplo, cambiar una palabra a una palabra más larga o más corta, rompe la estructura de datos. Cuando el código asociado intenta deserializar los datos posteriormente, falla. Moraleja: no edite datos serializados sin cuidado, o romperá cosas.

Citando del PHP documentación: las cadenas serializadas ni siquiera deben almacenarse en campos de TEXTO.

Tenga en cuenta que esta es una cadena binaria que puede incluir bytes nulos y debe almacenarse y manejarse como tal. Por ejemplo, la salida de serialize() generalmente debe almacenarse en un campo BLOB en una base de datos, en lugar de un campo CHAR o TEXT.

De todos modos, hay formas de editar datos serializados de PHP si cumple con las reglas de los valores serializados o ajusta la información estructural correspondiente. Incluso hay algunos especializados. editores o en línea instrumentos para esto (no los he probado).
Para obtener más información sobre la estructura de los datos serializados, consulte el comentario superior de egingell en el enlace documentación de la función en php.net, que describe la anatomía de un valor serializado():

Cadena -> s:tamaño:valor;

Entero -> i:valor;

Booleano -> b:valor; (no almacena “verdadero” o “falso”, almacena ‘1’ o ‘0’)

Nulo -> N;

Matriz -> a:tamaño:{definición de clave;definición de valor;(repetido por elemento)}

Objeto -> O:strlen(nombre del objeto):nombre del objeto:tamaño del objeto:{s:strlen(nombre de la propiedad):nombre de la propiedad:definición de la propiedad;(repetido por propiedad)}

Los valores de cadena siempre están entre comillas dobles
Las claves de matriz son siempre números enteros o cadenas
“null => ‘valor'” equivale a ‘s:0:””;s:5:”valor”;’,
“verdadero => ‘valor'” equivale a ‘i:1;s:5:”valor”;’,
“falso => ​​’valor'” equivale a ‘i:0;s:5:”valor”;’,
“matriz (cualquiera que sea el contenido) => ‘valor'” equivale a una advertencia de “tipo de desplazamiento ilegal” porque no puede usar una matriz como clave;
sin embargo, si usa una variable que contiene una matriz como clave, equivaldrá a ‘s:5:”Array”;s:5:”value”;’, e intentar usar un objeto como clave resultará en la mismo comportamiento que usar una matriz.

Por el aspecto del video, parece que estás usando una versión PMA bastante antigua. Comenzaría actualizando PMA, PHP y MySQL para ver si había algún problema con esa versión específica.

¿Ha sido útil esta solución?