Php передать переменную в другой файл через сессию

Обновлено: 01.07.2024

Сессии в PHP

С самого начала PHP все приняли на ура, но как только на этом языке стали создавать достаточно крупные проекты, разработчики столкнулись с новой проблемой - в PHP отсутствовало понятие глобальных переменных! То есть, выполнялся некий скрипт, посылал сгенерированную страницу клиенту, и все ресурсы, используемые этим скриптом уничтожались. Попробую проиллюстрировать: предположим есть две страницы одного сайта, index.php и dothings.php. Исходники к этим страницам выглядят так:

Если выполнить эти два скрипта, то на первой странице мы увидим надпись "Меня задали на index.php", а вторая страница будет пустой.

Разработчики web-сайтов, недолго думая, стали использовать cookie для хранения глобальных переменных на стороне клиента. Процесс выглядел примерно так: пользователь приходит на главную страницу сайта, делает какие-то действия, и вся информация, связанная с этим пользователем, которая может потребоваться на других страницах сайта, будет храниться у него в браузере в виде cookie. Этот метод имеет довольно серьезные минусы, из-за которых от PHP в своё время отвернулось немало разработчиков. Например, нам нужно авторизовать пользователя, чтобы разрешить ему доступ к закрытым (или принадлежащим только ему) разделам сайта. Придется отправлять пользователю cookie, который будет служит его последующим идентификатором на сайте. Такой подход становится очень громоздким и не удобным, как только сайт начинает собирать всё больше и больше сведений о поведении пользователя, ведь всю информацию, посылаемую пользователю, желательно кодировать, чтобы её нельзя было подделать. Ещё совсем недавно подделкой cookie можно было "уложить" не один чат, а порой и пробраться в чужую почту. К тому же есть ещё на свете странные люди, у которых браузер cookie не поддерживает.

При использовании сессий вся информация хранится не на стороне клиента, а на стороне сервера, и потому лучше защищена от манипуляций злоумышленников. Да и работать с сессиями куда проще и удобнее, так как все данные автоматически проходят через алгоритмы криптографии модуля PHP. В броузере клиента, лишь хранится уникальный идентификатор номера сессии, либо в форме cookie, либо в виде переменной в адресной строке броузера, какой из двух способов использовать для передачи идентификатора сессии между страницами интерпретатор PHP выбирает сам. Это на 100% безопасно, так как идентификатор сессии уникален, и подделать его практически невозможно (об этом чуть далее, в разделе о безопасности сессий).

Я не буду вдаваться в технологические вопросы устройства механизма работы сессий, а только опишу, как правильно работать с сессиями в PHP.

Как работать с сессиями?

Если вы будете тестировать примеры из статьи (или ваши скрипты) на каком-либо коммерческом хостинге, проблем с работой с сессиями быть не должно. Если же вы сами настраивали ваш сервер (будь то реальный сервер, или эмулятор), могут появляться ошибки примерно такого содержания:

"Warning: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) failed: No such file or directory (2)".

Это значит всего лишь, что у вас неправильно настроен PHP. Решить эту проблему можно, прописав правильный путь (на существующую директорию) для сохранения сессий в файле php.ini и перезапустить сервер.

Любой скрипт, который будет использовать переменные (данные) из сессий, должен содержать следующую строчку:

Эта команда говорит серверу, что данная страница нуждается во всех переменных, которые связаны с данным пользователем (браузером). Сервер берёт эти переменные из файла и делает их доступными. Очень важно открыть сессию до того, как какие-либо данные будут посылаться пользователю; на практике это значит, что функцию session_start() желательно вызывать в самом начале страницы, например так:

Для задания директории в которой будут сохраняться файлы сессий используется функция session_save_path():

После начала сессии можно задавать глобальные переменные. Ари присвоении какого-либо значения любому полю массива $_SESSION, переменная с таким же именем автоматически регистрируется, как переменная сессии. Этот массив доступен на всех страницах, использующих сессию. Для примера разберем програму:

При последовательном запуске этих файлов, первый скрипт "index.php" выдаст следующий результат:

Всё ОК. Сессию загрузили! Пройдём, посмотрим что там:

А второй "dothings.php" вот это:

Меня задали на index.php

Переменная $a теперь доступна на всех страницах данного сайта, которые запустили сессии.

  • unset($_SESSION['a']) - сессия "забывает" значение заданной сессионой переменной;
  • session_destroy() - сессия уничтожается (например, если пользователь покинул систему, нажав кнопку "выход");
  • session_set_cookie_params(int lifetime [, string path [, string domain]]) - с помощью этой функции можно установить, как долго будет "жить" сессия, задав unix_timestamp определяющий время "смерти" сессии. По умолчанию, сессия "живёт" до тех пор, пока клиент не закроет окно браузера.
  • session_write_close() - запись переменных сесии и закрытие ее. Это необходимо для открытия сайта в новом окне, если страница выполняет длительную обработу и заблокировала для вашего браузера файл сессий.

Примеры

Теперь обратимся к практическому применению механизма сессий. Здесь мы рассмотрим пару довольно простых и в то же время полезных примеров.

Авторизация Пользователя

Вопросы по авторизации пользователей с помощью PHP-сессий постоянно задаются в конференциях по web-программированию. Механизм авторизации пользователей в системе с помощью сессий довольно хорош с точки зрения безопасности (см.раздел Безопасность).

Примеры: index.php authorize.php secretplace.php

Безопасность

  • на компьютере пользователя стоит "троян", который ворует номера сессий;
  • злоумышленник отлавливает трафик между компьютером пользователя и сервером. Конечно, есть защищенный (зашифрованный) протокол SSL, но им пользуются не все;
  • к компьютеру нашего пользователя подошел сосед и стащил номер сессии.

Такие ситуации, основанные на том, что кто-то что-то у кого-то стащит, в общем, не входят в компетенцию программиста. Об этом должны заботиться администраторы и сами пользователи.

  • Файл authorize.php - попытка подбора пароля с помощью стороннего скрипта;
  • Файл secretplace.php - попытка обмануть программу путём вписывания значений переменной $logged_user в адресной строке браузера, например так:
    "http://www.yoursite.ru/secretplace.php?logged_user=hacker"

Итак, в нашей программе явно видны две "дыры", одна маленькая и не особо заметная, а вот вторая - просто огромная, через которую большинство хакеров и лезет туда, куда не надо.

Как "залатать" дыру номер 1?

Не будем писать тонны кода по блокировке IP-адреса и т.п., а просто проверим, откуда приходит запрос, а точнее с какой страницы пришёл запрос, если это будет любая страница с нашего сайта, то всё нормально, а во всех остальных случаях пускать не будем. Подкорректируем файл authorize.php:

authorize.php V2
Как избавиться от "дыры" номер 2?

В принципе, любую переменную скрипта можно задать через адресную строку, просто дописав после полного адреса к скрипту вопросительный знак и название переменной с её значением. Давайте поправим наш код, чтобы этого избежать:

secretplace.php V2 Итоги

Механизм сессий - довольно удачная особенность языка PHP. Сессии просты, очень гибки в использовании. Кстати, есть одна, мало где документированная возможность сессий PHP (доступна начиная с версии 4.0.3) - в сессиях можно хранить не только переменные, но и объекты.

Обработка сессии это ключевой приём в PHP, что позволяет хранить данные пользователя на всех страницах веб-сайта или приложения. Из этой статьи вы узнаете основы обработки сессии в PHP.

Мы начнем с объяснения того, как работают сессии и как они связаны с куки-файлами. Затем мы рассмотрим несколько фрагментов кода, демонстрирующих, как работать с сеансами. Вы узнаете, как создавать и уничтожать сеансы и как изменять переменные сеанса.

Что такое сессия в PHP?

The HTTP Protocol and a Stateless Request
The HTTP Protocol and a Stateless Request
The HTTP Protocol and a Stateless Request

В этой модели, если вы хотите отобразить пользовательскую информацию, вам нужно будет аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было вводить ваше имя пользователя и пароль на каждой странице с информацией ваших о данных! Да, это было бы громоздко и вообще не практично, и именно здесь на помощь приходят сеансы.

Сессия позволяет вам обмениваться информацией с разными страницами одного сайта или приложения, и помогает поддерживать состояние. Это позволяет серверу знать, что все запросы исходят от одного и того же пользователя, что позволяет сайту отображать информацию и настройки пользователя.

Обработка входа с сессиями и файлами «куки» (cookie)

Давайте быстро рассмотрим общий пример входа на веб-сайт, чтобы понять, что происходит за кулисами.

  1. Пользователь открывает страницу входа на веб-сайт.
  2. После отправки формы входа, сервер, на другом конце, аутентифицирует запрос, проверив введённые учётные данные.
  3. Если учётные данные, введённые пользователем, верны, сервер создаёт новый сеанс. Сервер генерирует уникальное случайное число, которое называется идентификатором сеанса. Также, на сервере, создаётся новый файл, который используется для хранения информации, относящейся к сеансу.
  4. Затем, идентификатор сеанса передаётся обратно пользователю, вместе с тем, что он запросил. За кулисами этот идентификатор сеанса отправляется в заголовке ответа «куки» PHPSESSID (так называется по умолчанию).
  5. Когда браузер получает ответ от сервера, он получает заголовок куки-файла PHPSESSID . Если в браузере разрешены «куки», то он сохранит этот PHPSESSID , в котором хранится идентификатор сеанса, переданный сервером.
  6. Для последующих запросов, «кука» PHPSESSID передаётся обратно на сервер. Когда сервер получает «куку» PHPSESSID , он пытается инициализировать сеанс с этим идентификатором сеанса. Он делает это, загружая файл сеанса, который был создан ранее во время инициализации сеанса. Затем он инициализирует суперглобальную переменную массива $_SESSION с данными, хранящимися в файле сеанса.

Таким образом, пользовательские данные сохраняются даже в нескольких запросах, и пользователь не теряется на протяжении всего сеанса.

The HTTP Protocol and a Request With Sessions
The HTTP Protocol and a Request With Sessions
The HTTP Protocol and a Request With Sessions

Теперь, когда вы увидели краткое введение в работу сессий, мы создадим несколько практических примеров, чтобы продемонстрировать, как создавать и манипулировать переменными сессии.

Как запустить сессию

В этом разделе мы обсудим, как запустить сессию в PHP.

Всякий раз, когда вы хотите поработать с переменными сеанса, необходимо убедиться, что сеанс уже запущен. Сеанс в PHP можно запустить несколькими способами.

Использование функции session_start

Метод, в котором сессия запускается функцией session_start , вы будете видеть часто.

Важно, чтобы функция session_start вызывалась в начале скрипта, перед отправкой чего-либо браузеру. В противном случае, вы столкнётесь с печально известной ошибкой Headers are already sent .

Автоматический запуск сеанса

При необходимости применения сессий в приложении, есть возможность запускать сеанс автоматически без использования функции session_start .

В файле php.ini есть параметр session.auto_start , который позволяет запускать сеанс автоматически для каждого запроса. По умолчанию установлено значение 0 (выкл), и вы можете установить его на 1 (вкл), чтобы включить функцию автоматического запуска.

С другой стороны, если у вас нет доступа к файлу php.ini, и вы используете веб-сервер Apache, эту переменную можно задать с помощью файла .htaccess.

Если вы добавите строку выше в ваш .htaccess файл, то это должно автоматически запускать сессии в вашем PHP-приложении.

Как получить идентификатор сеанса

Как мы уже рассмотрели ранее, сервер создаёт уникальный номер для каждой новой сессии. Если вы хотите получить идентификатор сеанса, можно использовать функцию session_id , как показано в следующем фрагменте.

Это должно выдать вам идентификатор текущего сеанса. Функция идентификатора session_id интересна тем, что она ещё может принимать один аргумент — идентификатор сеанса. Если вы хотите заменить сгенерированный системой идентификатор сеанса на ваш, это можно сделать, передав первый аргумент функции session_id .

Важно отметить, что если вы хотите начать сеанс с помощью своего идентификатора сеанса, функция session_id должна стоять перед вызовом session_start .

Создание переменных сеанса

В этом разделе мы изучим, как инициализировать переменные сессии в PHP.

Как мы уже обсудили, при запуске сеанса, инициализируется суперглобальный массив $_SESSION с соответствующей информацией о сессии. По умолчанию, он инициализируется в виде пустого массива, и вы можете хранить больше информации, используя пару ключ–значение.

Давайте рассмотрим следующий пример кода, который показывает, как инициализировать переменные сеанса.

Как видите, мы запустили сессию в начале скрипта, используя функцию session_start . После этого мы инициализировали несколько переменных сессии. Наконец, мы использовали эти переменные через суперглобальную переменную $_SESSION .

При хранении данных сеанса с помощью $_SESSION , в итоге, они хранятся в соответствующем файле сессии на сервере, который был создан, когда сессия была запущена. Таким образом данные сеанса совместно используются несколькими запросами.

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

Как изменять и удалять переменные сеанса

Можно изменять или удалять переменные сеанса, созданные ранее в приложении так же, как обычные переменные PHP.

Давайте посмотрим, как изменять переменные сессии.

В приведённом выше коде, мы проверяем, установлена ли переменная $_SESSION['count'] . Если не установлена, мы устанавливаем её равной 1 , в противном случае, увеличим её на 1 . Таким образом, если вы обновите эту страницу несколько раз, вы должны увидеть, что счётчик, каждый раз, увеличивается на единицу!

С другой стороны, если вы хотите удалить переменную сеанса, вы можете использовать функцию unset , как показано в следующем фрагменте.

Таким образом, вы больше не сможете обращаться к переменной $_SESSION ['logged_in_user_id'] , поскольку она удалена функцией unset . Вот так вы можете изменить информацию о сеансе.

Как уничтожить сессию

В этом разделе мы увидим, как можно уничтожить сессию. В предыдущем разделе мы рассмотрели функцию unset , которая используется для удаления определённых переменных сеанса. С другой стороны, если вы хотите удалить сразу все данные, связанные с сеансом, вы можете использовать функцию session_destroy .

Попробуем понять, как это работает в следующем примере.

Функция session_destroy удаляет всё, что хранится в текущем сеансе. Таким образом, с последующими запросами вы увидите пустую переменную $_SESSION , поскольку данные сеанса, хранящиеся на диске, были удалены функцией session_destroy .

Как правило, функцию session_destroy нужно использовать, когда пользователь выходит из системы.

Заключение

В этой статье мы изучили основы обработки сеансов в PHP. Это ключевая концепция, которая позволит вам сохранять информацию для веб-страниц.

В первой половине статьи мы обсудили основные концепции сеансов, а затем мы создали несколько примеров на PHP, чтобы продемонстрировать, как вы могли создавать и уничтожать сеансы, а также манипулировать переменными сеанса.

ElePHPant. PHP for beginners. Session

Всем хорошего дня. Перед вами первая статья из серии PHP для начинающих разработчиков. Это будет необычная серия статей, тут не будет echo "Hello World" , тут будет hardcore из жизни PHP программистов с небольшой примесью «домашней работы» для закрепления материала.

Изначально подразумевали, что по этому протоколу будет только HTML передаваться, отсель и название, а сейчас чего только не отправляют и =^.^= и(•_ㅅ_•)


А вот пример ответа:

  1. При авторизации пользователя, сервер генерирует и запоминает уникальный ключ — идентификатор сессии, и сообщает его браузеру
  2. Браузер сохраняет этот ключ, и при каждом последующем запросе, его отправляет
Т.е. если украсть cookie из вашего браузера, то можно будет зайти на вашу страничку в facebook от вашего имени? Не пугайтесь, так сделать нельзя, по крайней мере с facebook, и дальше я вам покажу один из возможных способов защиты от данного вида атаки на ваших пользователей.

Давайте теперь посмотрим как изменятся наши запрос-ответ, будь там авторизация:


Метод у нас изменился на POST, и в теле запроса у нас передаются логин и пароль. Если использовать метод GET, то строка запроса будет содержать логин и пароль, что не очень правильно с идеологической точки зрения, и имеет ряд побочных явлений в виде логирования (например, в том же access.log ) и кеширования паролей в открытом виде.

Ответ сервер будет содержать заголовок Set-Cookie: KEY=VerySecretUniqueKey , что заставит браузер сохранить эти данные в файлы cookie, и при следующем обращении к серверу — они будут отправлены и опознаны сервером:

PHP и сессия

Я надеюсь, у вас уже установлен PHP на компьютере, т.к. дальше я буду приводить примеры, и их надо будет запускать
Вот вам статейка на тему PHP is meant to die, или вот она же на русском языке, но лучше отложите её в закладки «на потом».

Перво-наперво необходимо «стартовать» сессию — для этого воспользуемся функцией session_start(), создайте файл session.start.php со следующим содержимым:


Запустите встроенный в PHP web-server в папке с вашим скриптом:

Cookie

Там будет много чего, интересует нас только вот эта строчка в ответе сервера (почистите куки, если нет такой строчки, и обновите страницу):


Увидев сие, браузер сохранит у себя куку с именем `PHPSESSID`:

Browser session cookie

PHPSESSID — имя сессии по умолчанию, регулируется из конфига php.ini директивой session.name, при необходимости имя можно изменить в самом конфигурационном файле или с помощью функции session_name()

И теперь — обновляем страничку, и видим, что браузер отправляет эту куку на сервер, можете попробовать пару раз обновить страницу, результат будет идентичным:

Browser request with cookie

Итого, что мы имеем — теория совпала с практикой, и это просто отлично.

Следующий шаг — сохраним в сессию произвольное значение, для этого в PHP используется супер-глобальная переменная $_SESSION , сохранять будем текущее время — для этого вызовем функцию date():


Обновляем страничку и видим время сервера, обновляем ещё раз — и время обновилось. Давайте теперь сделаем так, чтобы установленное время не изменялось при каждом обновлении страницы:


Обновляем — время не меняется, то что нужно. Но при этом мы помним, PHP умирает, значит данную сессию он где-то хранит, и мы найдём это место…

Всё тайное становится явным


По умолчанию, PHP хранит сессию в файлах — за это отвечает директива session.save_handler, путь по которому сохраняются файлы ищите в директиве session.save_path, либо воспользуйтесь функцией session_save_path() для получения необходимого пути.
В вашей конфигурации путь к файлам может быть не указан, тогда файлы сессии будут хранится во временных файлах вашей системы — вызовите функцию sys_get_temp_dir() и узнайте где это потаённое место.

Так, идём по данному пути и находим ваш файл сессии (у меня это файл sess_dap83arr6r3b56e0q7t5i0qf91 ), откроем его в текстовом редакторе:


Как видим — вот оно наше время, вот в каком хитром формате хранится наша сессия, но мы можем внести правки, поменять время, или можем просто вписать любую строку, почему бы и нет:


Для преобразования этой строки в массив нужно воспользоваться функцией session_decode(), для обратного преобразования — session_encode() — это зовется сериализацией, вот только в PHP для сессий — она своя — особенная, хотя можно использовать и стандартную PHP сериализацию — пропишите в конфигурационной директиве session.serialize_handler значение php_serialize и будет вам счастье, и $_SESSION можно будет использовать без ограничений — в качестве индекса теперь вы сможете использовать цифры и специальные символы | и ! в имени (за все 10+ лет работы, ни разу не надо было :)

Напишите свою функцию, аналогичную по функционалу session_decode() , вот вам тестовый набор данных для сессии (для решения знаний регулярных выражений не требуется), текст для преобразования возьмите из файла вашей текущей сессии:

Так, что мы ещё не пробовали? Правильно — украсть «печеньки», давайте запустим другой браузер и добавим в него теже самые cookie. Я вам для этого простенький javascript написал, скопируйте его в консоль браузера и запустите, только не забудьте идентификатор сессии поменять на свой:


Вот теперь у вас оба браузера смотрят на одну и туже сессию. Я выше упоминал, что расскажу о способах защиты, рассмотрим самый простой способ — привяжем сессию к браузеру, точнее к тому, как браузер представляется серверу — будем запоминать User-Agent и проверять его каждый раз:

Добавьте в код проверку на IP пользователя, если проверка не прошла — удалите скомпрометированную сессию.

По шагам

А теперь поясню по шагам алгоритм, как работает сессия в PHP, на примере следующего кода (настройки по умолчанию):

  1. после вызова session_start() PHP ищет в cookie идентификатор сессии по имени прописанном в session.name — это PHPSESSID
  2. если нет идентификатора — то он создаётся (см. session_id()), и создаёт пустой файл сессии по пути session.save_path с именем sess_ , в ответ сервера будет добавлены заголовки, для установки cookie =
  3. если идентификатор присутствует, то ищем файл сессии в папке session.save_path :
    • не находим — создаём пустой файл с именем sess_ (идентификатор может содержать лишь символы из диапазонов a-z , A-Z , 0-9 , запятую и знак минус)
    • находим, читаем файл и распаковываем данные (см. session_decode()) в супер-глобальную переменную $_SESSION (файл блокируется для чтения/записи)
  4. когда скрипт закончил свою работу, то все данные из $_SESSION запаковывают с использованием session_encode() в файл по пути session.save_path с именем sess_ (блокировка снимается)
Задайте в вашем браузере произвольное значение куки с именем PHPSESSID , пусть это будет 1234567890 , обновите страницу, проверьте, что у вас создался новый файл sess_1234567890

А есть ли жизнь без «печенек»?

PHP может работать с сессией даже если cookie в браузере отключены, но тогда все URL на сайте будут содержать параметр с идентификатором вашей сессии, и да — это ещё настроить надо, но оно вам надо? Мне не приходилось это использовать, но если очень хочется — я просто скажу где копать:

А если надо сессию в базе данных хранить?


Для хранения сессии в БД потребуется изменить хранилище сессии и указать PHP как им пользоваться, для этой цели создан интерфейс SessionHandlerInterface и функция session_set_save_handler.
Отдельно замечу, что не надо писать собственные обработчики сессий для redis и memcache — когда вы устанавливаете данные расширения, то вместе с ними идут и соответствующие обработчики, так что RTFM наше всё. Ну и да, обработчик нужно указывать до вызова session_start() ;)
Реализуйте SessionHandlerInterface для хранения сессии в MySQL, проверьте, работает ли он.
Это задание со звёздочкой, для тех кто уже познакомился с базами данных.

Когда умирает сессия?

За время жизни сессии отвечает директива session.gc_maxlifetime. По умолчанию, данная директива равна 1440 секундам (24 минуты), понимать её следует так, что если к сессии не было обращении в течении заданного времени, то сессия будет считаться «протухшей» и будет ждать своей очереди на удаление.

Интересен другой вопрос, можете задать его матёрым разработчикам — когда PHP удаляет файлы просроченных сессий? Ответ есть в официальном руководстве, но не в явном виде — так что запоминайте:

Сборщик мусора (garbage collection) может запускаться при вызове функции session_start() , вероятность запуска зависит от двух директив session.gc_probability и session.gc_divisor, первая выступает в качестве делимого, вторая — делителя, и по умолчанию эти значения 1 и 100, т.е. вероятность того, что сборщик будет запущен и файлы сессий будут удалены — примерно 1%.

Измените значение директивы session.gc_divisor так, чтобы сборщик мусора запускался каждый раз, проверьте что это так и происходит.

Самая тривиальная ошибка

Ошибка у которой более полумиллиона результатов в выдаче Google:

Cannot send session cookie — headers already sent by
Cannot send session cache limiter — headers already sent

Для получения таковой, создайте файл session.error.php со следующим содержимым:

Во второй строке странная «магия» — это фокус с буфером вывода, я ещё расскажу о нём в одной из следующих статей, пока считайте это лишь строкой длинной в 4096 символов, в данном случае — это всё пробелы

Запустите, предварительно удалив cookie, и получите приведенные ошибки, хоть текст ошибок и разный, но суть одна — поезд ушёл — сервер уже отправил браузеру содержимое страницы, и отправлять заголовки уже поздно, это не сработает, и в куках не появилось заветного идентификатора сессии. Если вы стокнулись с данной ошибкой — ищите место, где выводится текст раньше времени, это может быть пробел до символов <?php , или после ?> в одном из подключаемых файлов, и ладно если это пробел, может быть и какой-нить непечатный символ вроде BOM, так что будьте внимательны, и вас сия зараза не коснется (как-же,… гомерический смех).

Для проверки полученных знаний, я хочу, чтобы вы реализовали свой собственный механизм сессий и заставили приведенный код работать:

Для осуществления задуманного вам потребуется функция register_shutdown_function()

Блокировка

Ещё одна распространённая ошибка у новичков — это попытка прочитать файл сессии пока он заблокирован другим скриптом. Собственно, это не совсем ошибка, это недопонимание принципа блокировки :)

Но давайте ещё раз по шагам:

  1. session_start() не только создаёт/читает файл, но и блокирует его, чтобы никто не мог внести правки в момент выполнения скрипта, или прочитать не консистентные данные из файла сессии
  2. блокировка снимается по окончанию выполнения скрипта

«Воткнутся» в данную ошибку очень легко, создайте два файла:

Теперь, если вы откроете в браузере страничку lock.php , а затем в новой вкладке откроете start.php то увидите, что вторая страничка откроется только после того, как отработает первый скрипт, который блокирует файл сессии на 10 секунд.

Есть пару вариантов, как избежать подобного явления — «топорный» и «продуманный».

«Топорный»
Использовать самописный обработчик сессий, в котором «забыть» реализовать блокировку :)
Чуть лучше вариант, это взять готовый и отключить блокировку (например у memcached есть такая опция — memcached.sess_locking) O_o
Потратить часы на дебаг кода в поисках редко всплывающей ошибки…

«Продуманный»
Куда как лучше — самому следить за блокировкой сессии, и снимать её, когда она не требуется:

— Если вы уверенны, что вам не потребуется вносить изменения в сессионные данные используйте опцию read_and_close при старте сессии:

Таким образом, блокировка будет снята сразу по прочтению данных сессии.

— Если вам таки нужно вносить изменения в сессию, то после внесения оных закрывайте сессию от записи:

Чуть выше был приведён листинг двух файлов start.php и lock.php , создайте ещё файлы read-close.php и write-close.php , в которых вы будете контролировать блокировку перечисленными способами. Проверьте как работает (или не работает) блокировка.

В заключение

В этой статье вам дано семь заданий, при этом они касаются не только работы с сессиями, но так же познакомят вас с MySQL и с функциями работы со строками. Для усвоения этого материала — отдельной статьи не нужно, хватит и мануала по приведенным ссылкам — никто за вас его читать не будет. Дерзайте!

От автора: обработка сессии PHP является ключевой концепцией языка, которая позволяет сохранять информацию пользователя на всех страницах веб-сайта или приложения. В этом посте вы узнаете основы обработки сессий в PHP.

Мы начнем с пояснения того, как работают сессии и как они связаны с файлами куки. Затем мы рассмотрим несколько фрагментов кода, демонстрирующих, как работать с сессиями. Вы узнаете, как создавать и удалять сессии и как изменять переменные сессии.

Что такое сессия в PHP?



Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

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

Сессия позволяет обмениваться информацией на разных страницах одного сайта или приложения, что помогает поддерживать состояние. Это позволяет серверу знать, что все запросы исходят от одного и того же пользователя, что дает возможность отображать информацию и настройки пользователя.

Поток авторизации с помощью сессий и файлов куки

Давайте кратко рассмотрим общий поток авторизации, чтобы понять, что происходит за кулисами.

Пользователь открывает страницу авторизации на сайте.

После отправки данных формы входа сервер на другом конце аутентифицирует запрос, проверив введенные учетные данные.

Если учетные данные, введенные пользователем, действительны, сервер создает новую сессию. Сервер генерирует уникальное случайное число, которое называется идентификатором сессии. Он также создает новый файл, который используется для хранения информации, относящейся к сессии.

Затем пользователю передается идентификатор сессии, а также любой запрошенный ресурс. За кулисами этот идентификатор сеанса отправляется в файле куки PHPSESSID в заголовке ответа.

Когда браузер получает ответ от сервера, он находит его в заголовке файла куки PHPSESSID. Если куки разрешены браузером, он сохранит этот файл PHPSESSID, в котором хранится идентификатор сессии, переданный сервером.

Для последующих запросов куки PHPSESSID возвращается на сервер. Когда сервер получает файл куки PHPSESSID, он попытается инициализировать сессию с этим идентификатором сессии. Он делает это, загружая файл сессии, который был создан ранее во время инициализации сессии. Затем он инициализирует переменную суперглобального массива $_SESSION с данными, хранящимися в файле сессии.


Теперь, когда мы кратко рассмотрели сессии, мы возьмем несколько практических примеров, чтобы продемонстрировать, как создавать и изменять переменные сессии.

Как начать сессию

В этом разделе мы рассмотрим, как в PHP начать сессию. Каждый раз, когда вы хотите работать с переменными сессии, вам необходимо убедиться, что сессия уже запущена. Есть несколько способов начать сессию в PHP.

Использовать функцию session_start

Это метод, который вы встретите чаще всего, когда сессия запускается функцией session_start.

kak-peredat-peremennuyu-php-v-html-i-obratno

Всем привет! 🙂

Сегодня я решил затронуть тему передачи переменных между бэкэндом и фронтэндом, с которой сталкиваются абсолютно все начинающие разработчики. В частности, сегодня мы рассмотрим примеры передачи переменных из PHP в HTML и обратно, а также их вызова в обоих случаях.

Идея этой статьи у меня появилась после поиска мною соответствующего материала в сети, после которого ничего путного найти не удалось.

Дело в том, что сегодня люди начинают своё знакомство с веб-программированием изучая разнообразные платформы: CMS, фрэймворки и т.д., в которых механизм передачи переменных реализован своим уникальным образом.

Где-то переменные бэкэнда записываются в глобальный массив, а в html-шаблонах вызываются оттуда. В других случаях используются шаблонизаторы, типа Smarty, со своими механизмами передачи данных. В данной ситуации всё зависит от фантазии разработчика.

Но всё же, иногда такая необходимость появляется, причём не только у начинающих, но и у опытных юзеров.

Кому может быть полезно понимание механизма передачи данных из PHP в HTML и обратно?

Представьте, что вы захотели написать собственный движок 🙂 Тем более, что рано или поздно, в учебных целях или коммерческих за такую работу принимается больше половины программистов Земного шара.

Или, к примеру, вас не устраивает используемый в вашем проекте шаблонизатор (программная надстройка, позволяющая минимизировать содержание бизнес-логики в графических шаблонах, т.е. убирать из html php-конструкции, ограничиваясь только вызовом переменных, функций и файлов), и вы решили написать собственный.

Ну, про новичков, которые только начинают работать с PHP и HTML, о ценности рассматриваемого сегодня вопроса я вообще умолчу.

Как передать переменные PHP в HTML?

Для примера создадим простенький тестовый скрипт index.php:

В результате, при запуске скрипта в вашем веб-браузере вы увидите следующий результат:

peredacha-peremennoj-php-v-html

Как передать массив PHP в HTML?

Передачу простых переменных мы рассмотрели. А как насчёт массивов, можете спросить вы? Действительно, передача массивов также весьма востребована в случаях, когда необходимо в HTML вывести списки объектов из PHP.

В качестве примера, видоизменим наш PHP-скрипт, сделав из переменной $hello массив:

В данном случае описанный нами способ вызова переменной PHP в HTML выдаст следующий результат:

peredacha-massiva-php-v-html

Содержимое массива можно просмотреть, выводя его элементы в цикле. Для этого немного видоизменим наш HTML-шаблон:

В результате, после повторного запуска скрипта в веб-браузере, на экране мы увидим следующее:

vyvod-dannyh-massiva-php-v-html

Т.е., подводя краткое резюме под написанным ранее, для передачи переменной из PHP в HTML, HTML-документ должен быть подключён в PHP с помощью директив include или require, после чего объявленные в скрипте переменные будут доступны в шаблоне.

Передача данных из HTML в PHP

Для данного действия нам потребуется разместить данные в HTML внутри формы, т.е. внутри открывающего и закрывающего тэгов <form></form>. Для этого используем другой тестовый пример, файл index.html которого будет выглядеть так:

Немного комментариев по поводу передачи в PHP данных HTML-форм (если вдруг кто не в курсе). HTML-формы, как уже было сказано, представляют из себя пару тэгов <form></form>, между которыми располагаются элементы формы, представляющие собой тэги <input> (закрывающий тэг не требуется) со следующими атрибутами:

Тэги <input> также могут быть заменены и дополнены специализированными тэгами <button>, <textarea> и т.д., у которых будут присутствовать те же атрибуты, что и у <input>.

Напомню, что структура данного тестового сайта такая же: каталог с HTML-документом, содержащим интерфейс для взаимодействия пользователя с сайтом и PHP-скрипт, который его вызывает. Последний будет иметь следующий вид:

peredacha-dannykh-v-php-s-pomoschyu-html-formy

Далее в PHP можете обрабатывать данные так как вам захочется 🙂

Данные, переданные любым из указанных способов также могут быть доступны через массив $_REQUEST, который помимо помимо содержимого массивов $_GET и $_POST также может содержать данные суперглобального массива $_COOKIE, который содержит данные, сохранённые в cookie-файлах (известные в Рунете куки) вашего браузера.

Также, до версии PHP 4.3, в данном массиве содержались ещё и данные о передаваемых через HTML-форму файлах из массива $_FILES, но они были выделены в отдельный массив.

Таким образом, сегодня мы рассмотрели механизм взаимодействия путём передачи данных между HTML и PHP, бэкэндом и фронтэндом ваших сайтов.

Надеюсь, что информация была для вас полезной 🙂 Жду ваши отзывы в комментариях под статьёй и подписки на обновления сайта, чтобы вы были в курсе новых статей.

Также, пользуясь случае, хочу всех вас пригласить в паблик нашего проекта Вконтакте для обсуждения волнующих вас вопросов. Также здесь вы всегда найдёте массу увлекательных статей, конкурсов и весёлой информации, которая сделает вас на шаг ближе к сайту своей мечты.

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

56 комментариев к статье "Как передать переменную PHP в HTML и обратно?"

Огромное спасибо за информацию!
Только начинаю разбираться с PHP.
У меня сайт на чистом html с использованием ssi.
И я задумал сделать для него микроразметку для рейтинга google и поисковых сайтов.
Как раз понадобилось чтение базы данных.

Здравствуйте! У меня к Вам два вопроса:

Проблемы поисковиков с JS-кодом наблюдались всегда) Поскольку JS выполняется динамически, а робот поисковой системы сканирует лишь HTML-код страницы, то вполне возможно, что JS-переменная не будет восприниматься.

Пытаюсь понять web-программирование. Пока не очень.
Есть задача: периодически, раз в 5 минут запрашивать из клиентского Js-скрипта несколько переменных у серверного скрипта на PHP и разместить их в нужные текстовые поля. Данные PHP-скрипт должен взять из БД Access.
Как это можно сделать?

В вашем случае вам понадобится технология AJAX, с помощью которой вы будете без перезагрузки страницы отправлять запросы из JS кода в PHP скрипт и обрабатывать ответ от него. Конкретно в вашем случае нужно будет создать html документ с формой и полями, в котором будет подключаться js файл, например, так:

В JS файле будет производиться AJAX запрос по таймауту в 5 минут (5*60*1000 милисекунд) с помощью функции setInterval следующим образом:

В моём примере отправляется запрос типа POST к скрипту script.php, который лежит на одном уровне с js файлом. В нём-то у вас и будет производиться выборка данных из БД. Сам скрипт будет выглядеть примерно следующим образом:

Я сделал запись в переменные случайных значений. У вас же вместо них будет информация из базы данных сайта. Надеюсь, что я доступно объяснил 🙂

Спасибо за ответ.
У меня не работают 2 последних строки в php:

Как я понимаю, в первой строке должно производиться присвоение переменной $result строки, а что делает вторая, не понимаю. По идее, формат json_encode должен что-то преобразовать во что-то, понятное браузеру.

Как именно вы поняли, что строки не работают?

В моём случае кнопка отправки данных на сервер не нужна. Нужны просто поля, в которые сервер будете пересылать данные.
Как видите, мне очень сложно понять даже простые вещи.

Не переживайте вы так сильно 🙂 Ничего страшного же не произошло 🙂

Ошибка PHP связана, скорее всего, с тем, что вы используете невероятно устаревшую версию PHP на вашем веб-сервере: php version 3.0.

Не знаю, по каким мануалам вы устанавливали и настраивали локальный веб-сервер, но сейчас актуальная рабочая версия PHP 7.1, поэтому некоторые синтаксические конструкции и вызывают ошибки в вашем случае. Я лично рекомендую использовать для локальной разработки OpenServer, если вы работаете под Windows, т.к. сам им пользуюсь и не нарадуюсь 🙂

И да, script2.php не нужно было менять на script.php, т.к. таким образом я хотел как раз сделать акцент, что для обработки запроса, отправленного с помощью формы, нужен другой скрипт, отличный от того, что получает данные из БД в вашем случае и генерирует случайные числа в моём.

Да и вообще, если вам просто нужно будет мониторить данные без их изменения, то сверстайте простую страничку с текстовыми блоками без форм, как в моём примере. Тогда никто никого не будет сбивать с толку.

В последних инфа на английском, но, зато более полезная с практической точки зрения 🙂

И если вы до сих пор пытаетесь использовать чистый PHP, то зря. Поставьте уже OpenServer или, если не нравится, XAMPP. Готовую WAMP сборку, одним словом.

У меня у самого старый комп больше Windows XP не тянул, так благодаря OpenServer спокойно себе работал с PHP 7.

The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.

Если снова будут проблемы, то назовите каталог с файлами сайта в формате типа test.site или test.local, чтобы это было похоже на доменное имя.

1. Честно говоря, я не знаю точно, как именно браузеры обрабатывают JS код в данной ситуации, никогда не копался в данном вопросе. Могу только высказать своё предположение, что при обработке HTML кода браузер переходит по всем ссылкам, указанным в нём и скачивает файлы, помещая себе их в кэш, подключая их потом на страницу виртуально.

Доброго времени суток всем посетителям сайта. У меня такой вопрос я только начинаю изучать РНР и пытаюсь ставить себе какие-то задачи, вот решил написать простой конвектор но столкнулся с вопросом как вернуть данные в туже самую html форму с которой получил значения.

В вашем случае поможет Javascript и AJAX запрос. С его помощью будете отправлять данные на сервер при подтверждении формы (нажатие на кнопку с типом submit) из JavaScript кода, а когда сервер вернёт ответ, вставите результаты обратно в форму.

Примеры кода для отправки AJAX запроса на чистом JavaScript (без всякого jQuery, хотя с ним и проще) можете найти в комментариях к этой статье выше.

У Вас проблема не с версией PHP, а с путём к файлу script.php. Пропишите его правильно. Если сложно написать правильно относительный url, воспользуйтесь для начала абсолютным, а потом подберите относительный вариант.

Пожалуйста 🙂 Рад был помочь 🙂

HTML файл почему-то не отобразился.

Главное, что у вас всё получилось 🙂 Надеюсь, работу с БД осилили?

Опять не отобразилось.
Вспомнил про резервную почту. Кажется, вложение отправилось.

Текст из div в переменную php, как сделать?

Честно говоря, не понял сути вопроса. Напишите подробнее, что вы хотите сделать?

Приветик! Оговорюсь сразу, может я, опубликовала тему не совсем не по теме сайта, но тем неменее, разбирающиеся пользователи должны быть.
На днях был спор с близкой подругой, что смогу сделать ресурс и за полгода я смогу вывести его в топ 10 поисковиков и получать трафик не ниже 500 уникальных посетителей. Но, проблема в том, что я не понимаю в этом деле, а спор проигрывать нельзя. Отсюда к вам просьба, для тех, кто понимает, сколько может стоить такой сайт под ключ, который выше.
А главное, за какую цену вы могли взяться и сделать такой сайт? Много денег у меня к сожалению нет, но, какую-то сумму за работу заплатить смогу.
Если вы можете взяться за это дело, напишите в ЛС, оповещения читаю
Если я вам не ответила, то, цена меня не устраивает.
Модераторы, если не в тот раздел написала, перенесите по тематике или в раздел свободного общения, заранее спасибо.

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

Если вы, конечно, не испугаетесь 🙂

1. Добавить внутрь тэгов form следующий элемент:

Он будет скрытым, т.е. визуально на странице пользователь его не увидит, но текст, содержащийся в value, будет присутствовать в массиве $_REQUEST в PHP в скрипте обработчика формы.

2. Сделать отправку формы с помощью JavaScript и AJAX запроса, прочитав значение нужного тэга там же и передав его PHP скрипту.

Второй вариант предпочтительнее, но если не знаете, как отправлять AJAX запросы, то воспользуйтесь первым (он не совсем рекомендуется по причине дублирования контента страницы, на что могут обратить внимание поисковики).

Извините. Я новичок и много не понимаю. Если не тяжело, объясните все в том коде о вызове значений массива post. Зарание спасибо)

Добрый вечер 🙂 Отвечу вам на примере, который я написал в ответ одному из подписчиков в ВК паблике. Пользуясь случаем, хочу Вас также пригласить в сообщество, где вы всегда сможете получить ответ на все интересующие вопросы, связанные с разработкой сайтов.

Допустим, Вам нужно добавить поле для отправки email на контактную форму. Для этого Вы в HTML код формы (между тэгами form) вставляете следующее:

Открывающий тэг form расширяете этими атрибутами (или дополняете этими атрибутами, если их не было):

Добавляете в корень сайта файл email_send.php и в нём уже сможете получить email, введённый с HTML формы, в массиве $_POST или $_REQUEST внутри переменной email. Для проверки можете вывести его содержимое на экран следующей конструкцией:

Значение переменной сможете использовать следующим образом в коде:

Здравствуйте. Прочитал статью, очень увлекательно. Хоть ничего и не понял. А попал к вам случайно, ищу в инете как перенести плагин для вордпресс на сайт html. Может здесь подскажете. Есть плагин калькулятор wpcc на его основе сделал калькулятор с большим количеством полей. На сайте с вордпресс все отлично работает, а как мне установить (добавить) этот калькулятор на сайт чистый html. Только здесь вижу что понимаете, на других сайтах или тупая перепечатка или для продвинутых. Мне бы понять с чего начать, если моя идея осуществила.
Спасибо.

Добрый день. То, что Вы хотите реализовать, естественно выполнимо 🙂 По сути Вам нужно будет заменить все WordPress-функции (как правило, их имена начинаются с wp_) на аналогичные, написанные на чистом PHP, либо вообще отказаться от их использования.

Также можете просто найти объявления данных функций в ядре самого WordPress (пройдитесь поиском по файлам вашего ВП сайта) и скопировать их к себе на чистый html-сайт.

Функции описываются в одном месте, а в другом вызываются.

Вот пример описания функции:

Функции вызываются по имени с указанием аргументов, необходимых для её работы. Вот пример вызов функции в PHP:

Данная демо функция в месте её вызова вернёт строку 1 and 2 and 3.

Возвращаясь к Вашему примеру, вам нужно будет найти в коде модуля вызовы стандартным ВП функций, а затем в коде поиском найти их объявления. И найденные объявления функций Вам нужно будет перенести на свой PHP+HTML сайт в отдельный PHP-файл (для начала можно в index.php, который OpenServer вызывается по умолчанию при вызове доменного имени сайта в браузере).

Внизу этого файла вставьте скопированное описание функции из WordPress, а затем в коде выше вызовите её, выводя полученные с её помощью данные в HTML, который в обработанном виде будет отображаться браузером.

Но это самый примитивный вариант. В реальных PHP приложениях код разбит на множество файлов, каждый из которых представляет отдельный класс с набором функций. В других файлах данные классы подключаются и функции вызываются по имени класса, который необходим. С этим вы можете столкнуться в WordPress.

Надеюсь, Вам ответил.

Понял, что ничего не понял. Уяснил себе, чтобы вести разговор нужно знать хотя бы основы предмета))) Начинаю изучать их. Пока сделал следующее: установил плагин из репозитория на последнюю версию вордпресс, стал (не конфликтует). Скачал себе на комп его, посмотрел внутрь, там 1 файл php (как понимаю основной)+css+js (как встроенные, так и со сторонних библиотек). Я могу писать не языком программиста, прошу прощения. Пройдусь по файлу php и по кодексу вордпресс. Если интересно, что будет дальше, могу оставлять отчеты здесь)))
Хорошего дня.

Приветствую 🙂 Если время обновляется в режиме realtime, то то реализуется с помощью JavaScript. Если дата просто присваивается при загрузке страницы, то её получение происходит на бэкенде (PHP например) и это значение вставляется в HTML код, который на бэкенде и рендерится.

Но я лично не делаю ни первым, ни вторым способом. Если нужно получить текущую дату для фиксации её в базе данных, то это нужно делать на бэкенде уже при получении данных формы и перед записью обработанной информации в базу.

Да, пишите. Постараюсь помочь 🙂

Заранее благодарю.
С уважением.

Здравствуйте! Подскажите а как передать данные через форму кнопки а не через текст. Пример задачи: Тестирование где есть вопрос и несколько вариантов ответа

Здраствуйте!
Я новичок, масса информации, трудно разобраться.
Какой инструментарий должен быть применен, чтобы:
функция пшп include затягивала в место, где она стоит в коде html, тексты из n-ного количества внешних файлов (которые в папке, а не в БД) динамически, т.е. не по загрузке сайта, а по нажатию на соответствующую кнопку или эллемент меню.
Еще то же, но по другому: страница загружается, посетитель сайта видит ниспадающее меню, кликает по выбранному элементу меню и на этой же странице без перезагрузки в небольшом окошке (как в случае с фреймом) появляется нужный текст. Как это сделать?
Сессия нужна или нет?
Запросы Get/Post уместны или не по теме?
Формы html обязательны или достаточно кнопок?
Без ajax только js посредством функции document.write можно обойтись?

Читайте также: