¿Cuál es la mejor manera de determinar si una cadena es o no el resultado de la serialize()
función?
fuente
¿Cuál es la mejor manera de determinar si una cadena es o no el resultado de la serialize()
función?
Yo diría, inténtalo unserialize
;-)
Citando el manual:
En caso de que la cadena pasada no sea no serializable, se devuelve FALSE y se emite E_NOTICE.
Por lo tanto, usted tiene que comprobar si el valor de retorno es false
o no (con ===
o !==
, para asegurarse de no tener ningún problema 0
o null
o cualquier cosa que es igual a false
, diría) .
Solo tenga cuidado con el aviso: es posible que desee / necesite usar el operador @ .
Por ejemplo :
$str = 'hjkl';
$data = @unserialize($str);
if ($data !== false) {
echo "ok";
} else {
echo "not ok";
}
Te conseguirá:
not ok
EDITAR: Ah, y como dijo @Peter (¡gracias a él!), Podrías tener problemas si intentas deserializar la representación de un falso booleano :-(
Por lo tanto, verificar que su cadena serializada no sea igual a " b:0;
" también puede ser útil; algo como esto debería hacer el truco, supongo:
$data = @unserialize($str);
if ($str === 'b:0;' || $data !== false) {
echo "ok";
} else {
echo "not ok";
}
probar ese caso especial antes de intentar deserializar sería una optimización, pero probablemente no sea tan útil, si a menudo no tiene un valor serializado falso.
No escribí este código, en realidad es de WordPress. Pensé que lo incluiría para cualquier persona interesada, podría ser excesivo pero funciona :)
fuente
^([adObis]:|N;)
Optimizando la respuesta de Pascal MARTIN
fuente
Si $ string es un
false
valor serializado , es decir , la función de$string = 'b:0;'
SoN9ne regresafalse
, está malentonces la función sería
fuente
In case the passed string is not unserializeable, FALSE is returned and E_NOTICE is issued.
No podemos detectar el error E_NOTICE ya que no es una excepción lanzada.A pesar de la excelente respuesta de Pascal MARTIN, tenía curiosidad por saber si podría abordar esto de otra manera, así que lo hice solo como un ejercicio mental
Y en realidad funciona. La única advertencia es que probablemente se romperá si tiene un controlador de errores registrado debido a cómo funciona $ php_errormsg .
fuente
$a
y la deserialización$b
, que no es un diseño de aplicación práctico.Maneja correctamente el caso de
serialize(false)
. :)fuente
construir en una función
fuente
a:
(ob:
etc.) está presente en algún lugar dentro de $ value, no al principio. Y^
aquí no significa el comienzo de una cadena. Es totalmente engañoso.Hay una solución de WordPress: (el detalle está aquí)
fuente
fuente
Esto funciona bien para mi
fuente
Prefiero hacerlo de esa manera:
fuente