Я пытаюсь отправить объект, полный свойств с одного 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']);
и все свойства, которые имели дату в формате Ymd (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 [confirm_completion_date] => 2016-09-05 (…)
Для тестирования я попробовал отправить весь объект, в который хранится массив объектов:
$_SESSION['object_with_array'] = $object_with_array;
и просмотрел его во втором PHP, и … свойства, которые были ушли в первый подход, здесь неповреждены и работают!
(…) [task_completion_date] => 2016-09-10 [confirm_completion_date] => 2016-09-05 (…)
Поэтому я хочу отправить только один объект из массива, а не весь объект, содержащий массив. Кроме того, просмотр переменной $ 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 } }
Заранее спасибо за помощь 🙂
Хорошо, поэтому я проверил, что я могу сделать неправильно, и когда я увидел это, я буквально … никогда не думал. Поэтому вот ответ.
Никогда. Когда-либо. Проходить. Данные. В то время как. Отображение. Материал.
В противном случае вы будете перезаписывать свои данные снова и снова …: 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