Безмозъчна потребителска информация php. Глобален масив $_SERVER в PHP. Запазване на информация за потребителите в базата данни

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

Планирайте

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

Малко за именуването на класове

Правилният тон е файловете на класа да се именуват със същото име като самия клас. По този начин е лесно да се определи целта на всеки файл в папката на класа.

Също така е обичайно да се добавят .class или .inc в края на името на файла на класа. Така ние ясно дефинираме целта на файла и можем да използваме .htaccess, за да ограничим достъпа до тези файлове.

Потребителски клас (User.class.php)

Този клас ще дефинира всеки потребител. Тъй като това приложение расте, дефиницията на „Потребител“ може да се промени значително. За щастие, ООП програмирането улеснява добавянето на допълнителни потребителски атрибути.

Конструктор

В този клас ще използваме конструктора – това е функция, която се извиква автоматично, когато бъде създадено следващото копие на класа. Това ни позволява автоматично да публикуваме някои атрибути след създаването на проекта. В този клас конструкторът ще приеме един аргумент: асоциативен масив, който съдържа един ред от таблицата на потребителите в нашата база данни.

require_once "db.class.php"; клас Потребител ( public $id; public $username; public $hashedPassword; public $email;
публичен $joinDate;
//Конструкторът се извиква при създаване на нов обект//Взема асоциативен масив с реда на DB като аргумент. функция __construct($data) ( $this->id = (isset($data["id"])) ? $data["id"] : ""; $this->username = (isset($data[" потребителско име"])) ? $data["потребителско име"] : ""; $this->hashedPassword = (isset($data["password"])) ? $data["password"] : ""; $this- >email = (isset($data["email"])) ? $data["email"] : ""; $this->joinDate = (isset($data["join_date"])) ? $data[" дата на присъединяване"] : ""; )
публична функция save($isNewUser = false) ( //създайте нов обект на база данни. $db = new DB(); //ако потребителят вече е регистриран и ние //просто актуализираме неговата информация. if(!$isNewUser ) ( //задаване на масива от данни $data = array("username" => ""$this->username"", "password" => ""$this->hashedPassword"",
"имейл" => ""$този->имейл"");
//актуализиране на реда в базата данни $db->update($data, "users", "id = ".$this->id); )else ( //ако потребителят се регистрира за първи път. $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 има функция, която изисква този клас).

Вместо „защитени“ променливи на класа (използвани в Урок 1), ние ги дефинираме като „публични“. Това означава, че всеки код извън класа има достъп до тези променливи, когато работи с обекта User.

Конструкторът взема масив, в който колоните в таблицата са ключовете. Ние дефинираме променливата на класа, използвайки $this->variablename. В примера на този клас първо проверяваме дали стойността на даден ключ съществува. Ако е така, тогава задаваме променливата на класа на тази стойност. В противен случай празен низ. Кодът използва кратката форма на обозначението на оборота, ако:

$стойност = (3 == 4)? "А" : "Б";

В този пример проверяваме дали 3 е равно на четири! Ако да - тогава $value = "A", не - $value = "B". В нашия пример резултатът е $value = “B”.

Запазване на информация за потребителите в базата данни

Функцията за запазване се използва за извършване на промени в таблицата на базата данни с текущите стойности в потребителския обект. Тази функция използва DB класа, който създадохме в първия урок. С помощта на променливи на класа се задава масивът $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";
клас UserTools(
//Влезте на потребителя. Първо проверява дали //потребителското име и паролата съвпадат с ред в базата данни. //Ако е успешно, настройте променливите на сесията //и запазете потребителския обект в рамките.
влизане в публична функция ($username, $password)
{
$hashedPassword = md5($парола); $result = mysql_query("SELECT * FROM users WHERE потребителско име = "$username" И парола = "$hashedPassword""); if(mysql_num_rows($result) == 1) ( $_SESSION["user"] = serialize(new User(mysql_fetch_assoc($result))); $_SESSION["login_time"] = time(); $_SESSION["logged_in "] = 1; връща истина; )else ( връща невярно; ) )
//Излизане на потребителя. Унищожете променливите на сесията. публична функция logout() ( unset($_SESSION["user"]); unset($_SESSION["login_time"]); unset($_SESSION["logged_in"]); session_destroy(); ) //Проверете дали съществува потребителско име. //Това се извиква по време на регистрация, за да се гарантира, че всички потребителски имена са уникални. публична функция checkUsernameExists($username) ( $result = mysql_query("изберете идентификатор от потребители, където потребителско име="$username""); if(mysql_num_rows($result) == 0) ( return false; )else( return true; )
}
//получаване на потребител //връща потребителски обект. Взема идентификатора на потребителя като входна публична функция get($id) ( $db = new DB(); $result = $db->select("users", "id = $id"); return new User($result );)))
?>

функция login().

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

Може също да забележите, че задаваме $_SESSION["logged_in"] на 1. Това ни позволява лесно да проверяваме на всяка страница дали потребителят е влязъл. Достатъчно е да проверите само тази променлива.

функцията logout().

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

функция checkUsernameExists().

Който знае английски лесно ще разбере функцията. Той просто прави запитване към базата данни дали се използва такова влизане или не.

get() функция

Тази функция взема уникален потребителски идентификатор и прави запитвания към базата данни, използвайки класа на DB, а именно функцията select(). Той ще вземе асоциативен масив с малко потребителска информация и ще създаде нов потребителски обект, предавайки масива на конструктора.

Къде може да се използва? Например, ако създадете страница, която трябва да показва конкретни потребителски профили, ще трябва да вземете тази информация динамично. Ето как можете да го направите: (да приемем, че URL адресът е http://www.website.com/profile.php?userID=3)

//забележка: първо ще трябва да отворите връзка с база данни. //вижте част 1 за допълнителна информация как да направите това. //Ще трябва също така да се уверите, че сте включили файловете на класа.
$tools = нови потребителски инструменти(); $user = $tools->get($_REQUEST["userID"]); echo "Потребителско име: ".$user->username.""; echo "Присъединил се на: ".$user->joinDate."";

Лесно! Истина?

Довършителни работи от страна на сървъра: global.inc.php

global.inc.php се изисква за всяка страница от сайта. Защо? По този начин ще поставим всички обичайни операции, от които се нуждаем, на страницата. Например ще стартираме session_start(). Връзката с базата данни също ще се отвори.

require_once "classes/UserTools.class.php";
require_once "classes/DB.class.php";
//свържете се с базата данни $db = new DB(); $db->свързване();
//инициализиране на обекта на UserTools $userTools = new UserTools(); //започнете сесията
session_start();
//опресняване на променливите на сесията, ако сте влезли 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_SOFTWARE" Идентификационният низ на сървъра, посочен в заглавките, когато се отговори на заявката."SERVER_PROTOCOL" Името и версията на информационния протокол, чрез който е заявена страницата; например " HTTP/1.0"; „REQUEST_METHOD“ Какъв метод е използван за заявка на страницата; например " ВЗЕМЕТЕ", "ГЛАВА", "ПУБЛИКУВАНЕ", "СЛАГАМ".

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

PHP скриптът прекратява след изпращане на заглавки (т.е. след като направи някакъв изход без буфериране на изход), ако заявката е направена от метода ГЛАВА.

„REQUEST_TIME“ Времево клеймо на началото на заявката. Предлага се от PHP 5.1.0.„REQUEST_TIME_FLOAT“ Часовото клеймо на началото на заявката, с точност до микросекунди. Предлага се от PHP 5.4.0.„QUERY_STRING“ Низът на заявката, ако има такъв, с който страницата е извлечена.„DOCUMENT_ROOT“ Основната директория на документа, където се изпълнява текущият скрипт, е точно тази, посочена в конфигурационния файл на сървъра."HTTP_ACCEPT" Съдържание на заглавката приемам:от текущата заявка, ако има такава."HTTP_ACCEPT_CHARSET" Съдържание на заглавката AcceptCharset:от текущата заявка, ако има такава. Например: " iso-8859-1,*,utf-8". "HTTP_ACCEPT_ENCODING" Съдържание на заглавката Приемане на кодиране: gzip". "HTTP_ACCEPT_LANGUAGE" Съдържание на заглавката Език за приемане:от текущата заявка, ако има такава. Например: " en". "HTTP_CONNECTION" Съдържание на заглавката Връзка:от текущата заявка, ако има такава. Например: " Запази живи". "HTTP_HOST" Съдържание на заглавката домакин:от текущата заявка, ако има такава."HTTP_REFERER" Адресът на страницата (ако има такава), която е довела браузъра на потребителя до тази страница. Тази заглавка се задава от уеб браузъра на потребителя. Не всички браузъри го инсталират, а някои позволяват промяна на съдържанието на заглавката HTTP_REFERER като допълнителна функция. С една дума, наистина не може да му се вярва."HTTP_USER_AGENT" Съдържание на заглавката Потребителски агент:от текущата заявка, ако има такава. Този низ съдържа обозначението на браузъра, с който потребителят е поискал тази страница. Типичен пример е редът: Mozilla/4.5 (X11; U; Linux 2.2.9 i586). Освен всичко друго, можете да използвате тази стойност с функцията get_browser() за да приспособите изхода на вашата страница към възможностите на браузъра на потребителя"https" Приема непразна стойност, ако заявката е направена чрез HTTPS протокол.

Коментирайте: Имайте предвид, че когато използвате ISAPI с IIS, стойността ще бъде изключеноако заявката не е направена чрез HTTPS протокол.

„REMOTE_ADDR“ IP адресът, от който потребителят разглежда текущата страница.„REMOTE_HOST“ Отдалеченият хост, от който потребителят разглежда текущата страница. Обратното DNS търсене се базира на стойността на променливата REMOTE_ADDR.

Коментирайте: Вашият уеб сървър трябва да е конфигуриран да създава тази променлива. Например в Apache се нуждаете от наличието на директивата Търсенето на име на хост е включеновъв файла 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 = Вкли UseCanonicalPhysicalPort = Вкл, в противен случай тази стойност може да бъде подправена и да не върне реалната стойност на физическия порт. Разчитането на тази стойност не е безопасно в контекста на приложения, които изискват повишена сигурност.

„SERVER_SIGNATURE“ Низ, съдържащ версията на сървъра и името на виртуалния хост, които да бъдат добавени към генерираните от сървъра страници, ако е разрешено.„PATH_TRANSLATED“ Път до текущия скрипт, базиран на файловата система (не на основния документ), след като сървърът е извършил преобразуване от виртуално към реално.

Коментирайте: От PHP 4.3.2, променливата PATH_TRANSLATED вече не е имплицитно зададена в Apache 2 SAPI, в сравнение с Apache версия 1, където е зададена същата стойност като SCRIPT_FILENAME, когато не се използва от Apache. Тази промяна е направена, за да се съобрази със спецификацията на CGI, където променливата PATH_TRANSLATED трябва да съществува само когато е дефиниран PATH_INFO. Потребителите на Apache 2 могат да използват директивата AcceptPathInfo = Вклв конфигурационния файл 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"] ще съдържа /някои неща?>

Резултатът от изпълнението на този пример ще бъде нещо подобно.