Безмозглий user info php. Глобальний масив $_SERVER у PHP. Зберігаємо Інформацію про Користувачів у БД

У другому уроці ми напишемо ще два класи та повністю закінчимо внутрішню частину скрипту.

План

Мета серії уроків створити простий додаток, який дозволяє користувачам реєструватися, входити, виходити та змінювати налаштування. Клас, який міститиме всю інформацію про користувача буде називатися User і він буде визначений у файлі User.class.php. Клас, який відповідатиме за вхід\вихід буде називатися UserTools (UserTools.class.php).

Трохи про назву класів

Правильним тоном є називати файли з описом класу таким самим ім'ям, як і сам клас. Таким чином, легко визначити мету кожного файлу в папці з класами.

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

Клас Користувачів (User.class.php)

Цей клас визначатиме кожного користувача. Зі зростанням цієї програми визначення "Користувач" може суттєво змінитись. На щастя, програмування ООП дозволяє легко додавати додаткові атрибути користувачів.

Конструктор

У цьому класі ми використовуватимемо конструктор - це функція, яка автоматично викликається при створенні чергової копії класу. Це дозволяє автоматично публікувати деякі атрибути після створення проекту. У цьому класі конструктор братиме єдиний аргумент: асоціативний масив, який містить один ряд з таблиці користувачів нашої БД.

require_once "DB.class.php"; class User ( public $id; public $username; public $hashedPassword; public $email;
public $joinDate;
//Конструктор викликається під час створення нового об'єкта//Таки an associative array with the DB ряд як 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"] : ""; >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())."""); 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(). В обох випадках інформація від об'єкта користувача буде збережена в БД.

Клас 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. Перші вибори до повідомлень, якщо //username і 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. //Ця є названа під час реєстрації в тому, що всі користувачі називаються 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. Такі 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: Ви маєте здійснити Open up 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 = новий 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"], щоб відображати останню інформацію про користувача. Наприклад, якщо користувач змінює свій емейл, у сесії зберігатиметься ще старий. Але за допомогою авто оновлення такого не станеться.

На цьому друга частина добігла кінця! Завтра чекайте на заключний урок з цієї теми.

Всього найкращого!

Ті, хто більш-менш серйозно вивчав PHPзнають, що існує один дуже корисний глобальний масив у PHP, який називається $_SERVER. І ось хотілося б у цій статті розібрати найпопулярніші ключі та їх значення у цьому масиві, тому що їх знання просто обов'язкове навіть для початківця PHP-програміста.

Перш ніж приступити до глобальному масиву $_SERVER у PHP, одразу зроблю невелику підказку. Є чудова функція, вбудована у PHP, яка називається phpinfo(). Давайте відразу наведу приклад її використання:

phpinfo();
?>

В результаті виконання цього просто скрипту Ви побачите величезну таблицю з різними налаштуваннями інтерпретатора PHP, у тому числі, ближче до кінця буде таблиця значень глобального масиву $_SERVER. Там будуть перераховані всі ключі та всі відповідні їм значення. Чим це може допомогти Вам? А тим, що якщо Вам знадобиться те чи інше значення, і Ви забудете, як називається ключ, то за допомогою функції phpinfo()Ви можете завжди згадати його назву. Загалом, Ви виконаєте цей скрипт і одразу мене зрозумієте.

А тепер давайте перейдемо до найпопулярніших ключів масиву $_SERVER:

  • HTTP_USER_AGENT- Цей ключ дозволяє дізнатися про характеристику клієнта. У більшості випадків це, безумовно, браузер, однак, не завжди. І знову ж таки, якщо браузер, то який, ось у цій змінній про це можна і дізнатися.
  • HTTP_REFERER- Містить абсолютний шлях до того файлу ( PHP-скрипт, HTML-сторінка), з якого перейшли на цей скрипт. Грубо говорячи, звідки прийшов клієнт.
  • SERVER_ADDR - IP-адресасервера.
  • REMOTE_ADDR - IP-адресаклієнта.
  • DOCUMENT_ROOT- фізичний шлях до кореневої директорії сайту. Ця опція задається через конфігураційний файл сервера Apache.
  • SCRIPT_FILENAME- Фізичний шлях до викликаного скрипту.
  • QUERY_STRING- Досить корисне значення, яке дозволяє отримати рядок із запитом, а далі можна займатися парсингом цього рядка.
  • REQUEST_URI- ще корисніше значення, що містить як сам запит, а й разом із відносний шлях до скрипту від кореня. Це дуже часто використовується для видалення дублювання з index.php, тобто коли у нас такий URL: "http://mysite.ru/index.php"і" http://mysite.ru/ведуть на одну сторінку, а URLрізні, отже, дублювання, що погано позначиться на пошуковій оптимізації. І ось за допомогою REQUEST_URIми можемо визначити: з index.phpчи ні, був викликаний скрипт. І можемо зробити редирект з index.php(якщо він був у REQUEST_URI) на без index.php. В результаті, при наданні такого запиту: " http://mysite.ru/index.php?id=5", у нас відбуватиметься редирект на URL: "http://mysite.ru/?id=5". Тобто ми позбулися дублювання, вилучивши з URLцей index.php.
  • SCRIPT_NAME- відносний шлях до скрипту, що викликається.

Мабуть, це все елементи глобального масиву $_SERVER в PHP, які використовуються регулярно. Їх треба знати та вміти використовувати, коли це необхідно.

$HTTP_SERVER_VARS [видалено]

(PHP 4> = 4.1.0, PHP 5, PHP 7)

$_SERVER -- $HTTP_SERVER_VARS [видалено]Інформація про сервер та середовище виконання

Опис

Змінна $_SERVER - це масив, що містить інформацію, таку як заголовки, шляхи та розташування скриптів. Записи у цьому масиві створюються веб-сервером. Немає гарантії, що кожен веб-сервер надасть будь-яку з них; сервер може опустити деякі з них або надати інші, які не вказані тут. Тим не менш, багато цих змінних присутні в » специфікації CGI/1.1 , так що ви можете очікувати їх реалізації і в конкретному веб-сервері.

Змінна $HTTP_SERVER_VARS містить ту саму початкову інформацію, але вона не суперглобальна. (Зверніть увагу, що $HTTP_SERVER_VARS і $_SERVER є різними змінними, так що PHP обробляє їх відповідно). Також врахуйте, що довгі масиви були видалені у версії PHP 5.4.0, тому $HTTP_SERVER_VARS більше не існує.

Індекси

Ви можете знайти (а можете і не знайти) будь-який з наступних елементів у масиві $_SERVER . Зауважте, що деякі елементи, якщо взагалі такі знайдуться, будуть доступні (або дійсно матимуть значення), якщо PHP запущено в командному рядку.

" PHP_SELF " Ім'я файлу скрипта, який зараз виконується, щодо кореня документів. Наприклад, $_SERVER["PHP_SELF"] у скрипті за адресою http://example.com/foo/bar.php буде /foo/bar.php . Константа __FILE__містить повний шлях та ім'я файлу поточного (тобто підключеного) файлу. Якщо PHP запущено у командному рядку, ця змінна містить ім'я скрипта, починаючи з PHP 4.3.0. Раніше вона була недоступною. "argv " Масив аргументів переданих скрипту. Коли скрипт запущено у командному рядку, це дає C-подібний доступ до параметрів командного рядка. Коли викликається через метод GET, цей масив міститиме рядок запиту. "argc " Містить кількість параметрів, переданих скрипту (якщо запуск здійснено у командному рядку)." GATEWAY_INTERFACE " Містить версію специфікації CGI, що використовується сервером; наприклад" CGI/1.1". " SERVER_ADDR " IP-адреса сервера, на якому виконується поточний скрипт."SERVER_NAME" Ім'я хоста, де виконується поточний скрипт. Якщо скрипт виконується на віртуальному хості, тут буде вказано ім'я, визначене для цього віртуального хоста." SERVER_SOFTWARE " Рядок ідентифікації сервера, вказаний у заголовках, коли відбувається відповідь на запит." SERVER_PROTOCOL " Ім'я та версія інформаційного протоколу, через який було запрошено сторінку; наприклад " HTTP/1.0"; "REQUEST_METHOD" Який метод використали для запиту сторінки; наприклад " GET", "HEAD", "POST", "PUT".

Зауваження:

PHP скрипт завершується після надсилання заголовків (тобто після того, як здійснює будь-який висновок без буферизації виводу), якщо запит був здійснений методом HEAD.

"REQUEST_TIME" Тимчасова позначка початку запиту. Доступна починаючи з PHP 5.1.0."REQUEST_TIME_FLOAT" Тимчасова позначка початку запиту з точністю до мікросекунд. Доступна починаючи з PHP 5.4.0."QUERY_STRING" Рядок запитів, якщо є, за допомогою якої було отримано сторінку."DOCUMENT_ROOT" Директорія кореня документів, в якій виконується поточний скрипт, точно та, що вказана в конфігураційному файлі сервера." HTTP_ACCEPT " Вміст заголовка Accept:поточного запиту, якщо він є." HTTP_ACCEPT_CHARSET " Вміст заголовка Accept-Charset:поточного запиту, якщо він є. Наприклад: " iso-8859-1,*,utf-8". " HTTP_ACCEPT_ENCODING " Вміст заголовка Accept-Encoding: gzip". " HTTP_ACCEPT_LANGUAGE " Вміст заголовка Accept-Language:поточного запиту, якщо він є. Наприклад: " en". " HTTP_CONNECTION " Вміст заголовка Connection:поточного запиту, якщо він є. Наприклад: " Keep-Alive". " HTTP_HOST " Вміст заголовка Host:поточного запиту, якщо він є." HTTP_REFERER " Адреса сторінки (якщо є), яка навела браузер користувача на цю сторінку. Цей заголовок встановлюється веб-браузером користувача. Не всі браузери встановлюють його і деякі як додаткова можливість дозволяють змінювати вміст заголовка HTTP_REFERER . Одним словом, насправді йому не можна довіряти." HTTP_USER_AGENT " Вміст заголовка User-Agent:поточного запиту, якщо він є. Цей рядок містить позначку браузера, яким користувач запросив цю сторінку. Типовим прикладом є рядок: Mozilla/4.5 (X11; U; Linux 2.2.9 i586). Серед іншого, ви можете використати це значення з функцією get_browser() щоб адаптувати виведення вашої сторінки до можливостей браузера користувача"HTTPS" Приймає непусте значення, якщо запит було здійснено через протокол HTTPS.

Зауваження: Зверніть увагу, що при використанні ISAPI з IIS значення буде off, якщо запит не було зроблено через протокол HTTPS.

"REMOTE_ADDR" IP-адреса, з якої користувач переглядає поточну сторінку." REMOTE_HOST " Віддалений хост, з якого користувач переглядає поточну сторінку. Зворотний перегляд DNS базується на значенні змінної REMOTE_ADDR.

Зауваження: Ваш веб-сервер має бути налаштований, щоб створювати цю змінну. Для прикладу, в Apache вам потрібна присутність директиви HostnameLookups Onу файлі httpd.conf, щоб ця змінна створювалася. Див. також gethostbyaddr() .

"REMOTE_PORT" Порт на віддаленій машині, який використовується для зв'язку з веб-сервером." REMOTE_USER " Автентифікований користувач." REDIRECT_REMOTE_USER " Аутентифікований користувач, якщо запит перенаправлено зсередини."SCRIPT_FILENAME"

Абсолютний шлях до скрипту, який зараз виконується.

Зауваження:

Якщо скрипт запускається в командному рядку (CLI), використовуючи відносний шлях, такий як file.php або ../file.php , змінна $_SERVER["SCRIPT_FILENAME"] міститиме відносний шлях, вказаний користувачем.

"SERVER_ADMIN" Ця змінна отримує своє значення (для Apache) з директиви файлу конфігурації сервера. Якщо скрипт запущено на віртуальному хості, це буде значення, визначене для цього віртуального хоста."SERVER_PORT" Порт на комп'ютері сервера, який використовується веб-сервером для з'єднання. Для установок за замовчуванням значення буде " 80 "; використовуючи SLL, наприклад, це значення буде таким, яке налаштовано для з'єднань безпечного HTTP.

Зауваження: Щоб отримати фізичний (реальний) порт Apache 2, необхідно встановити UseCanonicalName = Onі UseCanonicalPhysicalPort = On, інакше це значення може бути підмінено і не повернути реальне значення фізичного порту. Покладатися на це значення є небезпечним у контексті додатків, що потребують посиленої безпеки.

"SERVER_SIGNATURE" Рядок, що містить версію сервера та ім'я віртуального хоста, які додаються до сторінок, що генеруються сервером, якщо включено." PATH_TRANSLATED " Filesystem- (no document root-) базується на поточному script, після сервера має кожний віртуальний-реальний mapping.

Зауваження: Починаючи з PHP 4.3.2, змінна PATH_TRANSLATED більше не встановлюється неявно в Apache 2 SAPI порівняно з Apache версії 1, де вона встановлюється в те саме значення, що і змінна SCRIPT_FILENAME , коли вона не використовується Apache. Ця зміна була зроблена для відповідності специфікації CGI , де змінна PATH_TRANSLATED повинна існувати тільки тоді, коли визначено PATH_INFO. Користувачі Apache 2 можуть використовувати директиву AcceptPathInfo = Onу конфігураційному файлі httpd.conf для завдання змінної PATH_INFO .

"SCRIPT_NAME" Містить шлях до поточного виконуваного скрипту. Це корисно для сторінок, які повинні вказувати на себе. Константа __FILE__містить повний шлях та ім'я поточного (тобто включається) файлу."REQUEST_URI" URI, який було передано для того, щоб отримати доступ до цієї сторінки. Наприклад, " /index.html". " PHP_AUTH_DIGEST " При виконанні HTTP Digest аутентифікації, цій змінній надається заголовок "Authorization", який надсилається клієнтом (його необхідно потім використовувати для відповідної валідації)." PHP_AUTH_USER " Коли виконується HTTP-автентифікація, цій змінній надається ім'я користувача, надане користувачем." PHP_AUTH_PW " Коли виконується HTTP-автентифікація, цій змінній надається пароль, наданий користувачем."AUTH_TYPE" Коли виконується HTTP-автентифікація, цій змінній надається тип автентифікації, який використовується." PATH_INFO " Містить будь-який наданий користувачем шлях, що міститься після імені скрипта, але до рядка запиту, якщо є. Наприклад, якщо поточний скрипт запрошений за URL http://www.example.com/php/path_info.php/some/stuff?foo=bar , змінна $_SERVER["PATH_INFO"] буде містити /some/stuff?>

Результатом виконання цього прикладу буде щось подібне.