Intereting Posts
PDO отправляет необработанный запрос в MySQL, в то время как Mysqli отправляет подготовленный запрос, оба дают тот же результат Как заставить Zend Route использовать другой модуль в зависимости от имени домена PHP – сравнение даты, проверка, если в течение последнего часа Общие вопросы по полному опросу / HTTP-потоку Массив сортировки PHP по ключу Конвертировать видео в фоновом режиме php ffmpeg? Как получить 10 макс и 10 минут строк с этим запросом? php crawl – включен javascript Ошибка наследования шаблона шаблона PHP Singleton Удалить переменный продукт из корзины с помощью ajax в woocommerce Ошибка синтаксиса PHP «неожиданный конец $ end» Ошибка PHP error_reporting (0) влияет на регистрацию ошибок или просто отображается? Комментируйте HTML и PHP вместе Как автозаполнение других полей формы при нажатии на PHP Анонимная функция PHP, назначенная для свойства класса в конструкторе, всегда равна нулю?

Потеря данных при отправке через $ _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']); 

и все свойства, которые имели дату в формате 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