通过$ _SESSION从一个脚本发送到另一个脚本期间的数据丢失

时间:2016-08-31 14:42:41

标签: php arrays session

我正在尝试使用以下命令将一个充满属性的对象从一个PHP发送到另一个:

$_SESSION['object'] = $obj;

其中 $ obj 是使用foreach循环指定的对象:

foreach($array_of_objects as $obj) {
    $_SESSION['object'] = $obj;
    // here the second PHP file is invoked as a lightbox with tinybox2
    echo "<article onclick=\"TINY.box.show({url:'tinybox2/popup.php',boxid:'popup'})\">Article Content</article>";
}

在第二个PHP文件中,我尝试打印传递的对象:

print_r($_SESSION['object']);

所有以Y-m-d格式出现日期的属性(yyyy-mm-dd,例如2016-08-31)都是空的,看起来就是这样:

Card Object (
    [number] => 1234
    [order_number] => ABCDE0000012345
    [name] => Test Name
    [date_composed] => 2016-08-31 14:28
    [companys] => My Company \ 100 %
    [selected_company] => My Company
    [selected_company_part] => 100
    [user] => Test User Name
    [status] => test status 123
    [group] => Dummy
    [coordinator] => Test Coordinator Name
    [order_type] => n/a
    [supplier] => Test Supplier
    [task_completion_date] =>
    [confirmed_completion_date] =>
    [department] => Test Department
    [priority] => 2 - medium
    [created_by] => Test Creator Name
    [cost] => 0
    [external_status] => test status 321
) 

你可以清楚地看到两个属性出了问题。他们的正确值应为:

  

(...)[task_completion_date] =&gt; 2016-09-10 [confirmed_completion_date] =&gt; 2016-09-05(...)

为了测试,我尝试发送存储对象数组的整个对象:

$_SESSION['object_with_array'] = $object_with_array;

并在第二个PHP中查看它,并且...在第一种方法中已经消失的属性,这里完好无损且工作正常!

  

(...)[task_completion_date] =&gt; 2016-09-10 [confirmed_completion_date] =&gt; 2016-09-05(...)

因此我想从数组中只发送一个对象,而不是包含该数组的整个对象。在第一个PHP中查看 $ obj 变量和 $ _ SESSION ['object'] 会导致查看存储在两个对象实例中的日期(如上所述),因此问题发生在第二个PHP文件中的会话读取过程中,而不是在保存或读取第一个PHP文件时。

我的问题是:在通过会话将对象发送到第二个文件期间存储在对象中的那些日期发生了什么?为什么它只在发送单个对象时发生,而不是包含数组的更抽象对象不那么抽象的对象?如何使这个过程正常工作?

FYI 构建对象的类看起来类似于下面的内容:

class Card
{
    // PROPERTIES
    public $number;
    public $order_number;
    public $name;
    public $date_composed; // FORMAT: yyyy-mm-dd hours:mins; WORKS IN 2'nd PHP
    public $companys;
    public $selected_company;
    public $selected_company_part;
    public $user;
    public $status;
    public $group;
    public $coordinator;
    public $type;
    public $supplier;
    public $task_completion_date; // THIS DATE DISAPEARS
    public $confirmed_completion_date; // THIS DATE DISAPPEARS
    public $department;
    public $priority;
    public $created_by;
    public $cost;
    public $external_status;

    // METHODS
    // Main public constructor
    public function __construct($data) {
        $column = 0;
        foreach($this as $key => $value) {
            $this->$key = $data[$column];
            $column++;
        }
    }

上面提到的对象数组存储在类似下面的类中:

class Cards
{
    // PROPERTIES
    public $houseOfCards; // $array_of_objects
    // some other properties that ain't important       

    // METHODS
    // Public constructor reading data from CSV files to objects in an array
    public function __construct() {
        $this->houseOfCards = array();      
        // Here the reading from CSV happens to $data in a loop
            $this->houseOfCards[] = new Card($data);
        // file is being closed after it is read whole
    }
}

提前感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

好的,所以我查看了我的错误,当我看到它时,我真的......没关系。因此,这是答案。

从不。永远。通过。数据。而。显示。东西。

否则你会一遍又一遍地覆盖你的数据......:x

发生的事情是,我的最后一个数组元素没有 $ task_completion_date 。最后一个元素是我的第二个PHP看到的元素。为什么?因为每次调用元素显示时我都在发送对象,而不是点击

虽然我真的不知道如何只将一个对象数据正确发送到第二个脚本,但是在我开始显示内容之前,我正在发送整个 $ array_of_objects 。用户可以点击。每个可点击元素都获得了 tinybox2 发布功能发送的密钥值。现在我可以通过以下方式访问数据:

$the_object_i_need = $_SESSION['array_of_objects'][$_POST['key']];

或者更清楚     $ array = $ _SESSION ['array_of_objects'];     $ key = $ _POST ['key'];     $ the_object_i_need = $ array [$ key];

只有键值可能通过它通过POST的tinybox2实现发送的事实可见,我真的不喜欢它,但是肯定这解决了我的问题,我可以在第二个访问正确的对象数据文件。

感谢@nerdlyist的灵感来写这个答案,@ sumit-badaya再一次提出传递整个数组的想法,我试图省略。

当前PHP1:

$_SESSION['array_of_objects'] = $array_of_objects;
foreach($array_of_objects as $key=>$obj) {
    // here the second PHP file is invoked as a lightbox with tinybox2
    echo "<article onclick=\"TINY.box.show({url:'tinybox2/popup.php',post:'key=$key',boxid:'popup'})\">Article Content</article>";
}

当前的PHP2:

$array_of_objects = $_SESSION['array_of_objects'];
$key = $_POST['key'];
$requested_object = $array_of_objects[$key];
// Here the data is printed in a form of nice table