Solución:
Probé su ejemplo en mi sistema y, después de la serialización, se devuelve el siguiente valor:
string(42) "a:1:{i:0;s:24:"a:4:{i:1;s:7:"fdsfdsf";i";}"
Esto es lo que se agregará a la base de datos. Sin embargo, se desaconseja almacenar la entrada del usuario sin formato en la base de datos. Primero debe formatear la entrada de usuario simple con mysql_real_escape_string()
ya que escapará de los personajes críticos.
Aparte de eso, si unserialize()
se llama en el texto serializado leído desde la base de datos, la matriz se devuelve correctamente. Debería ser seguro, pero puede producir resultados inesperados.
Ten mucho cuidado con el almacenamiento de matrices serializadas en una base de datos. La serialización devuelve una cadena, por lo que el campo en el que almacena los datos suele ser VARCHAR
o TEXT
. Si simplemente Sobrescribir la matriz almacenada con una nueva, los datos antiguos se perderán por completo. Para actualizar la base de datos, asegúrese de leer primero los datos de la base de datos en una matriz y actualizarlos, y solo luego volver a escribirlos en la base de datos.
Si bien no está prohibido, usar y almacenar material serializado en la base de datos generalmente crea muchos problemas. La base de datos tiene muchos tipos de datos conocidos por defecto, y las grandes matrices serializadas crean una sobrecarga y complican la ejecución, y es simplemente un dolor de cabeza si el sistema necesita ser modificado más tarde. Y no puede utilizar consultas de relación en campos serializados.
El viejo camino
Cuando sigues usando mysql_
podría escribir consultas como esta:
$sql = sprintf("INSERT INTO mytable (a) VALUES ('%s')",
mysql_real_escape_string(serialize($myvar))
);
mysql_query($sql) or die("oh no!");
La forma recomendada
Para PDO
y mysqli
tiene la opción de usar declaraciones preparadas, lo que es muy recomendable exactamente con el propósito de prevenir los vectores de ataque de inyección SQL. Un ejemplo en DOP:
$stmt = $db->prepare('INSERT INTO mytable (a) VALUES (:myvar)');
$stmt->execute(array(
':myvar' => serialize($myvar),
));
Longitudes de campo
Además, asegúrese de que la longitud de sus datos serializados no exceda el tamaño de la columna del campo de la tabla; una variable serializada truncada es bastante inútil.