Php 如何:如果序列化了$data,则取消序列化($data)?
我的MySQL数据库中的一些数据是以序列化格式存储的,例如,Php 如何:如果序列化了$data,则取消序列化($data)?,php,serialization,Php,Serialization,我的MySQL数据库中的一些数据是以序列化格式存储的,例如,a:1:{s:3:url;s:70:http://www.myurl.com/wp-content/uploads/2014/01/Crash_Test_Dummy-1.jpg“;} 同一类型字段中的其他数据未序列化存储,例如http://www.myurl.com/wp-content/uploads/2014/01/Crash_Test_Dummy-1.jpg 现在,当我尝试使用$var=unserialize($data)检索数据
a:1:{s:3:url;s:70:http://www.myurl.com/wp-content/uploads/2014/01/Crash_Test_Dummy-1.jpg“;}
同一类型字段中的其他数据未序列化存储,例如http://www.myurl.com/wp-content/uploads/2014/01/Crash_Test_Dummy-1.jpg
现在,当我尝试使用$var=unserialize($data)检索数据时
当$data
为上述未序列化的字符串时,我得到一个错误注意:未序列化():偏移量0处的错误,共69个字节…
有没有一种快速的方法可以序列化数据库中所有未序列化的字段?或者,是否有一种方法可以告诉服务器,如果$data被序列化,则取消序列化($data)
谢谢大家! WordPress在数据库上存储信息时喜欢把事情复杂化一点 如果您是在WP内部开发代码,只需使用
或者\u unserialize
否则,您可以复制该函数表单wp includes/functions.php
/**
* Unserialize value only if it was serialized.
*
* @since 2.0.0
*
* @param string $original Maybe unserialized original, if is needed.
* @return mixed Unserialized data can be any type.
*/
function maybe_unserialize( $original ) {
if ( is_serialized( $original ) ) // don't attempt to unserialize data that wasn't serialized going in
return @unserialize( $original );
return $original;
}
/**
* Check value to find if it was serialized.
*
* If $data is not an string, then returned value will always be false.
* Serialized data is always a string.
*
* @since 2.0.5
*
* @param mixed $data Value to check to see if was serialized.
* @param bool $strict Optional. Whether to be strict about the end of the string. Defaults true.
* @return bool False if not serialized and true if it was.
*/
function is_serialized( $data, $strict = true ) {
// if it isn't a string, it isn't serialized
if ( ! is_string( $data ) )
return false;
$data = trim( $data );
if ( 'N;' == $data )
return true;
$length = strlen( $data );
if ( $length < 4 )
return false;
if ( ':' !== $data[1] )
return false;
if ( $strict ) {
$lastc = $data[ $length - 1 ];
if ( ';' !== $lastc && '}' !== $lastc )
return false;
} else {
$semicolon = strpos( $data, ';' );
$brace = strpos( $data, '}' );
// Either ; or } must exist.
if ( false === $semicolon && false === $brace )
return false;
// But neither must be in the first X characters.
if ( false !== $semicolon && $semicolon < 3 )
return false;
if ( false !== $brace && $brace < 4 )
return false;
}
$token = $data[0];
switch ( $token ) {
case 's' :
if ( $strict ) {
if ( '"' !== $data[ $length - 2 ] )
return false;
} elseif ( false === strpos( $data, '"' ) ) {
return false;
}
// or else fall through
case 'a' :
case 'O' :
return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data );
case 'b' :
case 'i' :
case 'd' :
$end = $strict ? '$' : '';
return (bool) preg_match( "/^{$token}:[0-9.E-]+;$end/", $data );
}
return false;
}
/**
*仅当值已序列化时才取消序列化。
*
*@自2.0.0以来
*
*@param string$original如果需要,可能是未序列化的original。
*@return未序列化的混合数据可以是任何类型。
*/
函数可能未序列化($original){
if(is_serialized($original))//不要尝试取消序列化未序列化的数据
返回@unserialize($original);
退回$original;
}
/**
*检查值以查找它是否已序列化。
*
*如果$data不是字符串,则返回的值将始终为false。
*序列化数据始终是字符串。
*
*@自2.0.5
*
*@param mixed$数据值以检查是否已序列化。
*@param bool$严格可选。是否对字符串的结尾要求严格。默认值为true。
*@return bool如果未序列化则为False,如果已序列化则为true。
*/
函数已序列化($data,$strict=true){
//如果它不是字符串,则不会序列化
如果(!是字符串($data))
返回false;
$data=修剪($data);
如果('N;'=$data)
返回true;
$length=strlen($data);
如果($length<4)
返回false;
如果(“:”!==$data[1])
返回false;
如果($严格){
$lastc=$data[$length-1];
如果(“;”!=$lastc&&“}”!=$lastc)
返回false;
}否则{
$semicolon=strpos($data,“;”);
$brace=strpos($data,'}');
//要么;或}必须存在。
if(false==$分号&&false==$brace)
返回false;
//但两者都不必在前X个字符中。
if(false!=$分号&&$分号<3)
返回false;
if(false!=$brace&&$brace<4)
返回false;
}
$token=$data[0];
交换机($token){
案例s:
如果($严格){
如果(““!==$data[$length-2])
返回false;
}elseif(false==strpos($data,“')){
返回false;
}
//否则就会失败
案例“a”:
案例“O”:
return(bool)preg_match(“/^{$token}:[0-9]+:/s”,$data);
案例“b”:
案例“i”:
案例“d”:
$end=$strict?“$”:“”;
return(bool)preg_match(“/^{$token}:[0-9.E-]+;$end/”,$data);
}
返回false;
}