Informacije o korisniku bez mozga php. Globalni niz $_SERVER u PHP-u. Spremanje podataka o korisnicima u bazu podataka

U drugoj lekciji ćemo napisati još dva sata i u potpunosti završiti interni dio skripte.

Plan

Cilj ove serije vodiča je stvoriti jednostavnu aplikaciju koja korisnicima omogućuje registraciju, prijavu, odjavu i promjenu postavki. Klasa koja će sadržavati sve podatke o korisniku zvat će se Korisnik i bit će definirana u datoteci User.class.php. Klasa koja će biti odgovorna za ulaz/izlaz zvat će se Korisnički alati (UserTools.class.php).

Malo o imenovanju klase

Ispravan ton je imenovati datoteke klase istim imenom kao i sama klasa. Na ovaj način je lako odrediti svrhu svake datoteke u mapi razreda.

Također je uobičajeno dodati .class ili .inc na kraj naziva datoteke klase. Dakle, jasno definiramo svrhu datoteke i možemo koristiti .htaccess za ograničavanje pristupa tim datotekama.

Korisnička klasa (User.class.php)

Ova klasa će definirati svakog korisnika. Kako ova aplikacija raste, definicija "Korisnika" može se značajno promijeniti. Srećom, OOP programiranje olakšava dodavanje dodatnih korisničkih atributa.

Konstruktor

U ovoj klasi koristit ćemo konstruktor - to je funkcija koja se automatski poziva kada se kreira sljedeća kopija klase. To nam omogućuje da automatski objavimo neke atribute nakon što je projekt stvoren. U ovoj klasi, konstruktor će uzeti jedan argument: asocijativni niz koji sadrži jedan red iz tablice korisnika u našoj bazi podataka.

require_once "db.class.php"; klasa Korisnik ( public $id; public $username; public $hashedPassword; public $email;
javni $joinDate;
//Konstruktor se poziva kada se kreira novi objekt//Uzima asocijativni niz s redom DB kao argument. funkcija __construct($data) ( $this->id = (isset($data["id"])) ? $data["id"] : ""; $this->username = (isset($data[" korisničko ime"])) ? $data["korisničko ime"] : ""; $this->hashedPassword = (isset($data["password"])) ? $data["password"] : ""; $this- >email = (isset($data["email"])) ? $data["email"] : ""; $this->joinDate = (isset($data["join_date"])) ? $data[" datum_pridruživanja"] : ""; )
javna funkcija save($isNewUser = false) ( //stvori novi objekt baze podataka. $db = new DB(); //ako je korisnik već registriran i mi //samo ažuriramo njegove podatke. if(!$isNewUser ) ( //postavite niz podataka $data = array("username" => ""$this->username"", "password" => ""$this->hashedPassword"",
"e-pošta" => ""$ovo->e-pošta"");
//ažuriraj red u bazi $db->update($data, "users", "id = ".$this->id); )else ( //ako se korisnik registrira prvi put. $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; ) ) ?>

Obrazloženje

Prvi dio koda, izvan zone klase, osigurava vezu klase s bazom podataka (jer u klasi User postoji funkcija koja zahtijeva ovu klasu).

Umjesto "zaštićenih" varijabli klase (koje se koriste u lekciji 1), mi ih definiramo kao "javne". To znači da svaki kod izvan klase ima pristup ovim varijablama kada radi s objektom User.

Konstruktor uzima niz u kojem su stupci u tablici ključevi. Varijablu klase definiramo koristeći $this->variablename. U primjeru ove klase prije svega provjeravamo postoji li vrijednost određenog ključa. Ako je tako, tada postavljamo varijablu klase na tu vrijednost. Inače, prazan niz. Šifra koristi kratki oblik oznake prometa ako:

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

U ovom primjeru provjeravamo je li 3 jednako četiri! Ako da - tada $vrijednost = "A", ne - $vrijednost = "B". U našem primjeru, rezultat je $value = “B”.

Spremanje podataka o korisnicima u bazu podataka

Funkcija spremanja koristi se za izmjene u tablici baze podataka s trenutnim vrijednostima u objektu User. Ova funkcija koristi DB klasu koju smo stvorili u prvom vodiču. Pomoću varijabli klase postavlja se polje $data. Ako je ovo prvi put da se korisnik pohranjuje, tada se $isNewUser prosljeđuje kao $true (zadano je false). Ako je $isNewUser = $true tada se poziva funkcija insert() klase DB. Inače se poziva funkcija update(). U oba slučaja, informacije iz korisničkog objekta bit će pohranjene u bazi podataka.

Klasa UserTools.class.php

Ova klasa će sadržavati funkcije koje se odnose na korisnike: login(), logout(), checkUsernameExists() i get(). Ali s proširenjem ove aplikacije, možete dodati još puno više.

//UserTools.class.php require_once "User.class.php"; require_once "db.class.php";
klasa Korisnički alati(
//Prijava korisnika. Prvo provjerava odgovaraju li //korisničko ime i lozinka retku u bazi podataka. //Ako je uspješno, postavite varijable sesije //i pohranite korisnički objekt unutar.
javna funkcija prijava ($korisničko ime, $lozinka)
{
$hashedPassword = md5($password); $result = mysql_query("SELECT * FROM users WHERE korisničko ime = "$username" AND lozinka = "$hashedPassword""); if(mysql_num_rows($result) == 1) ( $_SESSION["user"] = serijalize(new User(mysql_fetch_assoc($result))); $_SESSION["login_time"] = time(); $_SESSION["logged_in "] = 1; vrati istinito; )else( vrati lažno; ) )
//Odjava korisnika. Uništite varijable sesije. javna funkcija odjava() ( unset($_SESSION["user"]); unset($_SESSION["login_time"]); unset($_SESSION["logged_in"]); session_destroy(); ) //Provjerite da li korisničko ime postoji. //Ovo se poziva tijekom registracije kako bi se osiguralo da su sva korisnička imena jedinstvena. javna funkcija checkUsernameExists($username) ( $result = mysql_query("select id from users where username="$username""); if(mysql_num_rows($result) == 0) ( return false; )else( return true; )
}
//dobi korisnika //vraća objekt User. Uzima ID korisnika kao ulaznu javnu funkciju get($id) ( $db = new DB(); $result = $db->select("users", "id = $id"); return new User($result );)))
?>

funkcija login().

Funkcija login() je sama po sebi razumljiva. Uzima korisničke argumente $username i $password i provjerava podudaraju li se. Ako sve odgovara, stvara korisnički objekt sa svim informacijama i pohranjuje ga u sesiji. Imajte na umu da koristimo samo PHP funkciju serialize(). Stvara postojanu verziju objekta koja se može lako deserializirati pomoću unserialize(). Također će biti spremljeno vrijeme prijave. To se kasnije može koristiti za pružanje informacija korisnicima o trajanju njihovog boravka na stranici.

Također možete primijetiti da $_SESSION["logged_in"] postavljamo na 1. To nam omogućuje da na svakoj stranici lako provjerimo je li korisnik prijavljen. Dovoljno je provjeriti samo ovu varijablu.

funkcija odjava().

Također jednostavna funkcija. PHP-ova funkcija unset() briše varijable u memoriji, dok session_destroy() briše sesiju.

funkcija checkUsernameExists().

Tko zna engleski lako će razumjeti funkciju. Jednostavno ispituje bazu podataka koristi li se takva prijava ili ne.

funkcija get().

Ova funkcija uzima jedinstveni korisnički ID i postavlja upit bazi podataka koristeći DB klasu, odnosno funkciju select(). Uzet će asocijativni niz s nekim korisničkim informacijama i stvoriti novi korisnički objekt, prosljeđujući niz konstruktoru.

Gdje se može koristiti? Na primjer, ako izradite stranicu koja treba prikazati određene korisničke profile, morat ćete dinamički preuzimati ove informacije. Evo kako to možete učiniti: (recimo da je URL http://www.website.com/profile.php?userID=3)

//napomena: prvo ćete morati otvoriti vezu s bazom podataka. //pogledajte 1. dio za dodatne informacije o tome. //Također ćete morati provjeriti jeste li uključili datoteke razreda.
$tools = novi korisnički alati(); $user = $tools->get($_REQUEST["userID"]); echo "Korisničko ime: ".$user->username.""; echo "Pridružio se: ".$user->joinDate."";

Lako! Istina?

Završni dodir na strani poslužitelja: global.inc.php

global.inc.php je potreban za svaku stranicu stranice. Zašto? Na taj način ćemo sve uobičajene operacije koje su nam potrebne smjestiti na stranicu. Na primjer, pokrenut ćemo session_start(). Otvorit će se i veza s bazom podataka.

require_once "klase/Korisnički alati.class.php";
require_once "klase/DB.class.php";
//spojiti se na bazu $db = new DB(); $db->poveži();
//inicijaliziraj objekt UserTools $userTools = new UserTools(); //pokreni sesiju
početak_sesije();
//osvježi varijable sesije ako je prijavljen if(isset($_SESSION["logged_in"])) ( $user = unserialize($_SESSION["user"]); $_SESSION["user"] = serialize($userTools-> get($user->id)); ) ?>

Što on radi?

Ovdje se događa nekoliko stvari. Prije svega otvaramo vezu s bazom podataka.

Nakon povezivanja pokrećemo funkciju session_start(). Funkcija stvara sesiju ili nastavlja trenutnu ako je korisnik već prijavljen. Budući da je naša aplikacija dizajnirana za prijavu/odjavu korisnika, ova je funkcija obavezna na svakoj stranici.

Zatim provjeravamo je li korisnik prijavljen. Ako je tako, ažurirat ćemo $_SESSION["user"] za prikaz najnovijih podataka o korisniku. Na primjer, ako korisnik promijeni svoju e-poštu, sesija će i dalje pohraniti staru. Ali uz pomoć automatskog ažuriranja to se neće dogoditi.

Ovim završava drugi dio! Sutra očekujte posljednju lekciju na ovu temu.

Sve najbolje!

Oni koji su koliko-toliko ozbiljno studirali PHP znam da postoji jedan vrlo koristan globalni niz PHP, koji se zove $_SERVER. I u ovom bih članku želio analizirati najpopularnije ključeve i njihove vrijednosti u ovom nizu, budući da je njihovo poznavanje jednostavno potrebno čak i početniku PHP programer.

Prije nastavka na na globalni niz $_SERVER u PHP-u Samo ću vam dati mali savjet. Ugrađena je prekrasna značajka PHP, koji se zove phpinfo(). Odmah navedimo primjer njegove upotrebe:

phpinfo();
?>

Kao rezultat izvršavanja ove jednostavne skripte, vidjet ćete ogromnu tablicu s raznim Postavke PHP tumača, uključujući, pri kraju će biti tablica vrijednosti globalni niz $_SERVER. Popisat će sve ključeve i sve njihove odgovarajuće vrijednosti. Kako vam ovo može pomoći? I činjenica da ako trebate ovu ili onu vrijednost, a zaboravite kako se zove ključ, onda koristite funkciju phpinfo() Uvijek se možete sjetiti njegovog imena. Općenito, izvršit ćete ovu skriptu i odmah ćete me razumjeti.

Sada prijeđimo na najpopularnije Ključevi polja $_SERVER:

  • HTTP_USER_AGENT- ovaj ključ vam omogućuje da saznate karakteristike klijenta. U većini slučajeva to je definitivno preglednik, no ne uvijek. I opet, ako preglednik, onda koji, o tome možete saznati u ovoj varijabli.
  • HTTP_REFERER- sadrži apsolutni put do te datoteke ( PHP skripta, HTML stranica) s kojeg ste se prebacili na ovu skriptu. Otkud, grubo rečeno, klijent.
  • SERVER_ADDR - IP adresa poslužitelj.
  • REMOTE_ADDR - IP adresa klijent.
  • DOCUMENT_ROOT- fizički put do korijenskog direktorija stranice. Ova se opcija postavlja putem Konfiguracijska datoteka Apache poslužitelja.
  • SCRIPT_FILENAME- fizički put do pozvane skripte.
  • QUERY_STRING- vrlo korisna vrijednost koja vam omogućuje da dobijete niz s upitom, a zatim možete analizirati ovaj niz.
  • REQUEST_URI- još korisnija vrijednost koja sadrži ne samo sam zahtjev, već i relativni put do pozvane skripte iz korijena zajedno s njim. Ovo se vrlo često koristi za uklanjanje dupliciranja iz indeks.php, odnosno kada imamo takve URL: "http://mysite.ru/index.php" i " http://mysite.ru/" dovesti do jedne stranice i URL-ovi drugačije, dakle, dupliciranje, što će loše utjecati na optimizaciju tražilica. I ovdje uz pomoć REQUEST_URI možemo definirati: indeks.php ili nije skripta pozvana. I možemo preusmjeriti sa indeks.php(ako je bio prisutan REQUEST_URI) na bez indeks.php. Kao rezultat toga, prilikom slanja takvog zahtjeva: " http://mysite.ru/index.php?id=5", imat ćemo preusmjeravanje na URL: "http://mysite.ru/?id=5". Odnosno, riješili smo se dupliciranja uklanjanjem iz URL ovaj indeks.php.
  • SCRIPT_NAME- relativna staza do pozvane skripte.

Možda su to svi elementi $_SERVER globalni niz u PHP-u koji se redovito koriste. Moraju znati i moći koristiti kada je potrebno.

$HTTP_SERVER_VARS [uklonjeno]

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

$_SERVER -- $HTTP_SERVER_VARS [uklonjeno]Informacije o poslužitelju i vremenu izvođenja

Opis

Varijabla $_SERVER je polje koje sadrži informacije kao što su zaglavlja skripte, staze i lokacije. Unose u ovom nizu kreira web poslužitelj. Ne postoji jamstvo da će svaki web poslužitelj pružiti bilo što od ovoga; poslužitelj može izostaviti neke od njih ili dati druge koji nisu ovdje navedeni. Međutim, mnoge od ovih varijabli prisutne su u » CGI/1.1 specifikaciji, tako da možete očekivati ​​da će biti implementirane i na određenom web poslužitelju.

Varijabla $HTTP_SERVER_VARS sadrži iste početne informacije, ali ih nema superglobalni. (Imajte na umu da su $HTTP_SERVER_VARS i $_SERVER različite varijable, tako da PHP s njima rukuje u skladu s tim.) Također imajte na umu da su "dugi nizovi" uklonjeni u PHP 5.4.0, tako da $HTTP_SERVER_VARS više ne postoji.

Indeksi

Možete ili ne morate pronaći bilo koji od sljedećih elemenata u nizu $_SERVER. Imajte na umu da će nekoliko, ako ih uopće ima, elemenata biti dostupno (ili stvarno važno) ako se PHP pokrene naredbeni redak.

"PHP_SELF" Naziv datoteke skripte koja se trenutno izvodi, u odnosu na korijen dokumenta. Na primjer, $_SERVER["PHP_SELF"] u skripti na http://example.com/foo/bar.php bilo bi /foo/bar.php . Konstantno __DATOTEKA__ sadrži puni put i naziv datoteke trenutne (tj. povezane) datoteke. Ako se PHP pokreće u naredbenom retku, ova varijabla sadrži naziv skripte od PHP-a 4.3.0. Prethodno je bilo nedostupno. "argv " Niz argumenata proslijeđen skripti. Kada se skripta pokrene na naredbenom retku, daje pristup opcijama naredbenog retka sličan C-u. Kada se pozove putem metode GET, ovaj niz će sadržavati niz upita. "argc " Sadrži broj parametara proslijeđenih skripti (ako je pokrenuta u naredbenom retku)."GATEWAY_INTERFACE" Sadrži verziju CGI specifikacije koju koristi poslužitelj; na primjer" CGI/1.1". "SERVER_ADDR" IP adresa poslužitelja na kojem se izvodi trenutna skripta."SERVER_NAME" Naziv glavnog računala na kojem se izvodi trenutna skripta. Ako se skripta izvodi na virtualnom hostu, to će sadržavati naziv definiran za taj virtualni host."SERVER_SOFTWARE" Identifikacijski niz poslužitelja naveden u zaglavljima kada se odgovori na zahtjev."SERVER_PROTOCOL" Naziv i verzija informacijskog protokola putem kojeg je stranica zatražena; na primjer " HTTP/1.0"; " REQUEST_METHOD " Koja je metoda korištena za traženje stranice; na primjer " DOBITI", "GLAVA", "POST", "STAVITI".

Komentar:

PHP skripta završava nakon slanja zaglavlja (to jest, nakon što izvrši bilo kakav izlaz bez izlaznog međuspremnika), ako je zahtjev napravljen metodom GLAVA.

"REQUEST_TIME" Vremenska oznaka početka zahtjeva. Dostupan od PHP 5.1.0."REQUEST_TIME_FLOAT" Vremenska oznaka početka zahtjeva, točna u mikrosekundama. Dostupan od PHP 5.4.0."QUERY_STRING" Niz upita, ako postoji, s kojim je stranica dohvaćena."DOCUMENT_ROOT" Korijenski direktorij dokumenta u kojem se izvršava trenutna skripta točno je onaj naveden u konfiguracijskoj datoteci poslužitelja."HTTP_ACCEPT" Sadržaj zaglavlja prihvatiti: iz trenutnog zahtjeva, ako postoji."HTTP_ACCEPT_CHARSET" Sadržaj zaglavlja Prihvati skup znakova: iz trenutnog zahtjeva, ako postoji. Na primjer: " iso-8859-1,*,utf-8". "HTTP_ACCEPT_ENCODING" Sadržaj zaglavlja Prihvati kodiranje: gzip". "HTTP_ACCEPT_LANGUAGE" Sadržaj zaglavlja Jezik prihvaćanja: iz trenutnog zahtjeva, ako postoji. Na primjer: " hr". "HTTP_CONNECTION" Sadržaj zaglavlja veza: iz trenutnog zahtjeva, ako postoji. Na primjer: " Držati na životu". "HTTP_HOST" Sadržaj zaglavlja domaćin: iz trenutnog zahtjeva, ako postoji."HTTP_REFERER" Adresa stranice (ako postoji) koja je dovela korisnikov preglednik na ovu stranicu. Ovo zaglavlje postavlja web preglednik korisnika. Ne instaliraju ga svi preglednici, a neki dopuštaju promjenu sadržaja zaglavlja HTTP_REFERER kao dodatnu značajku. Jednom riječju, njemu se stvarno ne može vjerovati."HTTP_USER_AGENT" Sadržaj zaglavlja Korisnički agent: iz trenutnog zahtjeva, ako postoji. Ovaj niz sadrži oznaku preglednika s kojim je korisnik zatražio ovu stranicu. Tipičan primjer je redak: Mozilla/4.5 (X11; U; Linux 2.2.9 i586). Između ostalog, ovu vrijednost možete koristiti s funkcijom get_browser() kako biste prilagodili ispis svoje stranice mogućnostima preglednika korisnika"https" Uzima vrijednost koja nije prazna ako je zahtjev napravljen putem HTTPS protokola.

Komentar: Imajte na umu da će, kada koristite ISAPI s IIS-om, vrijednost biti isključeno ako zahtjev nije napravljen putem HTTPS protokola.

"REMOTE_ADDR" IP adresa s koje korisnik gleda trenutnu stranicu."REMOTE_HOST" Udaljeni host s kojeg korisnik gleda trenutnu stranicu. Obrnuto DNS pretraživanje temelji se na vrijednosti varijable REMOTE_ADDR.

Komentar: Vaš web poslužitelj mora biti konfiguriran za stvaranje ove varijable. Na primjer, u Apacheu vam je potrebna prisutnost direktive Traženje imena glavnog računala uključeno u datoteci httpd.conf da bi se ova varijabla stvorila. vidi također gethostbyaddr() .

"REMOTE_PORT" Port na udaljenom računalu koji se koristi za komunikaciju s web poslužiteljem."REMOTE_USER" Autentificirani korisnik."REDIRECT_REMOTE_USER" Autentificirani korisnik, ako je zahtjev interno preusmjeren."SCRIPT_FILENAME"

Apsolutni put do skripte koja se trenutno izvršava.

Komentar:

Ako se skripta izvodi na naredbenom retku (CLI) koristeći relativnu stazu kao što je file.php ili ../file.php, varijabla $_SERVER["SCRIPT_FILENAME"] sadržavat će relativnu stazu koju je naveo korisnik.

"SERVER_ADMIN" Ova varijabla dobiva svoju vrijednost (za Apache) iz direktive u konfiguracijskoj datoteci poslužitelja. Ako se skripta izvodi na virtualnom hostu, to će biti vrijednost definirana za taj virtualni host."SERVER_PORT" Port na poslužiteljskom računalu koji web poslužitelj koristi za povezivanje. Za zadane postavke, vrijednost će biti " 80 "; korištenjem SLL-a, na primjer, ova će vrijednost biti konfigurirana za sigurne HTTP veze.

Komentar: Da biste dobili fizički (pravi) port u Apacheu 2, trebate instalirati UseCanonicalName = Uključeno i UseCanonicalPhysicalPort = Uključeno, inače bi ova vrijednost mogla biti krivotvorena i ne vraća stvarnu vrijednost fizičkog priključka. Oslanjanje na ovu vrijednost nije sigurno u kontekstu aplikacija koje zahtijevaju poboljšanu sigurnost.

"SERVER_SIGNATURE" Niz koji sadrži verziju poslužitelja i naziv virtualnog računala koji će se dodati stranicama koje generira poslužitelj, ako je omogućeno."PATH_TRANSLATED" Put do trenutne skripte temeljen na datotečnom sustavu (ne na korijenskom dokumentu), nakon što poslužitelj izvrši mapiranje virtualnog u stvarno.

Komentar: Od PHP 4.3.2, varijabla PATH_TRANSLATED više nije implicitno postavljena u Apache 2 SAPI, u usporedbi s Apache verzijom 1 gdje je postavljena na istu vrijednost kao SCRIPT_FILENAME kada je Apache ne koristi. Ova promjena je napravljena kako bi bila u skladu sa CGI specifikacijom, gdje bi varijabla PATH_TRANSLATED trebala postojati samo kada je PATH_INFO definiran. Korisnici Apache 2 mogu koristiti direktivu AcceptPathInfo = Uključeno u konfiguracijskoj datoteci httpd.conf za postavljanje varijable PATH_INFO.

"SCRIPT_NAME" Sadrži put do skripte koja se trenutno izvodi. Ovo je korisno za stranice koje moraju ukazivati ​​na same sebe. Konstantno __DATOTEKA__ sadrži puni put i naziv trenutne (tj. uključene) datoteke."REQUEST_URI" URI koji je proslijeđen za pristup ovoj stranici. Na primjer, " /index.html". "PHP_AUTH_DIGEST" Prilikom izvođenja HTTP Digest provjere autentičnosti, ova se varijabla postavlja na zaglavlje "Authorization" koje šalje klijent (koje se zatim mora koristiti za odgovarajuću provjeru valjanosti)."PHP_AUTH_USER" Kada se provodi HTTP provjera autentičnosti, ova se varijabla postavlja na korisničko ime koje je dao korisnik."PHP_AUTH_PW" Kada se provodi HTTP autentifikacija, ova varijabla se postavlja na lozinku koju je dao korisnik."AUTH_TYPE" Kada se provodi HTTP autentifikacija, ova se varijabla postavlja na vrstu autentifikacije koja se koristi."PATH_INFO" Sadrži bilo koju putanju koju je naveo korisnik nakon naziva skripte, ali prije niza upita, ako je dostupan. Na primjer, ako se trenutna skripta traži na URL-u http://www.example.com/php/path_info.php/some/stuff?foo=bar, tada će varijabla $_SERVER["PATH_INFO"] sadržavati /neke stvari?>

Rezultat pokretanja ovog primjera bit će nešto poput ovoga.