Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何:如果序列化了$data,则取消序列化($data)?_Php_Serialization - Fatal编程技术网

Php 如何:如果序列化了$data,则取消序列化($data)?

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)检索数据

我的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)检索数据时
$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;
}