条件PHP反序列化函数

时间:2016-07-13 19:58:24

标签: php serialization deserialization

首先,如果这似乎是一个愚蠢的问题,我很抱歉。我是这个“unserialize”命令的新手,我一直在阅读有关它的大量信息,但我仍然不知道如何实现它以获得我需要的东西。

让我解释一下我现在拥有什么,以及我需要什么。

我现在有了这个代码:

$consultametacat = $wpdb->get_row("
    SELECT post_id,
           meta_key,
           meta_value
      FROM cg_postmeta
     WHERE post_id = '".$consultapost->ID."' 
       AND meta_key LIKE '_category_permalink'
    ",
    ARRAY_A
);

这会将该查询的结果保存到ARRAY_A

中的数据库中

然后我在其他行上得到这个值:

$category_color = get_tax_meta($consultametacat['meta_value'],'pm_color_field_id');
$category_name = get_term_by('id', $consultametacat['meta_value'], 'category',ARRAY_A);
$category_name = get_term_by('id', $consultametacat['meta_value'], 'category',ARRAY_A);
$category_link=get_category_link($consultametacat['meta_value']);

到目前为止它运作良好,因为meta_value是一个整数,直到两周前。现在,数据库中“_category_permalink”字段中的旧条目具有整数,但新条目具有如下序列化数据:

a:1:{s:8:"category";s:2:"23";}

所以,我需要做的是根据条件设置条件并反序列化,以便始终获得整数。逻辑将是这样的:

- 如果

的结果
$consultametacat = $wpdb->get_row("
     SELECT post_id,
            meta_key,
            meta_value
       FROM cg_postmeta
      WHERE post_id = '".$consultapost->ID."'
        AND meta_key
       LIKE '_category_permalink'
     ",
     ARRAY_A
);

是整数,然后正常保存该值。但如果它产生一个序列化的行,那么反序列化,得到数值(在我的例子中,23行从a:1:{s:8:“category”; s:2:“23”;})和保存该数值。

如何实现这一目标?

非常感谢您提前提供的所有帮助。

1 个答案:

答案 0 :(得分:0)

你必须首先检测你的结果被序列化然后处理,如果没有更多的事情要做:

if(strpos($consultametacat,':{')!==false){
  $consultametacat = unserialize($consultametacat);
  $consultametacat = array_shift($consultametacat);//or = $consultametacat['category'];
}

strpos():{中检测到$consultametacat并返回其位置,每个序列化数据都包含此部分。但serialize()也可以序列化对象和其他类型,因此可以自己研究一下这个主题。