【问题标题】:Storing a PHP object in a session?在会话中存储 PHP 对象?
【发布时间】:2012-01-26 04:26:59
【问题描述】:

我有一个多页表单,我正在尝试在我的网站上实现它,它的工作原理如下:

1 输入客户详细信息 -- $_POST --> 2 确认客户详细信息 --$_SESSION--> 3 从客户详细信息生成 PDF

正如您在我的第二页上看到的,我从 $_POST 获取表单中的值。在同一页面上,我从名为 customer 的类中创建了一个名为“customer”的对象,该对象存储从我的第一页发布的所有值。

然后我设置一个名为“customer”的 $_SESSION 变量并将其分配给我的对象。

session_start();  

        //includes html header part of page
        include("includes/page/header.php");



        //customer class 
        include("classes.php");


        $customer = new customer();


        $_SESSION['customer'] = $customer;

现在在我网站的最后一页上,我有以下代码:

    session_start();

//assign customer to equal object stored in session
$customer = $_SESSION['customer'];


//to test if successfull , nothing is displayed!
echo $customer->first_name;


return 0;

测试这个没有显示在我的页面上,所以我的会话没有做我认为它会做的事情。

仅供参考:

  • 我的班级客户很好,工作正常,所有值都正确存储!
  • 我的帖子数组工作正常

最后一页上会话的 var_dump。

object(__PHP_Incomplete_Class)#1 (15) { ["__PHP_Incomplete_Class_Name"]=> string(8) "customer" ["first_name"]=> string(5) "Iain" ["second_name"]=> string(6) "Taylor" ["company_name"]=> string(10) "Wired Ltd." ["address_1"]=> string(15) "14 Joseph St" ["address_2"]=> string(8) "West End" ["city"]=> string(7) "Glasgow" ["postcode"]=> string(7) "G45 NP4" ["county"]=> string(29) "Scotland" ["country"]=> string(14) "United Kingdom" ["email"]=> string(31) "somebody@somebody.com" ["phone"]=> NULL ["cid"]=> NULL ["reg_date"]=> NULL ["tel"]=> string(11) "01413395678" } 

任何想法如何让它工作?

谢谢

圣诞快乐!

【问题讨论】:

  • 你试过用var_dump($_SESSION['customer'])查看内容吗?
  • $customer->first_name 在分配给会话之前是否有值?
  • 您是否在设置会话后验证可以直接读取会话?
  • 我注意到您在首页添加了classes.php,但在您的最后一页中没有添加include。故意的?
  • 您需要确保可以序列化该对象以将其存储在会话中(因为会话数据在存储时被序列化).. 请参阅 __sleep 和 __wakeup php 魔术方法.. 不是您保存的时候需要序列化..保存session的时候需要能够序列化

标签: php forms oop session


【解决方案1】:

您需要在最后一页上的session_start() 之前执行include("classes.php");,因为在反序列化会话变量时,PHP 会尝试实例化您已放入会话数据的同一类的对象。因此,如果 PHP 找不到该类,则会引发错误。

【讨论】:

  • 页面上没有报告错误 - 检查我更新的 var_dump 问题
  • @loosebruce 您是否将class.php 包含在最后一页的session_start() 之前?
  • 不,我没有,所以一定是别的什么? -谢谢
  • 如果你不包括class.php,那就去做吧,看看它是否对你有帮助。
  • 我的变量 $customer 和 $_SESSION['customer'] 得到了相同的 var 转储。不完整的类是什么意思?
【解决方案2】:

@Timur 是绝对正确的,除了他错过了一件事。您需要在每个页面上移动包含 session_start() 的类,而不仅仅是最后一个。

"调用 session_start() 时会发生自动序列化/反序列化。 这意味着包含文件和调用 session_start() 的顺序非常重要。” - PHP Session with an Incomplete Object

下次提问前先做一些调查。这是在 Google 上搜索“PHP 不完整类”的第三个结果。

作为一般规则,您应该在每个脚本的最顶部包含所有文件。这样你就永远不会遇到这样的依赖问题。

【讨论】:

  • 谢谢,但我发现了问题所在,解决它的唯一方法是修改我的 php.ini 文件 - php.net/manual/en/function.serialize.php
  • 如果我在顶部包含所有文件,我的一些变量会被重写。
  • 不确定“重写”是什么意思,但标准做法是在页面顶部包含所有文件。包含一个类只是使您能够在文件中使用它并且它不会覆盖任何内容。如果您没有利用 PHP 的 OOP 特性,而只是包含您编写的脚本/函数,那么谁知道在页面顶部包含所有文件会做什么。然而,这是一种糟糕的做法,您应该真正学会以面向对象的方式编写代码。
  • 我的意思是我有几个库使用类似的变量名,如 $name 等,如果我将它们全部包含在顶部,它会弄乱我的 pdf 制作者。所以我只在代码的不同点需要时才包含它们。
  • 正如我所说,除非它们没有在无关紧要的类中定义。这一切都取决于他们的范围,如果你做的事情正确,那应该没问题。相信我,这将使您的生活更轻松,并且您不必根据您的代码不是以可扩展的方式来处理哪些可以包含和不能包含的内容。
猜你喜欢
  • 2017-12-06
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多