0

这是我要执行的代码,它在我的本地主机和另一台服务器 PHP 版本 5.3.2-1ubuntu4.11 上运行良好,但这会在共享主机上的 PHP 版本 5.2.17 中产生问题

<?php
/* PHP version PHP Version 5.2.17   
 * Server API   CGI/FastCGI
 */
session_start();
$products = array();
if (!isset($_SESSION['products'])) {
    $products = array("somedata1", "somedata2", "somedata3");
    $_SESSION['products'] = serialize($products);
    $_SESSION['test_products'] = serialize($products);
    echo "<br/>session products<br/>";
    print_r(unserialize($_SESSION['products']));
    echo "<br/>session test_products<br/>";
    print_r(unserialize($_SESSION['test_products']));
} else {
    echo "<br/>session products<br/>";
    print_r(unserialize($_SESSION['products']));
    echo "<br/>session test_products<br/>";
    print_r(unserialize($_SESSION['test_products']));
}
?>

首次运行输出

session products
Array ( [0] => somedata1 [1] => somedata2 [2] => somedata3 ) 
session test_products
Array ( [0] => somedata1 [1] => somedata2 [2] => somedata3 )

但在重新加载

session products

Warning: unserialize() expects parameter 1 to be string, array given in /home/uaustral/public_html/itoi/test.php on line 17

session test_products
Array ( [0] => somedata1 [1] => somedata2 [2] => somedata3 )

相同的代码在我的 PHP 版本 PHP 版本 5.3.2-1ubuntu4.11 上运行良好

我错过了什么(在新的 PHP 版本中自动更正)还是旧版本的 PHP 错误?

4

3 回答 3

1

如果您使用register_globals启用,则其中的任何数组项$_SESSION也称为该键的变量:

开启register_globals

<?php
session_start();
var_dump($products);

应该向您显示未序列化的字符串。因为你后来说$products = array();你在隐含地改变$_SESSION['products']. 解决方案: disable register_globals,附带说明:您不需要序列化该数据,会话可以很好地保存多维数组。只需确保在调用之前加载了任何需要的类定义session_start,或者具有自动加载功能。

于 2012-05-02T10:03:31.700 回答
0

我认为这篇文章可以帮助你:

http://www.phphelp.com/forum/index.php?topic=11483.0

“它现在可以工作了……我对我机器上的 php.ini 文件和生产服务器上的文件进行了比较。我在生产服务器上的 php.ini 文件中关闭了‘Register Globals’,现在购物车运行良好!谢谢”

于 2012-05-02T09:48:16.637 回答
-1

看看这是否有帮助:

http://www.php.net/manual/en/function.unserialize.php#105588

session_decode 函数甚至这么说。

于 2012-05-02T09:45:57.917 回答