Jednostavna RESTful usluga u izvornom PHP-u. $_SERVER - Informacije o serveru i izvršnom okruženju Šta naša RESTful usluga treba da može da uradi

Mogućnosti efikasnog organizovanja, pretraživanja i distribucije informacija već dugo zanimaju stručnjake iz oblasti računarske tehnologije. Budući da je informacija uglavnom tekst koji se sastoji od alfanumeričkih znakova, razvoj sredstava za pretraživanje i obradu informacija prema obrascima koji opisuju tekst postao je predmet ozbiljnih teorijskih istraživanja.

Pretraživanje uzorka vam omogućava ne samo da pronađete određene fragmente teksta, već i da ih zamijenite drugim fragmentima. Jedan standardni primjer podudaranja uzoraka su komande pronađi/zamijeni u uređivačima teksta—na primjer, MS Word, Emacs i moj omiljeni uređivač, vi. Svi korisnici UNIX-a su upoznati sa programima kao što su sed, awk i grep; Bogatstvo mogućnosti ovih programa je u velikoj meri posledica njihovih mogućnosti pretraživanja šablona. Mehanizmi za pretragu uzoraka rješavaju četiri glavna problema:

  • traži nizove koji se tačno podudaraju sa datim uzorkom;
  • traženje fragmenata niza koji odgovaraju datom uzorku;
  • zamjena nizova i podnizova korištenjem uzorka;
  • traži nizove sa datim uzorkom ne odgovara.

Pojava Weba stvorila je potrebu za bržim i efikasnijim alatima za pretraživanje podataka koji omogućavaju korisnicima širom svijeta da pronađu informacije koje su im potrebne na milijardama web stranica. Pretraživači, onlajn finansijske usluge i sajtovi za e-trgovinu bili bi potpuno beskorisni bez sredstava za analizu ogromnih količina podataka u ovim sektorima. Zaista, sredstva za obradu string informacija su vitalna komponenta gotovo svakog sektora koji je na ovaj ili onaj način povezan sa modernim informacionim tehnologijama. Ovo poglavlje se fokusira na mogućnosti obrade stringova u PHP-u. Pogledat ćemo neke standardne string funkcije (postoji ih više od 60 u jeziku!), a navedene definicije i primjeri će vam dati informacije koje su vam potrebne za kreiranje web aplikacija. Ali prije nego što uđemo u specifičnosti PHP-a, želim da vas upoznam sa osnovnim mehanizmom koji omogućava usklađivanje uzoraka. Govorimo o regularnim izrazima.

Regularni izrazi

Regularni izrazi su osnova svih modernih tehnologija podudaranja uzoraka. Regularni izraz je niz jednostavnih i uslužnih znakova koji opisuju traženi tekst. Ponekad su regularni izrazi jednostavni i jasni (na primjer, riječ pas), ali često sadrže posebne znakove koji imaju posebno značenje u sintaksi regularnog izraza - na primjer,<(?)>.*<\/.?>.

Postoje dvije porodice funkcija u PHP-u, od kojih je svaka druga vrsta regularnog izraza: u POSIX stilu ili u Perl stilu. Svaki tip regularnog izraza ima svoju sintaksu i razmatra se u odgovarajućem dijelu poglavlja. O ovoj temi napisani su brojni udžbenici koji se mogu naći i na webu i u knjižarama. Stoga ću dati samo osnovne informacije o svakoj vrsti, a dodatne informacije možete pronaći i sami ako želite. Ako već niste upoznati s načinom na koji regularni izrazi funkcioniraju, svakako pročitajte kratki uvodni vodič koji zauzima ostatak ovog odjeljka. A ako ste dobro upućeni u ovu oblast, slobodno prijeđite na sljedeći odjeljak.

Sintaksa regularnog izraza (POSIX)

Struktura POSIX regularnih izraza donekle podsjeća na strukturu tipičnih matematičkih izraza - različiti elementi (operatori) se kombinuju jedni s drugima kako bi formirali složenije izraze. Međutim, smisao za kombinovanje elemenata čini regularne izraze tako moćnim i izražajnim alatom. Mogućnosti nisu ograničene na traženje doslovnog teksta (kao što je određena riječ ili broj); možete pretraživati ​​nizove sa različitom semantikom ali sličnom sintaksom -- na primjer, sve HTML oznake u datoteci.

Najjednostavniji regularni izraz odgovara jednom literalnom karakteru -- na primjer, izraz g odgovara nizovima kao što je g , cjenkaj se i torba. Izraz koji nastaje spajanjem više literalnih znakova poklapa se prema istim pravilima -- na primjer, sekvenca gan se podudara u bilo kojem nizu koji sadrži te znakove (na primjer, gang, organizuj ili Reagan).

Operater | (vertikalna traka) testira da li se jedna od nekoliko alternativa podudara. Na primjer, regularni izraz php | zend provjerava string za php ili zend.

Uglaste zagrade

Uglaste zagrade () imaju posebno značenje u kontekstu regularnih izraza -- oni znače "bilo koji znak naveden unutar zagrada". Za razliku od php regularnog izraza, koji se podudara u svim redovima koji sadrže php literalni tekst, izraz se poklapa sa bilo kojim redom koji sadrži znakove p ili h. Uglate zagrade igraju važnu ulogu u radu s regularnim izrazima, jer proces pretraživanja često uključuje zadatak pronalaženja znakova iz datog intervala. Ispod su neki najčešće korišteni intervali:

  • -- odgovara bilo kojoj decimalnoj cifri od 0 do 9;
  • -- odgovara bilo kojem malom slovu od a do z;
  • -- odgovara bilo kojem velikom znaku od A do Z;
  • -- odgovara svim malim ili velikim slovima od a do z.

Naravno, gore navedeni intervali samo pokazuju opći princip. Na primjer, možete koristiti razmak za predstavljanje bilo koje decimalne cifre od 0 do 3, ili razmak za predstavljanje bilo kojeg znaka malog slova od b do v. Ukratko, intervali se određuju potpuno proizvoljno.

Kvantifikatori

Postoji posebna klasa uslužnih znakova koji označavaju broj ponavljanja jednog karaktera ili konstrukcije zatvorenih u uglaste zagrade. Ovi specijalni znakovi (+, * i (...)) se pozivaju kvantifikatori. Princip njihovog rada najlakše je objasniti na primjerima:

  • p+ znači jedan ili više p znakova u nizu;
  • p* znači nula ili više p znakova u nizu;
  • R? znači nula ili jedan znak p;
  • p(2) znači dva p simbola u nizu;
  • p(2,3) znači dva do tri p znaka u nizu;
  • p(2,) znači dva ili više p karaktera u nizu.

Ostali servisni znakovi

Servisni znakovi $ i ^ ne odgovaraju simbolima, već određenim pozicijama u nizu. Na primjer, izraz p$ označava string koji se završava znakom p, a izraz ^p označava niz koji počinje znakom p.

  • Konstrukcija [^a-zA-Z] odgovara bilo kojem znaku nisu uključeni u naznačenim intervalima (a-z i A-Z).
  • Servisni simbol. (tačka) znači "bilo koji znak". Na primjer, izraz p.p odgovara znaku p, nakon čega slijedi proizvoljni znak, a zatim opet znak p.

Kombinovanje simbola usluge rezultira složenijim izrazima. Pogledajmo nekoliko primjera:

  • ^.(2)$ -- bilo koji niz koji sadrži glatko dva znaka;
  • (.*)-- proizvoljan niz znakova između<Ь>I(vjerovatno HTML oznake za prikaz podebljanog teksta);
  • p(hp)* -- znak p iza kojeg slijedi nula ili više instanci niza hp (na primjer, phphphp).

Ponekad morate pronaći posebne znakove u nizovima umjesto da ih koristite u posebnom opisanom kontekstu. Da biste to učinili, uslužni znakovi se izlaze sa obrnutom kosom crtom (\). Na primjer, da biste potražili iznos novca u dolarima, možete koristiti izraz \$+, to jest "znak dolara iza kojeg slijedi jedna ili više decimalnih znamenki". Obratite pažnju na obrnutu kosu crtu ispred $. Moguća podudaranja za ovaj regularni izraz su $42, $560 i $3.

Standardni intervalni izrazi (klase znakova)

Radi lakšeg programiranja, POSIX standard je definirao neke standardne intervalne izraze, koji se također nazivaju klase karaktera(klase karaktera). Klasa znakova definira jedan znak iz datog raspona -- na primjer, slovo abecede ili broj:

  • [[:alpha:]] -- abecedni znak (aA-zZ);
  • [[:digit:]]-cifra (0-9);
  • [[:alnum:]] -- abecedni znak (aA-zZ) ili broj (0-9);
  • [[:space:]] -- razmak (novi redovi, tabulatori, itd.).

PHP funkcije za rad sa regularnim izrazima (POSIX kompatibilan)

PHP trenutno podržava sedam funkcija pretraživanja koristeći regularne izraze u POSIX stilu:

  • ereg();
  • ereg_replace();
  • eregi();
  • eregi_replace();
  • podijeliti();
  • podijeliti();
  • sql_regcase().

Opisi ovih funkcija dati su u sljedećim odjeljcima.

Funkcija ereg() pretražuje dati niz za podudaranje za uzorak. Ako se pronađe podudaranje, vraća se TRUE, u suprotnom se vraća FALSE. Sintaksa funkcije ereg() je:

int ereg (uzorak niza, niz niza [, podudaranje niza])

Pretraživanje se vrši uzimajući u obzir mala slova abecednih znakova. Primjer korištenja ereg() za pretraživanje nizova domains.com:

$is_com - ereg("(\.)(com$)", $email):

// Funkcija vraća TRUE ako $email završava znakovima ".com".

// Konkretno, pretraga će biti uspješna za stringove

// "www.wjgilmore.com" i " [email protected]"

Imajte na umu da zbog prisustva simbola $, regularni izraz odgovara samo ako se niz završava znakovima .com. Na primjer, odgovara nizu "www.apress.com", ali neće odgovarati u redu "www.apress.com/catalog".

Opcijski parametar podudaranja sadrži niz podudaranja za sve podizraze zatvorene u zagradama u regularnom izrazu. Listing 8.1 pokazuje kako koristiti ovaj niz za podjelu URL-a na više segmenata.

Listing 8.1. Štampanje elemenata niza $regs

$url = "http://www.apress.com";

// Podijelite $url na tri komponente: "http://www". "apress" i "com"

$www_url = ereg("^(http://www)\.([[:alnum:]+\.([[:alnum:]]+)". $url, $regs);

if ($www_url) : // Ako $www_url sadrži URL

echo $regs; // Cijeli niz "http://www.apress.com"

print "
";

echo $regs[l]; // "http://www"

print "
";

echo $regs; // "apress"

print "
";

echo $regs; // "com" endif;

Pokretanje skripte u Listingu 8.1 proizvodi sljedeći izlaz:

http://www.apress.com http://www apress com

Funkcija ereg_replace() pretražuje dati niz za podudaranje za uzorak i zamjenjuje ga novim fragmentom. Sintaksa funkcije ereg_replace():

string ereg_replace (uzorak niza, zamjena niza, string string)

Funkcija ereg_replace() radi na istom principu kao i ereg(), ali su njene mogućnosti proširene od jednostavnog pretraživanja do pretraživanja sa zamjenom. Nakon izvršenja zamjene, funkcija vraća izmijenjeni niz. Ako odgovara

nedostaju, linija ostaje u istom stanju. Funkcija ereg_replace(), kao i ereg(), razlikuje velika i mala slova. Ispod je jednostavan primjer koji pokazuje upotrebu ove funkcije:

$copy_date = "Autorska prava 1999":

$copy_date = ereg_replace("(+)". "2000", $copy_date);

print $copy_date: // Ispisuje string "Copyright 2000"

Jedna zanimljiva karakteristika PHP-ovih alata za pretragu i zamjenu je mogućnost korištenja povratnih referenci na dijelove glavnog izraza zatvorene u zagradama. Povratne reference su slične elementima opcionog parametra podudaranja ereg(), s jednim izuzetkom: povratne reference se pišu kao \0, \1, \2, itd., gdje \0 odgovara cijelom nizu, \1 odgovara uspješnom podudaranju prvi podizraz, itd. Izraz može sadržavati do 9 povratnih veza. Sljedeći primjer zamjenjuje sve URL veze u tekstu funkcionalnim hipervezama:

$url = "Apress (http://www.apress.com");

$url = ereg_replace("http://(()*)", " \\0", $url);

// Prikazana je linija:

// Apress (http://www.apress.com)

Funkcija eregi() pretražuje dati niz za podudaranje za uzorak. Sintaksa funkcije eregi():

int eregi (uzorak niza, niz niza [, podudaranje niza])

Pretraga je u toku isključujući mala slova abecednih znakova. Funkcija eregi() je posebno korisna za provjeru valjanosti unesenih stringova (na primjer, lozinki). Upotreba funkcije eregi() prikazana je u sljedećem primjeru:

$password = "abc";

if (! eregi("[[:alnum:]](8.10), $password) :

print "Nevažeća lozinka! Lozinke moraju biti dugačke od 8 do 10 karaktera.";

// Kao rezultat izvršavanja ovog fragmenta, prikazuje se poruka o grešci.

// jer dužina niza "abc" nije unutar dozvoljenog intervala

// od 8 do 10 znakova.

Funkcija eregi_replace() radi potpuno isto kao i ereg_replace(), s jednim izuzetkom: pretraga je neosjetljiva na velika i mala slova. Sintaksa funkcije ereg_replace():

string eregi_replace (šablon niza, zamjena niza, string string)

Funkcija split() dijeli string na elemente čije su granice određene datim uzorkom. Sintaksa funkcije split() je:

dijeljenje niza (uzorak niza, string string [, int prag])

Opcijski parametar praga specificira maksimalan broj elemenata na koje je niz podijeljen s lijeva na desno. Ako obrazac sadrži abecedne znakove, funkcija spl it() razlikuje velika i mala slova. Sljedeći primjer pokazuje upotrebu funkcije split() za podjelu kanonske IP adrese na triplete:

$ip = "123.345.789.000"; // Kanonska IP adresa

$iparr = split ("\.", $ip) // Zato što je tačka uslužni karakter.

// mora se izbjeći.

print "$iparr
"; // Izlazi "123"

print "$iparr
"; // Izlazi "456"

print "$iparr
"; // Izlazi "789"

print "$iparr
"; // Izlazi "000"

Funkcija split() radi isto kao i njen prototip split(), sa jednim izuzetkom: it ne uzima u obzir registar znakova. Sintaksa funkcije spliti() je:

array spliti (uzorak niza, string string [, int prag])

Naravno, velika i mala slova su važna samo ako obrazac sadrži abecedne znakove. Za druge znakove, izvođenje split() je potpuno isto kao i split().

Pomoćna funkcija sql_regcase() zatvara svaki znak u ulaznom nizu u uglaste zagrade i dodaje mu odgovarajući znak. Sintaksa funkcije sql_regcase():

string sql_regcase (string string)

Ako abecedni znak postoji u dvije varijante (velika i mala slova), izraz u uglastim zagradama će sadržavati obje varijante; u suprotnom, originalni znak se ponavlja dva puta. Funkcija sql_regcase() je posebno korisna kada koristite PHP sa softverskim paketima koji podržavaju regularne izraze za jedan slučaj. Primjer pretvaranja niza pomoću funkcije sql_regcase():

$version = "php 4.0";

print sql_regcase($version);

// Prikazuje string [..]

Sintaksa regularnog izraza u Perl stilu

Pretvaranje niza u velika i mala slova

Postoje četiri funkcije u PHP-u dizajnirane da mijenjaju velika i mala slova u nizu:

  • strtolower();
  • strtoupper();
  • ucfirst();
  • ucwords().

Sve ove karakteristike su detaljno opisane u nastavku.

strtolower()

Funkcija strtolower() pretvara sve abecedne znakove u nizu u mala slova. Sintaksa funkcije strtolower() je:

string strtolower(string string)

Funkcija ne mijenja znakove koji nisu abecedni. Pretvaranje niza u mala slova pomoću funkcije strtolower() prikazano je u sljedećem primjeru:

$rečenica = strtolower($rečenica);

// "kuvanje i programiranje php-a su moje dvije omiljene zabave!"

Nizovi se mogu konvertovati ne samo u mala, već i u velika slova. Pretvorbu izvodi funkcija strtoupper() koja ima sljedeću sintaksu:

string strtoupper (string string)

Funkcija ne mijenja znakove koji nisu abecedni. Pretvaranje niza u velika slova pomoću funkcije strtoupper() prikazano je u sljedećem primjeru:

$sentence = "kuvanje i programiranje PHP-a su moje dve omiljene zabave!";

$rečenica = strtoupper($rečenica);

// Nakon poziva funkcije $sentence sadrži string

// "KUVANJE I PROGRAMIRANJE PHP SU MOJE DVE OMILJENE ZABAVE!"

Funkcija ucfirst() konvertuje prvi znak niza u velika slova, pod uslovom da je to abecedni znak. sintaksa funkcije ucfirst():

string ucfirst (string string)

Funkcija ne mijenja znakove koji nisu abecedni. Konverzija prvog znaka niza pomoću funkcije ucfirst() prikazana je u sljedećem primjeru:

&sentence = "kuvanje i programiranje PHP-a su moje dve omiljene zabave!";

$rečenica = ucfirst($rečenica);

// Nakon poziva funkcije $sentence sadrži string

// "Kuvanje i programiranje PHP-a su moje dvije omiljene zabave!"

Funkcija ucwords() pretvara prvo slovo svake riječi u nizu u velika slova. Sintaksa funkcije ucwords():

string ucwords (string string")

Funkcija ne mijenja znakove koji nisu abecedni. "Riječ" je definirana kao niz znakova odvojen od ostalih elemenata niza razmacima. Sljedeći primjer pokazuje kako funkcija ucwords() pretvara prve znakove riječi:

$sentence = "kuvanje i programiranje PHP-a su moje dve omiljene zabave!";

$rečenica = ucwords($rečenica);

// Nakon poziva funkcije $sentence sadrži string

// "Kuvanje i programiranje PHP su moje dvije omiljene zabave!"

Projekat: Identifikacija pretraživača

Svaki programer koji pokušava da napravi web stranicu prilagođenu korisniku mora uzeti u obzir razlike u formatiranju stranica kada pregledava stranicu u različitim pretraživačima i operativnim sistemima. Iako W3 konzorcijum (http://www.w3.org) nastavlja da objavljuje standarde kojih se programeri moraju pridržavati prilikom kreiranja web aplikacija, programeri pretraživača vole da dodaju svoja mala „poboljšanja“ ovim standardima, što na kraju izaziva haos i konfuziju . Programeri često rješavaju ovaj problem kreiranjem različitih stranica za svaki tip pretraživača i operativnog sistema - ovo značajno povećava opterećenje, ali rezultirajuća stranica je idealna za svakog korisnika. Rezultat je dobra reputacija stranice i povjerenje da će je korisnik ponovo posjetiti.

Da bi se omogućilo korisniku da vidi stranicu u formatu koji je prikladan za njihov pretraživač i operativni sistem, informacije o pretraživaču i platformi se izdvajaju iz dolaznog zahtjeva za stranicu. Nakon prijema potrebnih podataka, korisnik se preusmjerava na željenu stranicu.

Projekat ispod (sniffer.php) pokazuje kako koristiti PHP funkcije za rad sa regularnim izrazima za dohvaćanje informacija iz upita. Program određuje tip i verziju pretraživača i operativnog sistema, a zatim prikazuje primljene informacije u prozoru pretraživača. Ali prije nego što pređemo na stvarnu analizu programa, želim predstaviti jednu od njegovih glavnih komponenti - standardnu ​​PHP varijablu $HTTP_USER_AGENT. Ova varijabla pohranjuje različite informacije o korisnikovom pretraživaču i operativnom sistemu u string formatu – upravo ono što nas zanima. Ove informacije se mogu lako prikazati na ekranu samo jednom komandom:

echo $HTTP USER_AGENT;

Kada koristite Internet Explorer 5.0 na Windows 98 računaru, rezultat će izgledati ovako:

Mozilla/4.0 (kompatibilan; MSIE 5.0; Windows 98; DigExt)

Za Netscape Navigator 4.75 prikazani su sljedeći podaci:

Mozilla/4.75 (Win98; U)

Sniffer.php izvlači potrebne podatke iz $HTTP_USER_AGENT koristeći obradu stringova i funkcije regularnog izraza. Programski algoritam u pseudokodu:

  • Definirajte dvije funkcije za identifikaciju pretraživača i operativnog sistema: browser_info() i opsys_info(). Počnimo s pseudokodom funkcije browser_info().
  • Odredite tip pretraživača pomoću funkcije eged(). Iako je ova funkcija sporija od pojednostavljenih string funkcija poput strstr(), u ovom slučaju je zgodnija jer regularni izraz omogućava da odredite verziju pretraživača.
  • Koristite if/elseif konstrukciju da identifikujete sledeće pretraživače i njihove verzije: Internet Explorer, Opera, Netscape i pretraživač nepoznatog tipa.
  • Vratite informacije o tipu pretraživača i verziji kao niz.
  • Opsys_info() funkcija određuje tip operativnog sistema. Ovaj put se koristi funkcija strstr(), jer se tip OS određuje bez korištenja regularnih izraza.
  • Koristite if/elseif konstrukciju za identifikaciju sljedećih sistema: Windows, Linux, UNIX, Macintosh i nepoznati operativni sistem.
  • Vratite informacije o operativnom sistemu.

Listing 8.3. Identifikacija tipa pretraživača i klijentskog operativnog sistema

Fajl: sniffer.php

Svrha: Identifikacija tipa/verzije pretraživača i platforme

// Funkcija: browser_info

// Svrha: Vraća tip i verziju pretraživača

funkcija browser_info ($agent) (

// Odredite tip pretraživača

// Traži potpis Internet Explorera

if (ereg("MSIE (.(1,2))", $agent, $verzija))

$browse_type = "IE";

$browse verzija = $verzija;

// Traži potpis Opera

elseif (ereg("Opera (.(1,2))". $agent, $verzija)):

$browse_type = "Opera":

$browse_version = $verzija:

// Traži Netscape potpis. Provjera Netscape pretraživača

// *mora* biti urađeno nakon provjere Internet Explorera i Opera,

// jer svi ovi pretraživači vole prijaviti ime

// Mozilla zajedno sa pravim imenom.

elseif (ereg("Mozilla/(.(1,2))". $agent, $version)) :

$browse_type = "Netscape";

$browse_version = $verzija;

// Osim ako nije Internet Explorer, Opera ili Netscape.

// znači da smo otkrili nepoznati pretraživač,

$browse_type = "Nepoznato";

$browse_version = "Nepoznato";

// Vraća tip pretraživača i verziju kao niz

povratni niz ($browse_type, $browse_version);

) // Kraj funkcije browser_info

// Funkcija: opsys_info

// Svrha: Vraća informacije o korisnikovom operativnom sistemu

funkcija opsys_info($agent) (

// Identificirajte operativni sistem

// Traži Windows potpis

if (strstr($agent. "pobjeda")) :

$opsys = "prozori";

// Traži Linux potpis

elseif (strstr($agent, "Linux")) :

$opsys = "Linux";

// Traži UNIX potpis

elseif (strstr (Sagent, "Unix")) :

$opsys = "Unix";

// Potražite Macintosh potpis

elseif (strstr($agent, "Mac")) :

$opsys = "Macintosh";

// Nepoznata platforma ostalo:

$opsys = "Nepoznato";

// Vraćanje informacija o operativnom sistemu

lista ($browse_type. $browse_version) = browser_info ($HTTP_USER_AGENT); Soperating_sys = opsysjinfo($HTTP_USER_AGENT);

print "Tip pretraživača: $browse_type
";

print "Verzija pretraživača: $browse_version
";

print "Operativni sistem: $operating_sys
":

To je sve! Na primjer, ako korisnik koristi Netscape 4.75 pretraživač na Windows računaru, prikazat će se sljedeći izlaz:

Tip pretraživača: Netscape

Verzija pretraživača: 4.75

Operativni sistem: Windows

U sljedećem poglavlju naučit ćete kako se kretati između stranica, pa čak i kreirati stilove za određene operativne sisteme i pretraživače.

Rezultati

Ovo poglavlje pokrilo je dosta materijala. Kakva je korist od programskog jezika ako ne možete raditi s tekstom u njemu? Obradili smo sljedeće teme:

  • opšte informacije o regularnim izrazima u POSIX i Perl stilovima;
  • standardne PHP funkcije za rad sa regularnim izrazima;
  • promjena dužine linije;
  • određivanje dužine niza;
  • alternativne PHP funkcije za obradu string informacija;
  • pretvaranje običnog teksta u HTML i obrnuto;
  • mijenjanje velikih i malih slova znakova u nizovima.

Sljedeće poglavlje otvara drugi dio knjige – inače, moj omiljeni. U njemu ćemo početi da istražujemo PHP-ove alate orijentisane na veb, posmatramo proces dinamičkog kreiranja sadržaja, uključujući datoteke, i pravljenja uobičajenih šablona. Kasnija poglavlja u drugom dijelu pokrivaju rad sa HTML obrascima, bazama podataka, praćenje podataka o sesiji i naprednim alatima za šablone. Držite se - zabava uskoro počinje!

Sadržaj

$user_info

Ovo su svi ključevi definirani za $user_info u loadUserSettings(). Neki su, svakako, razumljivi sami po sebi.

grupe

niz. Sve moguće grupe članova su također priložile korisnika. Ključevi nisu bitni. Vrijednosti su grupe, dezinficirane kao int, za svaki slučaj. Ovo uključuje:

  • Primarna grupa
  • Grupa za broj postova
  • Dodatne grupe. Oni su pohranjeni u bazi podataka kao nizovi razdvojeni zarezima.

possibly_robot

bool. Istina je ako agent odgovara poznatom pauku ako je funkcija omogućena, a ako je onemogućena, daje obrazovanu pretpostavku.

id

int Odgovara vrijednosti baze podataka člana "id_member".!}

korisničko ime

ime

string. Njihovo prikazano ime.

email

passwd

jezik

is_guest

is_admin

tema

last_login

int. Unix vremenska oznaka.

ip

$_SERVER["REMOTE_ADDR"]

ip2

$_SERVER["BAN_CHECK_IP"]

postova

int. Broj postova.

time_format

string. Prilagođeni format za strtftime().

time_offset

int. Odstupanje po satu korisnika od vremena na forumu.

avatar

  • url:string
  • naziv datoteke:string
  • custom_dir: bool
  • id_attach: int

smiley_set

poruke

int. Broj PM-a koje imaju.

unread_messages

int. Broj nepročitanih PM-ova koje imaju.

total_time_logged_in

drugari

String. Lista njihovih prijatelja razdvojena zarezima.

ignoreboards

String. Lista ploča koje su ignorisali ograničena je zarezima.

ignoreusers

String. Lista korisnika za koje su odlučili da ignorišu ograničena je zarezima.

  • U SMF 1.1.x zanemaruju se samo PM-ovi.
  • U SMF 2.0.x i novijim verzijama, ova funkcija je poboljšana kako bi se sakrile i objave zanemarenog korisnika.

upozorenje

int. Njihove tačke upozorenja.

dozvole

query_see_board

Lista svih ploča koje mogu vidjeti kao dio pripremljene SQL izjave.

query_wanna_see_board

Spisak ploča koje ŽELE da vide kao deo pripremljene SQL izjave.

mod_cache

is_mod

Boolean. Netačno osim u forumima gdje je član moderator. Uvijek je postavljeno.

Oni koji su manje-više ozbiljno studirali PHP znajte da postoji jedan vrlo koristan globalni niz PHP koji se zove $_SERVER. I u ovom članku želio bih analizirati najpopularnije ključeve i njihove vrijednosti u ovom nizu, jer je poznavanje njih jednostavno obavezno čak i za početnika PHP programer.

Prije nego počnete globalni niz $_SERVER u PHP-u, odmah ću vam dati mali nagovještaj. Ugrađena je odlična karakteristika PHP, koji se zove phpinfo(). Navedimo odmah primjer njegove upotrebe:

phpinfo();
?>

Kao rezultat izvršavanja ove jednostavne skripte, vidjet ćete ogromnu tabelu sa raznim Postavke PHP interpretatora, uključujući, pri kraju će biti tabela vrijednosti globalni niz $_SERVER. Prikazaće sve ključeve i sve njihove odgovarajuće vrednosti. Kako vam ovo može pomoći? A činjenica je da ako vam treba ova ili ona vrijednost, a zaboravite kako se zove ključ, onda koristite funkciju phpinfo() Uvijek se možete sjetiti njegovog imena. Općenito, vi ćete izvršiti ovu skriptu i odmah ćete me razumjeti.

Pređimo sada na najpopularnije na ključeve niza $_SERVER:

  • HTTP_USER_AGENT- ovaj ključ vam omogućava da saznate karakteristike klijenta. U većini slučajeva, ovo je svakako pretraživač, međutim, ne uvijek. I opet, ako je pretraživač, onda koji, o tome možete saznati u ovoj varijabli.
  • HTTP_REFERER- sadrži apsolutnu putanju do te datoteke ( PHP skripta, HTML stranica), sa koje smo prešli na ovu skriptu. Grubo rečeno, odakle je došao klijent.
  • SERVER_ADDR - IP adresa server.
  • REMOTE_ADDR - IP adresa klijent.
  • DOCUMENT_ROOT- fizički put do korijenskog direktorija stranice. Ova opcija je postavljena putem Konfiguracijski fajl Apache servera.
  • SCRIPT_FILENAME- fizički put do pozvane skripte.
  • QUERY_STRING- vrlo korisna vrijednost koja vam omogućava da dobijete string sa zahtjevom, a zatim možete analizirati ovaj niz.
  • REQUEST_URI- još korisnija vrijednost koja sadrži ne samo sam zahtjev, već i relativnu putanju do pozvane skripte iz korijena. Ovo se vrlo često koristi za uklanjanje dupliciranja index.php, odnosno kada imamo takve URL: "http://mysite.ru/index.php" i " http://mysite.ru/" vodi na jednu stranicu, i URL-ovi različita, dakle dupliciranje, što će loše uticati na optimizaciju pretraživača. I uz pomoć REQUEST_URI možemo odrediti: sa index.php ili nije skripta pozvana. I možemo napraviti preusmjeravanje sa index.php(ako je bio prisutan u REQUEST_URI) uključeno bez index.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". To jest, riješili smo se dupliranja uklanjanjem iz URL ovo index.php.
  • SCRIPT_NAME- relativna putanja do pozvane skripte.

Možda su to svi elementi globalni niz $_SERVER u PHP-u koji se redovno koriste. Morate ih poznavati i biti u mogućnosti da ih koristite kada je potrebno.

5. februar , 2017

Ne znam nikakav PHP framework. Ovo je tužno i sramotno, ali još nije zakonom zabranjeno. Ali u isto vrijeme želim da se igram sa REST API-jem. Problem je što php podrazumevano podržava samo $_GET i $_POST. A za RESTful uslugu takođe morate biti u mogućnosti da radite sa PUT, DELETE i PATCH. I nije baš očigledno kako kulturno obraditi mnoge zahtjeve poput UZMI http://site.ru/users, IZBRIŠI http://site.ru/goods/5 i druge opscenosti. Kako sve takve zahtjeve umotati u jednu tačku, univerzalno ih raščlaniti na dijelove i pokrenuti potreban kod za obradu podataka?

Skoro svaki PHP framework to može učiniti iz kutije. Na primjer, Laravel, gdje je rutiranje implementirano jasno i jednostavno. Ali što ako trenutno ne trebamo proučavati novu veliku temu, već samo želimo brzo pokrenuti projekat s REST API podrškom? O tome će biti riječi u članku.

Šta bi naša RESTful usluga trebala moći?

1. Podržava svih 5 glavnih vrsta zahtjeva: GET, POST, PUT, PATCH, DELETE.
2. Riješite različite rute pogleda
POŠTA /roba
PUT /roba/(goodId)
GET /users/(userId)/info
i drugi proizvoljno dugi lanci.

Pažnja: ovaj članak nije o osnovama REST API-ja
Pretpostavljam da ste već upoznati sa REST pristupom i razumete kako on funkcioniše. Ako ne, onda na internetu postoji mnogo sjajnih članaka o osnovama REST-a - ne želim da ih dupliram, moja ideja je da pokažem kako raditi sa REST-om u praksi.

Koju ćemo funkcionalnost podržavati?

Razmotrimo 2 entiteta - proizvode i korisnike.

Za proizvode, opcije su sljedeće:

  • 1. UZMI /robu/(goodId)— Dobivanje informacija o proizvodu
  • 2. POŠTA /roba— Dodavanje novog proizvoda
  • 3. PUT /roba/(goodId)— Uređivanje proizvoda
  • 4. ZAkrpa /roba/(goodId)— Uređivanje nekih parametara proizvoda
  • 5. IZBRIŠI /roba/(goodId)— Uklanjanje proizvoda

Za korisnike, radi raznolikosti, razmotrimo nekoliko opcija sa GET-om

  • 1. GET /korisnici/(userId)— Kompletne informacije o korisniku
  • 2. GET /users/(userId)/info— Samo opšte informacije o korisniku
  • 3. GET /users/(userId)/orders— Lista narudžbi korisnika

Kako će ovo raditi sa izvornim PHP-om?

Prva stvar koju ćemo uraditi je da podesimo .htaccess tako da svi zahtevi budu preusmereni na datoteku index.php. On je taj koji će se baviti ekstrakcijom podataka.

Drugo, hajde da odlučimo koji nam podaci trebaju i napišemo kod da ih dobijemo - u index.php.
Zainteresovani smo za 3 vrste podataka:

  • 1. Metoda zahtjeva (GET, POST, PUT, PATCH ili DELETE)
  • 2. Podaci sa URL-a, na primjer, users/(userId)/info - potrebna su sva 3 parametra
  • 3. Podaci od tijela zahtjeva
I treće, napisat ćemo kod koji pokreće potrebne funkcije. Funkcije su podijeljene u datoteke, sve je Feng Shui, dodavanje novih staza i metoda za RESTful uslugu će biti vrlo jednostavno.

.htaccess

Kreirajmo .htaccess datoteku u korijenu projekta

RewriteEngine na RewriteCond %(REQUEST_FILENAME) !-f RewriteRule ^(.+)$ index.php?q=$1

Ovim misterioznim redovima naređujemo vam da uradite ovo:
1 - šaljite sve zahtjeve bilo koje vrste u king-datoteku index.php
2 - učinite string u URL-u dostupnim u index.php u parametru get q. Odnosno, podaci sa URL-a kao što je /users/(userId)/info dobićemo od $_GET["q"].

index.php

Pogledajmo index.php red po red. Prvo, hajde da dobijemo metodu zahteva.

// Definirajte metodu zahtjeva $method = $_SERVER["REQUEST_METHOD"];

Zatim podaci od tijela zahtjeva

// Dobivanje podataka iz tijela zahtjeva $formData = getFormData($method);

Za GET i POST, lako je izvući podatke iz odgovarajućih nizova $_GET i $_POST. Ali za druge metode morate biti malo izopačeni. Kod za njih se izvlači iz toka php://input, kod je jednostavan za Google, upravo sam napisao opći omot - funkciju getFormData($method)

// Dobivanje podataka iz funkcije tijela zahtjeva getFormData($method) ( // GET ili POST: vraćanje podataka onako kako jesu ako ($method === "GET") vraćanje $_GET; if ($method === "POST") ) return $_POST // PUT, PATCH ili DELETE $data = array("&", file_get_contents("php://input")($exploded as $pair) ($item = explode); ("=", $pair if (count($item) == 2) ($data = urldecode($item); ) ) return $data;

Odnosno, dobili smo potrebne podatke skrivajući sve detalje u getFormData - pa, odlično. Pređimo na najzanimljiviji dio - rutiranje.

// Parsiraj url $url = (isset($_GET["q"])) ? $_GET["q"] : ""; $url = rtrim($url, "/"); $urls = explode("/", $url);

Iznad smo naučili da će .htaccess staviti parametre iz URL-a u q-parametar niza $_GET. To jest, $_GET["q"] će sadržavati nešto poput ovoga: korisnici/10. Bez obzira koji metod koristimo da izvršimo zahtjev.

A explode("/", $url) pretvara ovaj string u niz za nas, s kojim već možemo raditi. Stoga, napravite onoliko dugačke lance upita koliko želite, na primjer,
GET /goods/page/2/limit/10/sort/price_asc
I budite sigurni da ćete dobiti niz

$urls = array("goods", "page", "2", "limit", "10", "sort", "price_asc");

Sada imamo sve podatke, moramo s njima nešto korisno učiniti. I samo 4 linije koda će to učiniti

// Definirajte ruter i podatke o url-u $router = $urls; $urlData = array_slice($urls, 1); // Povežite datoteku rutera i pokrenite glavnu funkciju include_once "routers/" . $router. ".php"; route($method, $urlData, $formData);

Da li shvatate? Kreiramo folder rutera u koji stavljamo fajlove koji manipulišu jednim entitetom: proizvodima ili korisnicima. Istovremeno, slažemo se da se imena datoteka poklapaju sa prvim parametrom u urlData - to će biti ruter, $router. I ovaj ruter treba ukloniti iz urlData, više nam nije potreban i koristi se samo za povezivanje potrebne datoteke. array_slice($urls, 1) i daće nam sve elemente niza osim prvog.

Sada ostaje samo da povežete željeni fajl rutera i pokrenete funkciju rute sa tri parametra. Koja je ova ruta funkcije? Dogovorimo se da će u svakom fajlu rutera biti definisana funkcija koja će na osnovu ulaznih parametara odrediti koju radnju je korisnik pokrenuo i koja će izvršiti traženi kod. Sada će biti jasnije. Razmotrimo prvi zahtjev - dobijanje podataka o proizvodu.

UZMI /robu/(goodId)

File routers/goods.php

// Funkcija rutera route($method, $urlData, $formData) ( // Dobivanje informacija o proizvodu // GET /goods/(goodId) if ($method === "GET" && count($urlData) == = 1) ( // Dobiti id proizvoda $goodId = $urlData; // Izvući proizvod iz baze podataka... // Izlaz odgovora klijentu echo json_encode(array("method" => "GET", "id" => $goodId, "dobro" => "telefon", "price" => 10000) // Vraćanje zaglavlja greške("HTTP/1.0 400 Loš zahtjev"); error" => "Loš zahtjev") "));

Sadržaj datoteke je jedna velika funkcija rute, koja, ovisno o proslijeđenim parametrima, izvodi potrebne radnje. Ako se metoda GET i 1 parametar (goodId) prosljeđuju urlData, onda je ovo zahtjev za dobivanje podataka o proizvodu.

Pažnja: primjer je vrlo pojednostavljen
U stvarnom životu, naravno, potrebno je dodatno provjeriti ulazne parametre, na primjer, da je goodId broj. Umjesto da ovdje pišete kod, vjerovatno ćete uključiti potrebnu klasu. I da biste primili proizvod, kreirajte objekat ove klase i pozovite neki metod na njemu.
Ili možda prebacite kontrolu na neki kontroler, koji će se već pobrinuti za inicijalizaciju potrebnih modela. Postoji mnogo opcija, razmatramo samo opštu strukturu koda.

U odgovoru klijentu prikazujemo potrebne podatke: naziv proizvoda i njegovu cijenu. ID proizvoda i metoda su potpuno opcioni u stvarnoj aplikaciji. Prikazujemo ih samo da bismo bili sigurni da je ispravna metoda pozvana sa ispravnim parametrima.

Pokušajmo s primjerom: otvorite konzolu pretraživača i pokrenite kod

$.ajax((url: "/examples/rest/goods/10", metoda: "GET", dataType: "json", uspjeh: function(response)(console.log("response:", odgovor))) )

Kod će poslati zahtjev serveru na kojem sam postavio sličnu aplikaciju i poslati odgovor. Provjerite je li ruta koja vas zanima /roba/10 stvarno funkcionirao. Na kartici Mreža primijetit ćete isti zahtjev.
I da, /examples/rest je korijenski put naše testne aplikacije do stranice

Ako ste više navikli koristiti curl u konzoli, pokrenite ovo u terminalu - odgovor će biti isti, pa čak i sa zaglavljima sa servera.

Curl -X GET https://site/examples/rest/goods/10 -i

Na kraju funkcije napisali smo sljedeći kod.

// Vraća zaglavlje greške("HTTP/1.0 400 loš zahtjev"); echo json_encode(array("error" => "Loš zahtjev"));

To znači da ako smo pogriješili s parametrima ili tražena ruta nije definirana, vratit ćemo klijentu grešku 400 Bad Request. Na primjer, dodajte nešto poput ovoga u URL: goods/10/another_param i vidjet ćete grešku u konzoli i 400 odgovor - krivi zahtjev nije prošao.

Po HTTP kodovima odgovora servera
Nećemo se zamarati sa izbacivanjem različitih kodova, iako je to vrijedno učiniti prema REST-u. Postoje mnoge greške klijenta. Čak iu našem jednostavnom slučaju, 405 je prikladan u slučaju pogrešno prenesene metode. Ne želim namerno da komplikujem stvari.
Ako bude uspješan, naš server će uvijek vratiti 200 OK. Srećom, kada kreirate resurs, trebali biste dati 201 Created. Ali opet, u smislu pojednostavljenja, odbacit ćemo ove suptilnosti, ali u stvarnom projektu možete ih lako implementirati sami.

Iskreno govoreći, članak je gotov. Mislim da već razumijete pristup, kako se rješavaju sve rute, preuzimaju podaci, kako ih testirati, kako dodati nove zahtjeve itd. Ali da upotpunim sliku, dat ću implementaciju preostalih 7 upita koje smo naveli na početku članka. Usput ću napraviti par zanimljivih komentara, a na kraju ću objaviti arhivu sa izvornim kodom.

POŠTA /roba

Dodavanje novog proizvoda

// Dodavanje novog proizvoda // POST /goods if ($method === "POST" && empty($urlData)) ( // Dodavanje proizvoda u bazu podataka... // Izlaz odgovora klijentu echo json_encode (array("method" => "POST", "id" => rand(1, 100), "formData" => $formData));

urlData je sada prazan, ali se koristi formData - jednostavno ćemo ga prikazati klijentu.

Kako to učiniti "kako treba"?
Prema kanonima REST-a, u zahtjevu za objavu trebate vratiti samo id kreiranog entiteta ili url po kojem se ovaj entitet može dobiti. Odnosno, odgovor će biti ili samo broj - (dobar id), ili /roba/(goodId).
Zašto sam napisao "tačno" pod navodnicima? Da, jer REST nije skup strogih pravila, već preporuka. A kako ćete ga implementirati zavisi od vaših preferencija ili već prihvaćenih sporazuma o konkretnom projektu.
Samo imajte na umu da će drugi programer koji čita kod i svjestan REST pristupa u odgovoru na zahtjev nakon objave očekivati ​​id kreiranog objekta ili url iz kojeg se podaci o ovom objektu mogu dohvatiti zahtjevom za dobivanje.

Testiranje sa konzole

$.ajax((url: "/examples/rest/goods/", metoda: "POST", podaci: (dobro: "bilježnica", cijena: 20000), dataType: "json", uspjeh: funkcija(odgovor)( console.log("response:", odgovor))))

Curl -X POST https://site/examples/rest/goods/ --data "good=notebook&price=20000" -i

PUT /roba/(goodId)

Uređivanje proizvoda

// Ažuriraj sve podatke o proizvodu // PUT /goods/(goodId) if ($method === "PUT" && count($urlData) === 1) ( // Dobij id proizvoda $goodId = $urlData; / / Ažurirajte sva polja proizvoda u bazi podataka... // Iznesite odgovor klijentu echo json_encode(array("method" => "PUT", "id" => $goodId, "formData" => $formData)) ;

Ovdje se svi podaci već koriste u potpunosti. ID proizvoda se izvlači iz urlData, a svojstva se izvlače iz formData.

Testiranje sa konzole

$.ajax((url: "/examples/rest/goods/15", metoda: "PUT", podaci: (dobro: "bilježnica", cijena: 20000), dataType: "json", uspjeh: funkcija (odgovor) (console.log("response:", odgovor))))

Curl -X PUT https://site/examples/rest/goods/15 --data "good=notebook&price=20000" -i

ZAkrpa /roba/(goodId)

Djelomično ažuriranje proizvoda

// Djelomično ažuriranje podataka o proizvodu // PATCH /goods/(goodId) if ($method === "PATCH" && count($urlData) === 1) ( // Dobijte id proizvoda $goodId = $urlData; // Ažuriramo samo navedena polja proizvoda u bazi podataka... // Iznosimo odgovor klijentu echo json_encode(array("method" => "PATCH", "id" => $goodId, "formData" => $formData));

Testiranje sa konzole

$.ajax((url: "/examples/rest/goods/15", metoda: "PATCH", podaci: (cijena: 25000), dataType: "json", uspjeh: function(response)(console.log(" odgovor:", odgovor))))

Curl -X PATCH https://site/examples/rest/goods/15 --data "price=25000" -i

Čemu ovo razmetanje sa PUT i PATCH?
Zar jedan PUT nije dovoljan? Zar ne izvode istu radnju - ažuriraju podatke objekta?
Tako je - spolja radnja je jedna. Razlika je u prenošenim podacima.
PUT to pretpostavlja Sve objektna polja i PATCH - samo promijenio. Oni poslani u tijelu zahtjeva. Imajte na umu da smo u prethodnom PUT-u proslijedili i naziv proizvoda i cijenu. A u PATCH-u - samo cijena. Odnosno, na server smo poslali samo promijenjene podatke.
Da li vam je potreban PATCH - odlučite sami. Ali zapamtite onog programera za čitanje koda kojeg sam spomenuo gore.

IZBRIŠI /roba/(goodId)

Uklanjanje proizvoda

// Brisanje proizvoda // IZBRIŠI /goods/(goodId) if ($method === "IZBRIŠI" && count($urlData) === 1) ( // Dobij id proizvoda $goodId = $urlData; // Izbrišite proizvod iz baze podataka... // Iznesite odgovor klijentu echo json_encode(array("method" => "DELETE", "id" => $goodId));

Testiranje sa konzole

$.ajax((url: "/examples/rest/goods/20", metoda: "DELETE", dataType: "json", uspjeh: function(response)(console.log("response:", odgovor))) )

Curl -X DELETE https://site/examples/rest/goods/20 -i

Sve je jasno sa zahtjevom DELETE. Pogledajmo sada rad sa korisnicima - ruter korisnika i, shodno tome, datoteku users.php

GET /korisnici/(korisnički ID)

Preuzimanje svih korisničkih podataka. Ako je GET zahtjev sličan /users/(userId), tada ćemo vratiti sve informacije o korisniku ako je dodatno navedeno /info ili /naredbe, zatim, shodno tome, samo opšte informacije ili spisak narudžbi.

// Funkcija rutera route($method, $urlData, $formData) ( // Dobivanje svih informacija o korisniku // GET /users/(userId) if ($method === "GET" && count($urlData) = = = 1) ( // Dobijte ID proizvoda $userId = $urlData; // Izvucite sve podatke o korisniku iz baze podataka... // Iznesite odgovor klijentu echo json_encode(array("method" => " GET", "id" = > $userId, "info" => array("email" => " [email protected]", "name" => "Webdevkin"), "orders" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "01/12/2017"), array (" orderId" => 8, "summa" => 5000, "orderDate" => "02/03/2017"))) // Vrati zaglavlje greške("HTTP/1.0 400 Bad Request"); echo json_encode( array("error" => "Loš zahtjev"));

Testiranje sa konzole

$.ajax((url: "/examples/rest/users/5", metoda: "GET", dataType: "json", uspjeh: function(response)(console.log("response:", odgovor))) )

Curl -X GET https://site/examples/rest/users/5 -i

GET /users/(userId)/info

Opće informacije o korisniku

// Dobivanje općih informacija o korisniku // GET /users/(userId)/info if ($method === "GET" && count($urlData) === 2 && $urlData === "info") ( / / Dobiti id proizvoda $userId = $urlData // Izvucite općenite podatke o korisniku iz baze podataka... // Iznesite odgovor klijentu echo json_encode("method" => "GET", "id; " => $userId, " info" => array("email" => " [email protected]", "name" => "Webdevkin"))); povratak; )

Testiranje sa konzole

$.ajax((url: "/examples/rest/users/5/info", metoda: "GET", dataType: "json", uspjeh: function(response)(console.log("response:", odgovor) )))

Curl -X GET https://site/examples/rest/users/5/info -i

GET /users/(userId)/orders

Dobivanje liste narudžbi korisnika

// Primanje narudžbi korisnika // GET /users/(userId)/narudžbi if ($method === "GET" && count($urlData) === 2 && $urlData === "narudžbe") ( // Get product id $userId = $urlData // Dohvati podatke o narudžbama korisnika iz baze podataka... // Izlaz odgovora klijentu echo json_encode("method" => "GET", "id" => $; userId, "orders" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "01/12/2017"), array("orderId" => 8, "summa " => 5000, "orderDate " => "02/03/2017")))); povratak; )

Testiranje sa konzole

$.ajax((url: "/examples/rest/users/5/orders", metoda: "GET", dataType: "json", uspjeh: function(response)(console.log("response:", odgovor) )))

Curl -X GET https://site/examples/rest/users/5/orders -i

Rezultati i izvori

Izvori iz primjera članaka -

Kao što vidite, organizacija podrške za REST API u native php-u se pokazala ne tako teškom i na potpuno legalan način. Glavna stvar je podrška za rute i nestandardne PHP metode PUT, PATCH i DELETE.

Glavni kod koji implementira ovu podršku se uklapa u 3 tuceta linija index.php. Ostalo je samo pojas koji se može implementirati na bilo koji način. Predložio sam da se to uradi u obliku plug-in datoteka rutera, čiji nazivi odgovaraju entitetima vašeg projekta. Ali možete iskoristiti svoju maštu i pronaći zanimljivije rješenje.

Dobiva WP_User objekt koji sadrži sve navedene podatke korisnika.

Podaci koje vraćaju funkcije u potpunosti odgovaraju poljima tablica baze podataka: wp_users i wp_usermeta (opis tablice).

Ovo je mogućnost priključivanja - tj. može se zamijeniti iz dodatka. To znači da će raditi (povezati) tek nakon što su svi dodaci povezani, a do ovog trenutka funkcija još nije definirana... Dakle, ne možete pozvati ovu i funkcije koje o njoj zavise direktno iz koda dodatka. Treba ih pozvati preko plugins_loaded kuke ili kasnije, kao što je init hook.

Zamjena funkcije (nadglasavanje) - u dodatku možete kreirati funkciju s istim imenom, a zatim će zamijeniti trenutnu funkciju.

✈ 1 put = 0,000296s = brzo| 50000 puta = 0,78s = vrlo brzo| PHP 7.1.2RC1, WP 4.7.2

Nema udica.

Povratak

WP_User/false. Objekt podataka ili lažno ako se navedeni korisnik ne može pronaći.

Upotreba

get_userdata($userid); $userid (broj) (obavezno) ID korisnika čije podatke želite da preuzmete.
Podrazumevano: ne

Primjeri

#1 Kako izvesti podatke iz primljenog objekta podataka

$user_info = get_userdata(1); echo "Korisničko ime: " . $user_info->user_login . "\n"; echo "Nivo pristupa: " . $user_info->user_level . "\n"; echo "ID: " . $user_info->ID . "\n"; /* Izlazi: Korisničko ime: admin Nivo pristupa: 10 ID: 1 */

#1.2 Podaci u varijablu

Još jedan primjer, samo ovdje ćemo prvo podatke upisati u varijable, a zatim ih prikazati na ekranu:

$user = get_userdata(1); $username = $user->user_login; $first_name = $user->first_name; $last_name = $user->last_name; echo "$first_name $last_name prijavljen na stranicu pod login: $username."; /* Objekt $user: WP_User Object( => stdClass Object( => 80 => kogian => $P$BJFHKJfUKyWv1TwLOVAENYU0JGNsq. => kogian => [email protected]=> http://example.com/ => 2016-09-01 00:34:42 => => => kogian) => 80 => Array( => 1) => wp_capabilities => Array( => pretplatnik) => Niz( => 1 => 1 => 1) => => 1) */

#2 Metode klase

Objekt dobiven get_userdata() je instanca klase i ima metode koje se mogu koristiti. Ponekad ovo može dobro doći. Evo jednostavnog primjera dobivanja korisničke opcije pomoću metode $user->get():

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

Spisak nekih metoda:

    get($key) - vraća vrijednost opcije;

    has_prop($key) - provjerava da li je navedena opcija instalirana;

    has_cap($cap) - provjerava da li korisnik ima navedenu sposobnost ili ulogu;

    get_role_caps() - Dobiva sve mogućnosti uloge korisnika i kombinuje ih sa individualnim mogućnostima korisnika;

    add_role($role) - dodaje ulogu korisniku;

    remove_role($role) - uklanja ulogu od korisnika;

  • set_role($role) - postavlja ulogu korisnika;

Bilješke

Evo nekih korisnih vrijednosti polja tabele wp_users i wp_usermeta koje možete koristiti za dohvaćanje podataka:

  • display_name

user_meta

  • korisnički_opis

    wp_capabilities (niz)

    admin_color (tema admin panela. Zadano - svježe)

    closepostboxes_page

  • izvorni_domen

Također treba napomenuti da su se od verzije 3.2 vraćeni podaci neznatno promijenili: vraćen je objekt WP_User. Podaci u objektu su podijeljeni u grupe: podaci, kape, uloge (ranije su podaci vraćani u općoj listi).

Međutim, zahvaljujući "magičnim" (korisnim) metodama PHP-a, podaci se mogu dobiti kao i prije, na primjer, sada se podaci pohranjuju ovako: get_userdata(1)->data->rich_editing , ali ih možete dobiti kao ovo: get_userdata(1)->rich_editing , iako var_dump() neće pokazati ovaj odnos.

Kod dobiti korisničke podatke: wp-includes/pluggable.php WP 5.2.2

document.write("");
mob_info