无法访问序列化数据

时间:2015-11-20 15:35:02

标签: php mysql wordpress

我必须在这里遗漏一些非常简单的东西,但我无法弄明白。我需要访问存储在数据库中的序列化数据。 在数据库中,存储的值是

a:2:{s:8:"last_tab";s:1:"1";s:11:"footer_text";s:13:"Default Text2";} 

我需要获取'Default Text2'。

在我的本地环境中,我回应

get_option( 'tt_options' )['footer_text'] 

并获得了我需要的价值。

问题出现在我的暂存环境中。在那里,当我输入

get_option( 'tt_options' )['footer_text'] 

页面崩溃,但

get_option( 'tt_options' )

工作正常。

我能想到的本地和临时环境之间的唯一区别是数据库中的表使用不同的引擎:

暂存环境: 引擎:MyISAM

当地环境: 引擎:InnoDB

顺便说一句,如果有帮助的话,我正在使用WordPress。

无论如何,我试图通过以下几种方式访问​​该值。已注释的行仅在我的暂存环境中导致问题。我发现有趣的是,当我尝试从未存储在数据库中的序列化数据中访问值时,但是在变量中(参见下文:

echo ($returnValue['footer_text']);

),我得到了我需要的价值。有没有人知道导致问题的原因是为了指出我正确的方向?提前感谢您的时间和指导。

$returnValue = unserialize('a:2:{s:8:"last_tab";s:1:"1";s:11:"footer_text";s:13:"Default Text2";}');

echo '0:: ';
print_r($returnValue);
echo "<hr>";

echo '1:: ';
echo ($returnValue['footer_text']);
echo "<hr>";

echo '2:: ';
//echo get_option( 'tt_options' )['footer_text'];
echo "<hr>";

echo '3:: ';
var_dump(get_option( 'tt_options' ));
echo "<hr>";

echo '4:: ';
//var_dump(get_option( 'tt_options' )['footer_text']);
echo "<hr>";  

echo '5:: ';
echo get_option( 'tt_options' );
echo "<hr>";

echo '6:: ';
print_r(get_option( 'tt_options' ));
echo "<hr>";

echo '7:: ';
foreach(get_option( 'tt_options' ) as $key => $value) {
    echo $key.' : ';
    echo $value."<br>";
}

我从前面的代码中得到的结果如下所示:

0:: Array ( [last_tab] => 1 [footer_text] => Default Text2 )
1:: Default Text2
2:: Default Text2
3::
array (size=2)
  'last_tab' => string '1' (length=1)
  'footer_text' => string 'Default Text2' (length=13)
4::
string 'Default Text2' (length=13)
5:: Array
6:: Array ( [last_tab] => 1 [footer_text] => Default Text2 )
7:: last_tab : 1
footer_text : Default Text2

修订版1:

是的@Kenney我正在运行不同版本的php。谢谢你指出来。我不知道你刚才提到的旧版PHP语法。 版本是:

当地环境:5.5.12

登台环境:5.3.29

那么,在我的情况下,如果我无法控制安装的php版本,访问该值的唯一方法是使用foreach语句?

关于collat​​ion和charset,我在数据库中运行以下查询

SHOW CREATE TABLE  `wp_options`

并进入两种环境:

DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

我还检查了我的wp-config.php文件,我发现的是:

登台环境:

define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', '');

当地环境:

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

修订版2:

非常感谢@Kenney!那很有帮助!确实存在语法错误:

Parse error:  syntax error, unexpected '[', expecting ',' or ';' in footer.php on line 66

由于您之前声明的原因而产生。

总结帮助另一个可能最终在这个线程的人,使用

echo get_option( 'tt_options' )['footer_text'];

使用较旧的PHP版本5.4.0可能无效,但

$temp = get_option( 'tt_options' );
echo $temp['footer_text'];

确实

  

从PHP 5.4开始,您还可以使用替换的短数组语法   array()with []。

参考: http://php.net/manual/en/language.types.array.php

1 个答案:

答案 0 :(得分:0)

正如@ miken32所提到的那样,让我回答问题而不是编辑它,以防止问题显示为无人接听。

问题是我的暂存环境中的PHP版本。它低于5.4.0版本,因此它不支持短数组语法。

总结帮助另一个可能最终在这个线程的人,使用

Main.Balance++;

使用较旧的PHP版本5.4.0可能无效,但

echo get_option( 'tt_options' )['footer_text'];

一样。诀窍是在访问所需值之前使用临时变量。

  

从PHP 5.4开始,您还可以使用替换的短数组语法   array()with []。

参考: http://php.net/manual/en/language.types.array.php