За последние 24 часа нас посетили 16719 программистов и 1573 робота. Сейчас ищет 661 программист ...

Запись сессии в файл и чтение из него

Тема в разделе "PHP для новичков", создана пользователем hitower, 17 окт 2022.

Метки:
  1. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    Здравствуйте, уважаемые.

    Ситуация такова
    При добавлении товара в корзину, в сессию пишется массив переменных для него.
    Задача в том, что при открытии страницы посетителем его корзина была уже заполненной.
    А посетитель удалил бы ненужные (воля заказчика).
    Для этого в сессии должны быть данные по всем товарам (их не много).
    Я подумал, что можно было бы самому набрать корзину и сохранить эту сессию в файл как шаблон для сессий при заходе посетителя.
    А для новых посетителей создавать сессию и загружать в неё данные из такого шаблона.
    Но я как нуб не уверен, что это технически возможно.
    В сети крайне мало примеров по работе с SessionHandler, увы.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.106
    Симпатии:
    1.243
    Адрес:
    там-сям
    Опиши задачу без своих догадок как ты это собираешся сделать. Просто напиши с точи зрения пользователя, без терминов вроде "сессия", "массив" и т.д.
     
  3. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    посетитель заходит на страницу со списком товаров
    в левой колонке витрина с товарами, в правой содержимое корзины.
    Надо что бы изначально все товары были уже в корзине - без кликов по кнопке "Добавить" под каждым товаром.
     
  4. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    Я хочу сделать дамп такой сессии.
    И при создании новой сессии новым посетителем помещать в неё дамп образцовой.
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    1. Корзина через сессии сделана?
    Если да - то $_SESSION['cart'] = ..... какой то код, наполняющий корзину

    если товары в БД, то делать какие то файлы дампов не имеет смысла.. так как данные надо брать свежие .. из БД
     
  6. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    И такой момент: посетитель положил товар в корзину по одной цене, прошло обновление цен, в базе изменились цены, какова предполагается реакция корзины?
     
  7. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    пробую, но спотыкаюсь.

    Подскажите почему ругается на строку 4 в этом массиве: syntax error, unexpected token "[", expecting ")" ?
    Вроде по вложенности всё верно
    Код (Text):
    1.             Array
    2.                 (
    3.                     [qt] => 2
    4.                     [data] => Array
    5.                         (
    6.                             [0] => stdClass Object
    7.                                 (
    8.                                     [teg] => input[text]
    9.                                     [custom] =>  class="d-none"
    10.                                     [hide] =>
    11.                                     [math] => 340000
    12.                                     [label] => Сервер для малого предприятия DELL R730
    13.                                     [fieldid] => 12.7
    14.                                     [value] => 0
    15.                                 )
    16.  
    17.                             [1] => stdClass Object
    18.                                 (
    19.                                     [teg] => calculatorSum
    20.                                     [pos] => 1
    21.                                     [unit] =>  ₽
    22.                                     [fixed] => 0
    23.                                     [format] => 0
    24.                                     [class] => d-none
    25.                                     [label] =>
    26.                                     [fieldid] => 12.3
    27.                                     [hide] => 1
    28.                                 )
    29.  
    30.                         )
    31.  
    32.                     [sum] => Array
    33.                         (
    34.                             [0] => Array
    35.                                 (
    36.                                     [0] => 340000
    37.                                     [1] => stdClass Object
    38.                                         (
    39.                                             [teg] => calculatorSum
    40.                                             [pos] => 1
    41.                                             [unit] =>  ₽
    42.                                             [fixed] => 0
    43.                                             [format] => 0
    44.                                             [class] => d-none
    45.                                             [label] =>
    46.                                             [fieldid] => 12.3
    47.                                             [hide] => 1
    48.                                         )
    49.  
    50.                                 )
    51.  
    52.                         )
    53.  
    54.                     [project] => stdClass Object
    55.                         (
    56.                             [id] => 5
    57.                             [access] =>
    58.                             [published] => 1
    59.                             [title] => Сервер для малого предприятия DELL R730
    60.                             [params] => stdClass Object
    61.                                 (
    62.                                     [cssform] =>
    63.                                     [jsform] => qf3.js
    64.                                     [modal] => 0
    65.                                     [modallink] =>
    66.                                     [ajaxform] => 1
    67.                                     [qfkeepalive] => 1
    68.                                     [autocomplete] => off
    69.                                     [thnq_message] => Спасибо за ваш заказ. Наш менеджер свяжется с вами в ближайшее время.
    70.                                     [toemail] =>
    71.                                     [subject] =>
    72.                                     [tmpl] => default
    73.                                     [showtitle] => 1
    74.                                     [showurl] => 0
    75.                                     [start_text] =>
    76.                                     [final_text] =>
    77.                                     [calculatortype] => default
    78.                                     [calcformula] =>
    79.                                     [history] => 1
    80.                                     [cartimglink] =>
    81.                                 )
    82.  
    83.                             [language] =>
    84.                             [hits] => 0
    85.                             [calculated] => 1
    86.                         )
    87.  
    88.                 )
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    кто ругается?.... мы че тут все Ванги?
    кусок кода где ругается, текст ошибки?
     
  9. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    print_r() на выходе даёт неисполняемый код, var_export(). Ты язык вообще не знаешь, синтаксис массивов?
     
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.835
    Симпатии:
    651
    Ну добавляй в сессию все товары (только не все на складе :), а по одной штуке, например, т.е. все номенклатуры) по кнопке «Купить» и т.п. Можно и прямо в корзине это делать. Типа если сессия не существует, то отобразить все (а реально добавите в сессию при первом удалении; по GET добавлять не надо).
    --- Добавлено ---
    При обработке заказа аналогично: нет сессии – полный пакет. Или различайте параметры кнопки заказа в корзине для полного и неполного пакетов.
    --- Добавлено ---
    P.S. Если сессия «стартует» безусловно, можно говорить о пустой/непустой сессии, только добавляйте в нее какой-нибудь флажок, а то после удаления последнего товара, корзина НЕОЖИДАННО снова окажется полностью наполненной. Типа раз пришел, надо чЁ-то купить :) И лучше сразу всё :D
     
  11. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    Спасибо за помощь!
    В итоге сделал так:
    Код (Text):
    1. $ssess = $_SESSION;
    2. $ssesser = serialize($ssess);
    3. file_put_contents( '/path/allinser.php', $ssesser); // разово записал полную корзину
    4.     if ( !session_id() ) {
    5.       $saved = file_get_contents( '/path/allinser.php' );
    6.       session_start();
    7.       $saved = unserialize( $saved );
    8.         $_SESSION = $saved;
    9.     }
    Всё работает )
    Позволяет потом изменять содержимое корзины
     
    antoniii нравится это.
  12. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    @hitower, то есть одна сессия на всех посетителей?
     
  13. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    id у сессий разные есессно, а содержимое - да, для всех посетителей одинаковое.
    Это лэндинг, там 6 товаров всего.
     
  14. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    корзина у всех посетителей одна будет? наркомания.
     
  15. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    Ну не стоит так ярлыки-то вешать, не разобравшись.
    Это пакетное предложение, состоящее из 6 позиций.
    Почему корзина не может быть одинаковой для всех?
    Посетитель видит её содержимое справа. Может удалить позиции, может изменить кол-во того или иного товара. Это требование заказчика.
    Только потом давит "Отправить"
    Есессно каждый посетитель управляет собственной корзиной
     
  16. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    @hitower, понял, но набивать сессию и сохранять в файл при каждом хите по страницам сайта не есть оптимальное решение.
     
  17. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    Нет, вы не так поняли.
    Сессию я сохранил 1 раз - она стала шаблоном для всех новых сессий.
    Этот шаблон загружается только когда открывается новая сессия.
     
  18. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    Из кода в посте https://php.ru/forum/threads/zapis-sessii-v-fajl-i-chtenie-iz-nego.100376/#post-658815 сессия сохраняется в файл безусловно, дальше бодаться будем?
     
  19. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
  20. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    914
    Симпатии:
    143
    каков фрагмент -- таковы и выводы )))
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Зачем тебе обязательно в файле хранить, что-то там серилизовать/десерилозовать. При первом старте сессии из кода положи туда нужные товары.

    Что-то вроде
    PHP:
    1. if (!($_SESSION["filled"] ?? false)) {
    2.     $_SESSION["products"] = [......];
    3.     $_SESSION["filled"] = true;
    4. }
     
  22. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    мне так в файл проще положить новый шаблон сессии, чем копипастить в код - там 14кб данных
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    А откуда эта инфа берётся изначально? Из базы? Где вообще хранятся товары и цены?
     
  24. hitower

    hitower Новичок

    С нами с:
    17 окт 2022
    Сообщения:
    11
    Симпатии:
    1
    Спасибо всем, проблема решена и закрыта
     
  25. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Код тоже можно вынести в отдельный файл, и не парить мозг сериализациями
    PHP:
    1. // session_products.php
    2. return [......];
    PHP:
    1. $_SESSION["products"] = require("session_products.php");
    Вместо сериализации используй var_export, он даёт корректный код