php - 通过 $_SESSION 从一个脚本发送到另一个脚本时数据丢失

标签 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] => 2016-09-10 [confirmed_completion_date] => 2016-09-05 (...)

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

$_SESSION['object_with_array'] = $object_with_array;

并在第二个 PHP 中查看它,并且...在第一种方法中消失的属性在这里完好无损且有效!

(...) [task_completion_date] => 2016-09-10 [confirmed_completion_date] => 2016-09-05 (...)

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

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

仅供引用 构建对象的类类似于以下内容:

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
    }
}

提前感谢您的帮助:)

最佳答案

好吧,所以我检查了我可能做错了什么,当我看到它时,我真的……没关系。因此,这就是答案。

从来没有。曾经。经过。数据。尽管。显示。东西。

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

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

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

$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

关于php - 通过 $_SESSION 从一个脚本发送到另一个脚本时数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39252678/

相关文章:

php - Laravel 的 CSRF token 和负载均衡

php - 如何删除 woocommerce 错误您不能将另一个 “PRODUCT NAME” 添加到您的购物车

arrays - 为什么 gulp.src 不喜欢将完整路径数组传递给文件?

python - 如何使用 numpy 配对 (x,y) 对

php - 如何检查 session 是否已启动并重定向用户?

php - 基于 PHP 变量的 CSS 媒体查询

php - 如何使用 laravel 基于数据库条目运行 cron 作业?

php - 从 PHP 写入标准输入?

php - knpmenubundle:如何在构建器中获取用户数据?

python - 切片 2d numpy 数组