Простой RESTful-сервис на нативном PHP. Всеобъемлющая история шаблонов Недомыслие user info php

Суперглобальный массив $_SERVER

Одним из важнейших предопределённых массивов является массив $_SERVER - в него PHP-интерпретатор помещает переменные, полученные от сервера. Без данных переменных сложно организовать полноценную поддержку Web-приложений. Ниже приводится описание наиболее важных элементов суперглобального массива $_SERVER.

Замечание

Просмотреть полный список элементов массива $_SERVER можно либо при помощи функции print_r(), которая распечатывает дамп массива либо при помощи функции phpinfo(), которая выводит информацию о PHP-интерпретаторе.

Элемент $_SERVER["DOCUMENT_ROOT"]

Элемент $_SERVER["DOCUMENT_ROOT"] содержит путь к корневой директории сервера, если скрипт выполняется в виртуальном хосте, в данном элементе указывается путь к корневой директории виртуального хоста. Т.е. в конфигурационном файле httpd.conf виртуальный хост имеет директиву DocumentRoot, которой присвоено значение "D:/main", элемент $_SERVER["DOCUMENT_ROOT"] будет содержать значение "D:main".

Элемент $_SERVER["HTTP_ACCEPT"]

В элементе $_SERVER["HTTP_ACCEPT"] описываются предпочтения клиента относительно типа документа. Содержимое этого элемента извлекается из HTTP-заголовка Accept, который присылает клиент серверу. Содержимое данного заголовка может выглядеть следующим образом

image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*

Заголовок Accept позволяет уточнить медиа-тип, который предпочитает получить клиент в ответ на свой запрос. Этот заголовок позволяет сообщить серверу, что ответ ограничен небольшим множеством предпочитаемых типов.

Символ * используется для группирования типов в медиа-ряду. К примеру, символом */* задается использование всех типов, а обозначение type/* определяет использование всех подтипов выбранного типа type.

Замечание

Медиа-типы отделяются друг от друга запятыми.

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

Замечание

По умолчанию параметр q принимает значение 1. Кроме того, от медиа-типа он отделяется точкой с запятой.

Пример заголовка типа Accept:

Accept: audio/*; q=0.2, audio/basic

В данном заголовке первым идёт тип audio/* включающий в себя все музыкальные документы и характеризующийся коэффициентом предпочтения 0.2. Через запятую указан тип audio/basic, для которого коэффициент предпочтения не указан и принимает значение по умолчанию равное единице. Цитируя RFС2616 данный заголовок можно интерпретировать следующим образом: “Я предпочитаю тип audio/basic, но мне можно также слать документы любого другого audio-типа, если они будут доступны, после снижения коэффициента предпочтения более чем на 80 %”.

Пример может быть более сложным.

Accept: text/plain; q=0.5, text/html,
text/x-dvi; q=0.8, text/x-c

Замечание

Следует учитывать, что элемент $_SERVER["HTTP_ACCEPT"] содержит точно такую же информацию, но без начального заголовка Accept.

Этот заголовок интерпретируется следующим образом: Типы документов text/html и text/x-c являются предпочтительными, но если они недоступны, тогда клиент отсылающий данный запрос, предпочтёт text/x-dvi, а, если и его нет, то он может принять тип text/plain.

Элемент $_SERVER["HTTP_ACCEPT_LANGUAGE"]

В элементе $_SERVER["HTTP_ACCEPT_LANGUAGE"] описываются предпочтения клиента относительно языка. Данная информация извлекается из HTTP-заголовка Accept-Language, который присылает клиент серверу. Можно привести следующий пример:

Accept-Language: ru, en; q=0.7

Который можно интерпретировать следующим образом: клиент предпочитает русский язык, но в случае его отсутствия согласен принимать документы на английском. Элемент $_SERVER["HTTP_ACCEPT_LANGUAGE"] будет содержать точно такую же информацию, но без заголовка Accept-Language:

ru, en; q=0.7

Содержимое элемента $_SERVER["HTTP_ACCEPT_LANGUAGE"] можно использовать для определения национальной принадлежность посетителей. Однако результаты будут приблизительными, так как многие пользователи используют английские варианты браузеров, которые будут извещать сервер о том, что посетитель предпочитает лишь один язык - английский.

Элемент $_SERVER["HTTP_HOST"]

В элементе $_SERVER["HTTP_HOST"] содержится имя сервера, которое, как правило, совпадает с доменным именем сайта, расположенного на сервере. Как правило, имя, указанное в данном параметре совпадает с именем $_SERVER["SERVER_NAME"]. В параметре приводится лишь доменное имя без названия протокола (http://), т.е.

www.sofftime.ru

Элемент $_SERVER["HTTP_REFERER"]

В элементе $_SERVER["HTTP_REFERER"] приводится адрес страницы, с которой посетитель пришёл на данную страницу. Переход должен осуществляться по ссылке. Создадим две страницы index.php и page.php.

Страница index.php

echo "Ссылка на страницу PHP
"
;
echo .
$_SERVER [ "HTTP_REFERER" ]
?>

Страница page.php будет аналогичного содержания, но ссылка будет указывать на страницу index.php.

Страница page.php

echo "Ссылка на страницу PHP
"
;
echo "Содержимое $_SERVER["HTTP_REFERER"] - " .
$_SERVER [ "HTTP_REFERER" ]
?>

При переходе с одной страницы на другую, под ссылкой будет выводится адрес страницы, с которой был осуществлён переход.

Элемент $_SERVER["HTTP_USER_AGENT"]

Элемент $_SERVER["HTTP_USER_AGENT"] содержит информацию о типе и версии браузера и операционной системы посетителя.

Вот типичное содержание этой строки: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)". Наличие подстроки "MSIE 6.0" говорит о том, что посетитель просматривает страницу при помощи Internet Explorer версии 6.0. Строка "Windows NT 5.1" сообщает, что в качестве операционной системы используется Windows XP.

Замечание

Для Windows 2000 элемент $_SERVER["HTTP_USER_AGENT"] выглядит следующим образом: "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)")", в то время как для Windows XP - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)".

Если посетитель воспользуется браузером Opera, то содержание $_SERVER["HTTP_USER_AGENT"]может выглядеть следующим образом: "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) Opera 6.04 ". Подстрока "MSIE 6.0" здесь так же присутствует, сообщая, что браузер Opera является совместимым с браузером Internet Explorer и использует те же динамические библиотеки Windows. Поэтому, при анализе строки, возвращаемой браузером, следует иметь в виду, что к Internet Explorer относится строка, содержащая подстроку "MSIE 6.0" и не содержащая подстроки "Opera". Кроме того, из данной строки можно заключить, что пользователь использует операционную систему Windows 98.

Замечание

Пользовательский агент браузера Firefox может выглядеть следующим образом Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5.

При использовании браузера Netscape, содержание элемент $_SERVER["HTTP_USER_AGENT"] может выглядеть следующим образом: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1". Принадлежность к этому браузеру можно определить по наличию подстроки "Netscape". Кроме того, можно узнать, что посетитель выходит в Интернет, используя операционную версию Linux, с ядром, оптимизированным под Pentium IV, находясь в графической оболочке X-Window. Этот механизм удобно использовать для сбора статистической информации, которая позволяет дизайнерам оптимизировать страницы под наиболее распространенные браузеры.

Элемент $_SERVER["REMOTE_ADDR"]

В элемент $_SERVER["REMOTE_ADDR"] помещается IP-адрес клиента. При тестировании на локальной машине - этот адрес будет равен 127.0.0.1. Однако при тестировании в сети переменная вернёт IP-адрес клиента или последнего прокси-сервера через который клиент попал на сервер. Если клиент использует прокси-сервер узнать его IP-адрес можно при помощи переменной окружения HTTP_X_FORWARDED_FOR, значение которой можно получить при помощи функции getenv().

Замечание

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

Извлечение переменной окружения HTTP_X_FORWARDED_FOR

echo getenv (HTTP_X_FORWARDED_FOR );
?>

Элемент $_SERVER["SCRIPT_FILENAME"]

В элемент $_SERVER["SCRIPT_FILENAME"] помещается абсолютный путь к файлу от корня диска. Так, если сервер работает под управлением операционной системы Windows, то такой путь может выглядеть следующим образом "d:main estindex.php", т.е. путь указывается от диска, в UNIX-подобной операционной системы путь указывается от корневой директории /, например "/var/share/www/test/index.php".

Элемент $_SERVER["SERVER_NAME"]

В элемент $_SERVER["SERVER_NAME"] помещается имя сервера, как правило, совпадающее с доменным именем сайта, расположенного на нём. Например,

www.softtime.ru

Содержимое элемента $_SERVER["SERVER_NAME"] часто совпадает с содержимым элемента $_SERVER["HTTP_HOST"]. Помимо имени сервера суперглобальный массив $_SERVER позволяет выяснить ещё ряд параметров сервера, например IP-адрес сервера, прослушиваемый порт, какой Web-сервер установлен и версию HTTP протокола. Эта информация помещается в элементы $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] и $_SERVER["SERVER_PROTOCOL"], соответственно. Ниже приводится пример с использованием данных элементов.

Использование элементов массива $_SERVER

echo "Имя сервера - " . $_SERVER [ "SERVER_NAME" ]. "
" ;
echo "IP-адрес сервера - " . $_SERVER [ "SERVER_ADDR" ]. "
" ;
echo "Порт сервера - " . $_SERVER [ "SERVER_PORT" ]. "
" ;
echo "Web-сервер - " . $_SERVER [ "SERVER_SOFTWARE" ]. "
" ;
echo "Версия HTTP-протокола - " . $_SERVER [ "SERVER_PROTOCOL" ]. "
" ;
?>

Элемент $_SERVER["REQUEST_METHOD"]

В элемент $_SERVER["REQUEST_METHOD"] помещается метод запроса, который применяется для вызова скрипта: GET или POST.

Получает объект WP_User, который содержит все данные указанного пользователя.

Данные, возвращаемые функций полностью соответствуют полям таблиц БД: wp_users и wp_usermeta (описание таблиц ).

Это pluggable функция - т.е. её можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена... Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init .

Замена функции (переопределение) - в плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.

✈ 1 раз = 0.000296с = быстро | 50000 раз = 0.78с = очень быстро | PHP 7.1.2RC1, WP 4.7.2

Хуков нет.

Возвращает

WP_User/false. Объект данных или false, если не удалось найти указанного пользователя.

Использование

get_userdata($userid); $userid(число) (обязательный) ID пользователя, данные которого нужно получить.
По умолчанию: нет

Примеры

#1 Как выводить данные из полученного объекта данных

$user_info = get_userdata(1); echo "Имя пользователя: " . $user_info->user_login . "\n"; echo "Уровень доступа: " . $user_info->user_level . "\n"; echo "ID: " . $user_info->ID . "\n"; /* Выведет: Имя пользователя: admin Уровень доступа: 10 ID: 1 */

#1.2 Данные в переменную

Еще одни пример, только тут запишем данные сначала в переменные, а затем выведем из на экран:

$user = get_userdata(1); $username = $user->user_login; $first_name = $user->first_name; $last_name = $user->last_name; echo "$first_name $last_name зашел(а) на сайт под логином: $username."; /* Объект $user: WP_User Object( => stdClass Object( => 80 => kogian => $P$BJFHKJfUKyWv1TwЛОВАЕnYU0JGNsq. => kogian => [email protected] => http://example.com/ => 2016-09-01 00:34:42 => => => kogian) => 80 => Array( => 1) => wp_capabilities => Array( => subscriber) => Array( => 1 => 1 => 1) => => 1) */

#2 Методы класса

Получаемый объект с помощью get_userdata() - это экземпляр класса и у него есть методы, которые можно использовать. Иногда это может пригодится. Вот простой пример получения опции пользователя, с помощью метода $user->get() :

$user = get_userdata(1); echo $username = $user->get("user_login");

Список некоторых методов:

    get($key) - вернет значение опции;

    has_prop($key) - проверяет установлена ли указанная опция;

    has_cap($cap) - проверяет имеет ли пользователь указанную возможность или роль;

    get_role_caps() - получает все возможности роли пользователя и объединяет их с индивидуальными возможностями пользователя;

    add_role($role) - добавляет роль к пользователю;

    remove_role($role) - удаляет роль у пользователя;

  • set_role($role) - устанавливает роль пользователя;

Заметки

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

  • display_name

user_meta

  • user_description

    wp_capabilities (массив)

    admin_color (тема админ панели. По умолчанию - свежая (fresh))

    closedpostboxes_page

  • source_domain

Также надо отметит, что с версии 3.2., возвращаемые данные немного изменились: возвращается объект WP_User . Данные в объекте разбиваются на группы: data , caps , roles (раньше данные возвращались в общем списке).

Однако, благодаря "волшебным" (служебным) методам PHP данные можно получить как и прежде, например, сейчас данные хранятся так: get_userdata(1)->data->rich_editing , но получить их можно так: get_userdata(1)->rich_editing , несмотря на то, что var_dump() не покажет эту взаимосвязь.

Код get userdata : wp-includes/pluggable.php WP 5.2.2

Во втором уроке мы напишем еще два класса и полностью закончим внутреннюю часть скрипта.

План

Цель серии уроков создать простое приложение, которое позволяет пользователям регистрироваться, входить, выходить и менять настройки. Класс, который будет содержать всю информации о пользователе будет называться User и он будет определен в файле User.class.php. Класс, который будет отвечать за вход\выход будет называться UserTools (UserTools.class.php).

Немного про именование классов

Правильным тоном является называть файлы с описанием класса таким же именем как и сам класс. Таким образом легко определить цель каждого файла в папке с классами.

Также обычно в конце названия файла класса добавляют.class или.inc. Таким образом мы четко определяем предназначение файла и можем с помощью.htaccess ограничить доступ к этим файлам.

Класс Пользователей (User.class.php)

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

Конструктор

В этом классе мы будем использовать конструктор - это функция, которая автоматически вызывается при создании очередной копии класса. Это позволяет нам автоматически публиковать некоторые атрибуты после создания проекта. В этом классе конструктор будет брать единственный аргумент: ассоциативный массив, который содержит один ряд из таблицы users нашей БД.

require_once "DB.class.php"; class User { public $id; public $username; public $hashedPassword; public $email;
public $joinDate;
//Конструктор вызывается при создании нового объекта //Takes an associative array with the DB row as an argument. function __construct($data) { $this->id = (isset($data["id"])) ? $data["id"] : ""; $this->username = (isset($data["username"])) ? $data["username"] : ""; $this->hashedPassword = (isset($data["password"])) ? $data["password"] : ""; $this->email = (isset($data["email"])) ? $data["email"] : ""; $this->joinDate = (isset($data["join_date"])) ? $data["join_date"] : ""; }
public function save($isNewUser = false) { //create a new database object. $db = new DB(); //if the user is already registered and we"re //just updating their info. if(!$isNewUser) { //set the data array $data = array("username" => ""$this->username"", "password" => ""$this->hashedPassword"",
"email" => ""$this->email"");
//update the row in the database $db->update($data, "users", "id = ".$this->id); }else { //if the user is being registered for the first time. $data = array("username" => ""$this->username"", "password" => ""$this->hashedPassword"", "email" => ""$this->email"", "join_date" => """.date("Y-m-d H:i:s",time())."""); $this->id = $db->insert($data, "users"); $this->joinDate = time(); } return true; } } ?>

Объяснение

Первая часть кода, вне зоны класса, обеспечивает подключение класса в БД (поскольку в классе User есть функция, которая требует этот класс).

Вместо переменных класса “protected” (использовались в 1-м уроке) мы определяем их как “public”. Это означает, что любой код вне класса имеет доступ к этим переменным при работе с объектом User.

Конструктор берет массив, в котором колонки в таблице являются ключами. Мы задаем переменную класса используя $this->variablename. В примере данного класса, мы прежде всего проверяем существует ли значение определенного ключа. Если да, тогда мы приравниваем переменную класса к этому значению. В противном случае - пустая строка. Код использует краткую форму записи оборота if:

$value = (3 == 4) ? "A" : "B";

В данном примере мы проверяем равняется ли 3 четырем! Если да - тогда $value = “A”, нет - $value = “B”. В нашем примере результат $value = “B”.

Сохраняем Информацию о Пользователях в БД

Функция сохранения используется для внесения изменений в таблицу БД с текущими значениями в объекте User. Эта функция использует класс БД, который мы создали в первом уроке. Используя переменные класса, устанавливается массив $data. Если данные о пользователе сохраняются впервые, тогда $isNewUser передается как $true (по умолчанию false). Если $isNewUser = $true, тогда вызывается функция insert() класса DB. В противном случае вызывается функция update(). В обоих случаях информация от объекта user будет сохранена в БД.

Класс UserTools.class.php

Этот класс будет содержать функции, которые имеют отношение к пользователям: login(), logout(), checkUsernameExists() и get(). Но с расширением данного приложения, Вы можете добавить еще множество других.

//UserTools.class.php require_once "User.class.php"; require_once "DB.class.php";
class UserTools {
//Log the user in. First checks to see if the //username and password match a row in the database. //If it is successful, set the session variables //and store the user object within.
public function login($username, $password)
{
$hashedPassword = md5($password); $result = mysql_query("SELECT * FROM users WHERE username = "$username" AND password = "$hashedPassword""); if(mysql_num_rows($result) == 1) { $_SESSION["user"] = serialize(new User(mysql_fetch_assoc($result))); $_SESSION["login_time"] = time(); $_SESSION["logged_in"] = 1; return true; }else{ return false; } }
//Log the user out. Destroy the session variables. public function logout() { unset($_SESSION["user"]); unset($_SESSION["login_time"]); unset($_SESSION["logged_in"]); session_destroy(); } //Check to see if a username exists. //This is called during registration to make sure all user names are unique. public function checkUsernameExists($username) { $result = mysql_query("select id from users where username="$username""); if(mysql_num_rows($result) == 0) { return false; }else{ return true; }
}
//get a user //returns a User object. Takes the users id as an input public function get($id) { $db = new DB(); $result = $db->select("users", "id = $id"); return new User($result); } }
?>

Функция login()

Функция login() понятна по названию. Она берет аргументы пользователя $username и $password и проверяет их соответствие. Если все совпадает, создает объект User со всей информацией и сохраняет его в сессии. Обратите внимание, что мы только используем функцию PHP serialize(). Она создает сохраненный вариант объекта, который можно легко отменить с помощью unserialize(). Также время логина будет сохранено. Это может использоваться в дальнейшем для предоставления пользователям информации о длительности пребывания на сайте.

Вы также можете заметить, что мы выставляем $_SESSION["logged_in"] на 1. Это позволяет нам легко проверить на каждой странице залогинен ли пользователь. Достаточно проверить только эту переменную.

Функция logout()

Также простая функция. Функция PHP unset() очищает переменные в памяти, в то время как session_destroy() удалит сессию.

Функция checkUsernameExists()

Кто знает английский легко поймет функцию. Она просто запрашивает БД, использован ли подобный логин или нет.

Функция get()

Эта функция берет уникальный id пользователя и делает запрос к БД с помощью класса DB, а именно функции select(). Она возьмет ассоциативный массив с рядом информации о пользователе и создаст новый объект User, передавая массив конструктору.

Где можно это использовать? К примеру, если Вы создадите страницу, которая должна отображать специфические профили пользователей, Вам необходимо будет динамически брать эту информацию. Вот так Вы можете это сделать: (допустим УРЛ http://www.website.com/profile.php?userID=3)

//note: you will have to open up a database connection first. //see Part 1 for further information on doing so. //You"ll also have to make sure that you"ve included the class files.
$tools = new UserTools(); $user = $tools->get($_REQUEST["userID"]); echo "Username: ".$user->username.""; echo "Joined On: ".$user->joinDate."";

Легко! Правда?

Последний штрих серверной части: global.inc.php

global.inc.php необходим для каждой страницы сайта. Почему? Таким образом мы разместим все обычные операции, которые нам понадобятся на странице. К примеру, мы начнем session_start(). Соединение с БД также откроется.

require_once "classes/UserTools.class.php";
require_once "classes/DB.class.php";
//connect to the database $db = new DB(); $db->connect();
//initialize UserTools object $userTools = new UserTools(); //start the session
session_start();
//refresh session variables if logged in if(isset($_SESSION["logged_in"])) { $user = unserialize($_SESSION["user"]); $_SESSION["user"] = serialize($userTools->get($user->id)); } ?>

Что он делает?

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

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

Далее мы проверяем залогинен ли юзер. Если да - мы обновим $_SESSION["user"], чтобы отображать самую последнюю информацию о юзере. К примеру, если пользователь меняет свой емейл, в сессии будет храниться еще старый. Но с помощью авто обновления такого не случится.

На этом вторая часть подошла к концу! Завтра ожидайте заключительный урок по этой теме.

Всего наилучшего!

Последние материалы раздела:

Как полностью удалить драйвер из системы Windows
Как полностью удалить драйвер из системы Windows

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

Как изменить на безлимитный тариф
Как изменить на безлимитный тариф

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

Установка официальной прошивки на Samsung Galaxy S3
Установка официальной прошивки на Samsung Galaxy S3

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