Как установить объект PHP в сеансе при нажатии на гиперссылку

#javascript #php #session

#javascript #php #сеанс

Вопрос:

У меня есть две страницы PHP: одна отображает информацию об объекте, полученную из базы данных MySQL, а другая позволяет пользователю редактировать ее. Пользователь переходит с первой страницы (страница просмотра) на страницу редактирования при нажатии на гиперссылку.

Я хотел бы установить информацию, полученную из базы данных, в сеансе перед переходом на страницу редактирования, чтобы избежать дополнительного вызова базы данных. Как я могу установить объект в сеансе при событии нажатия на гиперссылку? Я знаю, что мог бы добавить объект в качестве переменной к запросу GET, но есть ли более чистый способ, чем этот?

Комментарии:

1. я бы просто сделал дополнительный вызов db, он, вероятно, будет кэшироваться сервером db, и это не должно быть проблемой, даже если это не так. вероятно, больше накладных расходов при просмотре и чтении файла сеанса, чем при вызове db

2. лично я постоянно храню объекты в сеансах для обычных нечувствительных данных, таких как общедоступная информация пользователя. я думаю, это зависит от ваших предпочтений и вашего обработчика сохранения. если вы используете redis, это будет быстрее, чем вызов mysql, но он также будет использовать больше памяти (и подкачки, если у вас мало памяти)

Ответ №1:

Поместите объект в сеанс ( $_SESSION['object'] = $object ) при загрузке страницы (или при извлечении объекта из базы данных). Таким образом, вы избегаете второго вызова базы данных. Если вы хотите поместить его в сеанс при событии click, потребуется второй вызов, поскольку вам придется выполнить AJAX-вызов PHP-скрипта, который извлекает объект. Однако это может иметь смысл только в том случае, если ожидается, что пользователь отредактирует эту информацию, в противном случае он просто сохраняет данные в сеансах без причины, что также может выявить ошибки безопасности. Если ваш вызов базы данных не извлекает миллионы записей или у вас нет сотен миллионов пользователей, редактирующих данные одновременно, я могу заверить вас, что влияние на производительность при повторном вызове останется незамеченным.

Комментарии:

1. Имеет смысл — есть ли какой-либо указатель на образец кода AJAX, который я могу просмотреть? Я довольно невежественен в AJAX — заранее спасибо

2. code.tutsplus.com/tutorials/…

Ответ №2:

Добавление объекта в сеанс:

 $_SESSION['the_object'] = $object;
  

(Отказ от ответственности: не будет работать, если объект содержит какие-либо несериализуемые компоненты, такие как замыкания)

Теперь, когда это сделать? На самом деле, вы должны сделать это на странице, которая показывает данные, потому что, если вы сделаете это позже, когда пользователь нажмет на ссылку редактирования, это уже вызовет новый запрос, который затем снова перейдет к базе данных — у вас будет два запроса (один для списка, один для редактирования).

Как правило, ссылка редактировать содержит идентификатор редактируемой записи в базе данных. Но обратите внимание на тщательную проверку того, разрешен ли пользователю доступ или нет, потому что MySQL просто увеличит идентификатор, поэтому легко догадаться, какие идентификаторы действительны. Любой, у кого есть хоть малейшая зацепка, может изменить HTML-форму, чтобы подделать идентификаторы.

Подход с сеансом несколько проще: вы разрешаете редактировать только то, что было сохранено в сеансе, поэтому управление доступом должно выполняться только на странице списка.

Комментарии:

1. Это не будет работать без session_start() OP может этого не знать.

2. Если он говорит о сеансах, я думаю, он уже все понял.

3. Он / она не опубликовал никакого кода. Мы не должны предполагать. Я знаю, что делает рулевое колесо. Я бы не знал, как его установить.

4. Sven — большое спасибо. У меня все еще есть один вопрос — как мне перевести объект в сеанс при нажатии на гиперссылку? Если я помещаю объект в сеанс при загрузке страницы — возможно, я трачу впустую место в памяти, потому что пользователь никогда не нажимает на ссылку редактирования. Поэтому я хочу поместить объект в сеанс только в том случае, если пользователь нажмет кнопку Изменить — так, чтобы соответствующий объект находился в памяти.

5. В чем преимущество помещения объекта в сеанс при нажатии «Редактировать»? На этом этапе вы должны прочитать из базы данных, а затем отобразить форму редактирования. После сохранения редактирования единственное, что вам нужно сделать, это записать обратно в БД.

Ответ №3:

Для тех, кто, возможно, ищет фрагмент кода, который поможет это сделать — вот он

Страница 1 — эта страница просто загружает данные из базы данных и отображает их на экране в режиме, недоступном для редактирования. На этой странице нам нужна функция Javascript, которая может быть активирована при нажатии на гиперссылку

 <script language="JavaScript" type="text/javascript">
    function processEditLink(){
        $.post('process_session_put.php', <?php echo "{S-Object:'".json_encode($obj_)."'});"; ?>
        window.location.href = 'edit_object.php';
    }
</script>   
  

Чтобы объяснить приведенный выше код, мы берем объект (называемый obj_) и кодируем его в версию JSON с помощью встроенной функции json_encode. Не забудьте убедиться, что ваш объект реализует JsonSerializable, чтобы выполнить это. После этого мы передаем эту строку JSON в качестве параметра POST URI через AJAX на секретную страницу с именем process_session_put.php . Этот вызов никогда не виден конечному пользователю и происходит тайно при нажатии на гиперссылку. Секретная страница PHP декодирует строку JSON обратно в объект PHP и помещает ее в сеанс для всеобщего использования. Наконец, как только эта функция завершена, окно перенаправляется на фактическую страницу редактирования, которая может получить доступ к данным из сеанса и заполнить экран.

Далее мы должны изменить гиперссылку, чтобы запускать эту функцию Javascript при нажатии, как показано ниже

 <a class="edit-link" href="javascript:processEditLink(this);return false;">[Edit]</a>
  

Наконец, страница PHP называется process_session_put.php — который фактически выполняет фоновую работу по декодированию переданной ему строки JSON обратно в формат объекта и помещению ее в сеанс

 <?php

    if (!isset($_SESSION))
    {
        session_start();
    }

    // OBTAIN THE JSON STRING FROM POST URL, DECODE IT AND PUT IT BACK AS A OBJECT IN SESSION
    $_SESSION["E-Object"] = json_decode($_POST["S-Object"]);
?>