Superglobalni niz $_SERVER. $_SERVER - Podaci o poslužitelju i izvršnom okruženju Collegium korisničke informacije php

Nepromišljenost je kada vas strast sprječava da razmišljate.

Smiješni aforizmi

Nepromišljenost kao osobina ličnosti - sklonost ne razmišljati o posljedicama svojih postupaka; ponašati se nedovoljno promišljeno, glupo, nepromišljeno; nesposobnost da se duboko i temeljito razmisli, da se nešto ispravno shvati.

Jedne oštre zime obitelji je ponestalo drva za ogrjev. Otac je izašao na periferiju, našao mrtvo stablo i posjekao ga. U proljeće je vidio izdanke kako izbijaju iz panja stabla koje je posjekao. “Bio sam siguran,” rekao je otac, “da je ovo drvo mrtvo.” Tada je bilo toliko hladno da su joj grane od mraza pucale, lomile se i padale na zemlju, kao da u korijenju nije ostala ni kap života. Sada vidim da je život još svjetlucao u ovom sanduku.

I, okrenuvši se svom sinu, rekao je: "Zapamti ovu lekciju." Nikad ne sjeci drvo zimi. Nikada ne donosite odluke bez razmišljanja, u krivo vrijeme ili kada ste u lošem stanju uma. Čekati. Budite strpljivi, loša vremena će proći. Zapamtite da će se proljeće vratiti.

Nepromišljenost je kći gluposti i gluposti. Ovo je odsustvo bilo kakve prisutnosti zdravog razuma. Zamišljenost govori o nepažnji i nepoštivanju ljudi. Koga volimo i poštujemo, do njega nam je stalo, brinemo se i brinemo, pa zamišljamo sve nijanse, sve sitnice koje bi mu mogle naškoditi ili smetati u životu. Koga ne poštujemo i ne cijenimo, pokazujemo nepromišljenost.

Nepromišljenost je saveznik idiotizma, gluposti, gluposti i bezumlja.

Tip glumeći radoznalost pita zgodnu stjuardesu: - Curo, što znači TU-154-2B? - Zar se ne možete sami sjetiti? Pa TU znači da je avion proizveo konstruktor Tupoljev, 150 je broj sjedala u kabini, a 4 je broj članova posade. - A 2B? - Pa očito ti je nepromišljenost jača strana! Ovo smo Marinka i ja.

Nepromišljenost je kada osoba živi ne shvaćajući da će za svaki postupak morati odgovarati. Ne pada mu na pamet pomisao da će mu se posljedice njegovih postupaka, poput bumeranga, vratiti po zakonu karme. I dobro i loše sigurno će se opet vratiti.

Nepromišljenost je dokazani način izazivanja neugodnosti onima oko vas.

V. Schlachter kaže da nepromišljenost vrlo često doživljavamo kao glupost. Ili čak zbog bestijalnosti. Na primjer, vozač je ušao u prometno raskrižje. Blokirao je promet svima koji su stajali na sporednoj cesti i čekali da se upali zeleno svjetlo na semaforu. Ali on je to učinio, najvjerojatnije, ne iz bijesa, a ne zato što je bio glupi, podli grubijan. Jednostavno nije zamarao svoju jadnu glavicu da razmisli o posljedicama. Sada mu svi trube (češće njoj!) i nazivaju ga najnelaskavijim epitetima iz neformalnog vokabulara.

"Ostavite mački puno vode, neće me biti tri dana", kaže mama. A moj sin donese mačku pakiranje plastičnih boca od litre i pol. Pij, mačko! Njegovom sinu ne pada ni na pamet činjenica da mačka ne može otvoriti bocu i piti iz nje. Tražili su još vode - donio je još, u čemu je problem? Nije ovo napravio iz gluposti. I to ne iz mržnje prema nesretnoj mački. Od nepromišljenosti!

Glupost pada na um puno prije nego razum. Uvijek ga prate ishitrene presude.

Učitelj je uvijek upozoravao svoje učenike na nepromišljenost, odnosno na ishitrene sudove o ljudima, a još više na nepromišljene savjete. Rekao je ovo: “Sve dok u svom srcu i umu ne osjetite da ste pronikli u samu bit problema i da vas ne napušta ni najmanja sumnja da činite pravu stvar, neka vaš najbolji postupak bude nečinjenje, a najsigurniji riječ budi tišina.” Inače će vaš savjet prisiliti ljude da ponove sudbinu seljaka koji pati od nepromišljenosti.

Što mu se dogodilo? - pitali su učenici. - Njegovu kuću, koja stoji na brežuljku, sa svih su strana zapuhali žestoki vjetrovi. Seljak je iz nepromišljenosti naivno vjerovao da se vjetar pojavljuje jer se visoka stabla koja okružuju kuću njišu s jedne strane na drugu. Jednog dana se naljutio i posjekao sva stabla. Zbog toga je kuća, izgubivši posljednju zaštitu, postala još hladnija i vjetrovitija.

Lakomislenost je pošast ljudi koji misle samo na svoje interese.

Zastavnik pita vojnika: - Što učiniti u slučaju nuklearne eksplozije? "Legnite s nogama prema bljesku i pokrijte se rukama", odgovara on. - Pogrešno. Morate ispružiti ruke naprijed s mitraljezom kako rastaljeni metal ne bi kapao na čizme koje je izdala vlada.

Nepromišljenost gura osobu u okruženje neizvjesnosti. Kada čovjek ne može zamisliti što će se dogoditi za nekoliko minuta, to znači da živi u stanju potpune neizvjesnosti.

Moj muž se vratio s poslovnog puta. Nema nikoga kod kuće. Odlučio sam se sakriti kako bih iznenadio svoju ženu. Odjednom ugleda svoju ženu kako ulazi u stan s nekim muškarcem. Odlaze u spavaću sobu. Vrata se zatvaraju, muž trči do ključanice. I vidi svoju ženu kako se ljubi s tim čovjekom, skida joj svu odjeću, oboje se bacaju na krevet, on skida odjeću i baca gaćice prema ulaznim vratima, gdje se suprug skriva, a oni, viseći na ručku, dobro zatvorite bravu mužu i cijeli pregled. A onda muž iznervirano pomisli: "Pa to je izgubljen dan, opet potpuna neizvjesnost!"

Peter Kovalev

5. veljače , 2017

Ne znam nijedan PHP okvir. To je žalosno i sramotno, ali još nije zakonom zabranjeno. Ali u isto vrijeme želim se igrati s REST API-jem. Problem je što php standardno podržava samo $_GET i $_POST. A za RESTful uslugu također morate znati raditi s PUT, DELETE i PATCH. I nije baš očito kako kulturno obraditi mnoge zahtjeve poput PREUZMI http://site.ru/users, IZBRIŠI http://site.ru/goods/5 i druge opscenosti. Kako zamotati sve takve zahtjeve u jednu točku, univerzalno ih raščlaniti na dijelove i pokrenuti potreban kod za obradu podataka?

Gotovo svaki PHP okvir to može učiniti odmah. Na primjer, Laravel, gdje je usmjeravanje implementirano jasno i jednostavno. Ali što ako trenutno ne trebamo proučavati novu veliku temu, već samo želimo brzo pokrenuti projekt s podrškom za REST API? O tome će se raspravljati u članku.

Što bi naša RESTful usluga trebala moći učiniti?

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

Pažnja: ovaj članak ne govori o osnovama REST API-ja
Pretpostavljam da ste već upoznati s REST pristupom i da razumijete kako funkcionira. Ako ne, onda postoji mnogo sjajnih članaka na internetu o osnovama REST-a - ne želim ih duplirati, moja je ideja pokazati kako raditi s REST-om u praksi.

Koju ćemo funkcionalnost podržavati?

Razmotrimo 2 entiteta - proizvode i korisnike.

Za proizvode, opcije su sljedeće:

  • 1. GET /roba/(goodId)— Dobivanje informacija o proizvodu
  • 2. POST /roba— Dodavanje novog proizvoda
  • 3. PUT /roba/(goodId)— Uređivanje proizvoda
  • 4. PATCH /roba/(goodId)— Uređivanje nekih parametara proizvoda
  • 5. DELETE /roba/(goodId)— Uklanjanje proizvoda

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

  • 1. GET /korisnici/(userId)— Potpuni podaci o korisniku
  • 2. GET /users/(userId)/info— Samo opći podaci o korisniku
  • 3. GET /users/(userId)/orders— Popis korisničkih naloga

Kako će ovo funkcionirati s izvornim PHP-om?

Prvo što ćemo napraviti je postaviti .htaccess tako da se svi zahtjevi preusmjeravaju na datoteku index.php. On je taj koji će se baviti izvlačenjem podataka.

Drugo, odlučimo koji nam podaci trebaju i napišimo kod za primanje - u index.php.
Zanimaju nas 3 vrste podataka:

  • 1. Metoda zahtjeva (GET, POST, PUT, PATCH ili DELETE)
  • 2. Podaci s URL-a, na primjer korisnici/(userId)/info - potrebna su sva 3 parametra
  • 3. Podaci iz 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 bit će vrlo jednostavno.

.htaccess

Kreirajmo .htaccess datoteku u korijenu projekta

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

Ovim misterioznim redcima zapovijedamo vam da učinite ovo:
1 - pošaljite sve zahtjeve bilo koje vrste u king-file index.php
2 - učinite niz u URL-u dostupnim u index.php u get parametru q. Odnosno, podaci s URL-a poput /korisnici/(userId)/info dobit ćemo od $_GET["q"].

indeks.php

Pogledajmo index.php red po red. Prvo, uzmimo metodu zahtjeva.

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

Zatim podaci iz 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 treba biti malo perverzan. Kod za njih se izvlači iz streama php://unos, kod je jednostavan za Google, upravo sam napisao opći omot - getFormData($method) funkcija

// Dobivanje podataka iz funkcije tijela zahtjeva getFormData($method) ( // GET ili POST: vrati podatke kakvi jesu if ($method === "GET") return $_GET; if ($method === "POST" ) return $_POST; // PUT, PATCH ili DELETE $data(); explode("&", file_get_contents("php://input")); foreach($exploded as $pair) ($item = explode ("=", $pair); if (count($item) == 2) ( $data = urldecode($item); ) ) return $data;

Odnosno, dobili smo potrebne podatke skrivanjem svih detalja u getFormData - pa, super. Prijeđimo na najzanimljiviji dio – rutiranje.

// Raščlanite url $url = (isset($_GET["q"])) ? $_GET["q"] : ""; $url = rtrim($url, "/"); $urls = explode("/", $url);

Gore smo saznali da će .htaccess staviti parametre iz URL-a u q-parametar niza $_GET. Odnosno, $_GET["q"] će sadržavati nešto poput ovoga: korisnici/10. Bez obzira koju metodu koristimo za izvršenje zahtjeva.

A eksplodirati("/", $url) pretvara ovaj niz u niz za nas, s kojim već možemo raditi. Stoga napravite koliko god duge lance upita, na primjer,
GET /goods/page/2/limit/10/sort/price_asc
I budite uvjereni, dobit ćete niz

$urls = array("roba", "stranica", "2", "limit", "10", "sort", "price_asc");

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

// Definirajte usmjerivač i url podatke $router = $urls; $urlData = array_slice($urls, 1); // Povežite datoteku usmjerivača i pokrenite glavnu funkciju include_once "usmjerivači/" . $usmjerivač. ".php"; route($method, $urlData, $formData);

shvaćate li Stvaramo mapu routera u koju stavljamo datoteke koje manipuliraju jednim entitetom: proizvodima ili korisnicima. U isto vrijeme, slažemo se da se nazivi datoteka podudaraju s prvim parametrom u urlData - to će biti usmjerivač, $router. I ovaj router treba ukloniti iz urlData, više nam ne treba i služi samo za povezivanje tražene datoteke. array_slice($urls, 1) i dat će nam sve elemente niza osim prvog.

Sada preostaje samo spojiti željenu datoteku usmjerivača i pokrenuti funkciju rute s tri parametra. Koja je ova ruta funkcije? Dogovorimo se da će u svakoj datoteci usmjerivača biti definirana funkcija koja će na temelju ulaznih parametara odrediti koju je radnju korisnik pokrenuo i izvršiti traženi kod. Sada će postati jasnije. Razmotrimo prvi zahtjev - dobivanje podataka o proizvodu.

GET /roba/(goodId)

Usmjerivači datoteka/roba.php

// Funkcija usmjerivača route($method, $urlData, $formData) ( // Dobivanje informacija o proizvodu // GET /goods/(goodId) if ($method === "GET" && count($urlData) == = 1) ( // Dobivanje id-a proizvoda $goodId = $urlData; // Izvlačenje proizvoda iz baze podataka... // Izlaz odgovora klijentu echo json_encode(array("method" => "GET", "id" => $goodId, "good" => "phone", "price" => 10000)); greška" => "Loš zahtjev") "));

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

Pažnja: primjer je vrlo pojednostavljen
U stvarnom životu, naravno, morate dodatno provjeriti ulazne parametre, na primjer, da je goodId broj. Umjesto da ovdje pišete kod, vjerojatno ćete uključiti traženu klasu. A da biste primili proizvod, kreirajte objekt ove klase i pozovite neku metodu na njemu.
Ili možda prebaciti kontrolu na neki kontroler, koji će se već pobrinuti za inicijalizaciju potrebnih modela. Postoji mnogo opcija, mi samo razmatramo opću strukturu koda.

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

Pokušajmo s primjerom: otvorite konzolu preglednika i pokrenite kôd

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

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

Ako ste navikli koristiti curl u konzoli, pokrenite ovo u terminalu - odgovor će biti isti, čak i sa zaglavljima s poslužitelja.

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

Na kraju funkcije napisali smo sljedeći kod.

// Vrati zaglavlje pogreške ("HTTP/1.0 400 Bad Request"); echo json_encode(array("greška" => "Loš zahtjev"));

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

http kodovima odgovora poslužitelja
Nećemo se zamarati ispisivanjem različitih kodova, iako se to isplati učiniti prema REST-u. Postoji mnogo pogrešaka klijenata. Čak iu našem jednostavnom slučaju, 405 je prikladan u slučaju netočno proslijeđene metode. Ne želim namjerno komplicirati stvari.
Ako bude uspješan, naš poslužitelj će uvijek vratiti 200 OK. Srećom, kada stvarate 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 rečeno, članak je gotov. Mislim da već razumijete pristup, kako se sve rute rješavaju, podaci se dohvaćaju, 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 dati nekoliko zanimljivih komentara, a na kraju ću postaviti arhivu s izvornim kodom.

POST /roba

Dodavanje novog proizvoda

// Dodavanje novog proizvoda // POST /roba 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 trebali biste vratiti samo ID stvorenog entiteta ili url s kojeg se taj entitet može dobiti. To jest, odgovor će biti samo broj - (dobarId), ili /roba/(goodId).
Zašto sam napisao "ispravno" pod navodnicima? Da, jer REST nije skup strogih pravila, već preporuka. A kako ćete to provesti ovisi o vašim preferencijama ili već prihvaćenim dogovorima na konkretnom projektu.
Samo imajte na umu da će drugi programer koji čita kod i svjestan REST pristupa u odgovoru na zahtjev za objavu očekivati ​​ID kreiranog objekta ili url s kojeg se podaci o ovom objektu mogu dohvatiti zahtjevom za dobivanje.

Testiranje s konzole

$.ajax((url: "/examples/rest/goods/", metoda: "POST", podaci: (dobar: "bilježnica", cijena: 20000), dataType: "json", uspjeh: funkcija (odgovor)( console.log("odgovor:", 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) ( // Dohvati ID proizvoda $goodId = $urlData; / / Ažuriraj sva polja proizvoda u bazi podataka... // Izlaz odgovora klijentu echo json_encode(array("method" => "PUT", "id" => $goodId, "formData" => $formData)) ;

Ovdje su svi podaci već iskorišteni u potpunosti. ID proizvoda izvlači se iz urlData, a svojstva iz formData.

Testiranje s konzole

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

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

PATCH /roba/(goodId)

Djelomično ažuriranje proizvoda

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

Testiranje s konzole

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

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

Čemu sve ovo razmetanje s PUT i PATCH?
Nije li dovoljan jedan PUT? Ne izvode li istu radnju - ažuriraju podatke objekta?
Tako je - prema van radnja je jedna. Razlika je u prenesenim podacima.
PUT pretpostavlja da se poslužitelj šalje svi polja objekata, i samo PATCH promijenjeno. One poslane 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 poslužitelj smo poslali samo promijenjene podatke.
Trebate li PATCH - odlučite sami. Ali sjetite se onog programera za čitanje koda kojeg sam gore spomenuo.

DELETE /roba/(goodId)

Uklanjanje proizvoda

// Brisanje proizvoda // DELETE /goods/(goodId) if ($method === "DELETE" && count($urlData) === 1) ( // Dohvati ID proizvoda $goodId = $urlData; // Izbriši proizvod iz baze podataka... // Ispis odgovora klijentu echo json_encode(array("method" => "DELETE", "id" => $goodId));

Testiranje s konzole

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

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

Sa zahtjevom DELETE je sve jasno. Sada pogledajmo rad s korisnicima - korisnički usmjerivač i, sukladno tome, datoteku users.php

GET /korisnici/(userId)

Dohvaćanje svih korisničkih podataka. Ako je GET zahtjev kao /korisnici/(userId), tada ćemo vratiti sve podatke o korisniku ako su dodatno navedeni /info ili /narudžbe, zatim, sukladno tome, samo opće informacije ili popis narudžbi.

// Funkcija usmjerivača route($method, $urlData, $formData) ( // Dobivanje svih informacija o korisniku // GET /users/(userId) if ($method === "GET" && count($urlData) = = = 1) ( // Dohvati ID proizvoda $userId = $urlData; // Ekstrahiraj sve podatke o korisniku iz baze podataka... // Ispis odgovora klijentu echo json_encode(array("method" => " GET", "id" = > $userId, "info" => array("email" => " [e-mail zaštićen]", "name" => "Webdevkin"), "orders" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "01/12/2017"), array (" orderId" => 5000, "orderDate" => "02/03/2017")))); // Vrati zaglavlje pogreške ("HTTP/1.0 400 Bad Request" echo json_encode( array("error" => "Loš zahtjev"));

Testiranje s konzole

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

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

GET /users/(userId)/info

Opći podaci o korisniku

// Dobivanje općih informacija o korisniku // GET /users/(userId)/info if ($method === "GET" && count($urlData) === 2 && $urlData === "info") ( / / Dohvaćanje id-a proizvoda $userId = $urlData; // Ekstrahiraj opće podatke o korisniku iz baze podataka... // Izlaz odgovora klijentu echo json_encode(array("method" => "GET", "id " => $userId, " info" => array("email" => " [e-mail zaštićen]", "name" => "Webdevkin"))); povratak; )

Testiranje s konzole

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

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

GET /users/(userId)/orders

Dobivanje popisa korisničkih narudžbi

// Primi korisničke narudžbe // GET /users/(userId)/orders if ($method === "GET" && count($urlData) === 2 && $urlData === "orders") ( // Dobij ID proizvoda $userId = $urlData; // Dohvaćanje podataka o korisničkim narudžbama iz baze podataka... // Izlaz odgovora klijentu echo json_encode(array("method" => "GET", "id" => $ userId, "narudžbe" => niz(niz("orderId" => 5, "summa" => 2000, "orderDate" => "01/12/2017"), array("orderId" => 8, "summa " => 5000, "orderDate " => "02/03/2017")))); povratak; )

Testiranje s konzole

$.ajax((url: "/examples/rest/users/5/orders", metoda: "GET", dataType: "json", uspjeh: funkcija(odgovor)(console.log("odgovor:", 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 izvornom php-u nije bila tako teška i na potpuno legalne načine. Glavna stvar je podrška za rute i nestandardne PHP metode PUT, PATCH i DELETE.

Glavni kod koji implementira ovu podršku stane u 3 tuceta redaka index.php. Ostatak je samo pojas koji se može implementirati na bilo koji način. Predložio sam da to učinite u obliku plug-in datoteka usmjerivača, čija imena odgovaraju entitetima vašeg projekta. Ali možete upotrijebiti svoju maštu i pronaći zanimljivije rješenje.

Prvo ćemo poboljšati stranicu za registraciju dodavanjem mogućnosti učitavanja avatara. Izvorna slika mora biti u jpg, gif ili png formatu. Također ne bi trebao biti veći od 2 MB. Ne brinite, nakon što ga skripta komprimira, veličina avatara bit će oko 3 kb i jpg format. Otvorite stranicu reg.php i dodajte ga u oznaku < oblik> crta enctype="multipart/form-data", kao u primjeru:


Registracija










Sada štedimo reg.php

2. Zatim trebate stvoriti još jedno polje u tablici korisnika. Idemo phpmyadmin, odaberite željenu bazu podataka i tablicu.


Postavili smo sve vrijednosti kao na slici:

Put do avatara bit će zabilježen u ovom polju, a bit će spremljen u posebnu mapu, nazovimo je "avatars". Mapa će se nalaziti u istom direktoriju kao i ostale datoteke skripte.

3.Idite na datoteku uštedjeti_ korisnik. php i dodajte sljedeći kod nakon uklanjanja razmaka iz prijave i lozinke:

//ukloni dodatne razmake
$login = trim($login);

// Dodaj novi ********************************************

//dodajte provjeru duljine prijave i lozinke
if (strlen($login)< 3 or strlen($login) > 15) {
exit("Prijava se mora sastojati od najmanje 3 znaka i ne više od 15.");
}
if (strlen($password)< 3 or strlen($password) > 15) {
exit("Lozinka mora imati najmanje 3 znaka i ne više od 15.");
}

if (!empty($_POST["fupload"])) //provjeri da li je korisnik poslao sliku
{
$fupload=$_POST["fupload"]; $fupload = trim($fupload);
ako ($fupload =="" ili prazno($fupload)) (
unset($fupload);// ako je varijabla $fupload prazna, izbrišite je
}
}
ako (!isset($fupload) ili prazno($fupload) ili $fupload =="")
{
//ako varijabla ne postoji (korisnik nije poslao sliku), tada joj dodijelite unaprijed pripremljenu sliku s natpisom "bez avatara"
$avatar = "avatars/net-avatara.jpg"; //možete nacrtati net-avatara.jpg ili ga preuzeti iz izvora
}
drugo
{
//u suprotnom - učitati sliku korisnika
$path_to_90_directory = "avatars/";//mapa u koju će se učitati početna slika i njena komprimirana kopija

If(preg_match("/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/",$_FILES["fupload"]["name"])) //provjera formata izvorne slike
{
$filename = $_FILES["fupload"]["name"];
$source = $_FILES["fupload"]["tmp_name"];
$target = $path_to_90_directory. $naziv datoteke;
move_uploaded_file($source, $target);//učitavanje originala u mapu $path_to_90_directory
if(preg_match("/[.](GIF)|(gif)$/", $filename)) (
$im = imagecreatefromgif($path_to_90_directory.$filename) ; //ako je izvornik bio u gif formatu, stvorite sliku u istom formatu. Neophodno za naknadnu kompresiju
}
if(preg_match("/[.](PNG)|(png)$/", $filename)) (
$im = imagecreatefrompng($path_to_90_directory.$filename) ;//ako je original bio u png formatu, stvorite sliku u istom formatu. Neophodno za naknadnu kompresiju
}

If(preg_match("/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/", $filename)) (
$im = imagecreatefromjpeg($path_to_90_directory.$filename); //ako je izvornik bio u jpg formatu, stvorite sliku u istom formatu. Neophodno za naknadnu kompresiju
}
//STVARANJE KVADRATNE SLIKE I NJEZINA NAKNADNA KOMPRESIJA PREUZETO S MJESTA www.codenet.ru
// Napravite kvadrat 90x90
// dest - rezultirajuća slika
// w - širina slike
// ratio - koeficijent proporcionalnosti
$w = 90; // kvadrat 90x90. Može se isporučiti u drugim veličinama.
// stvoriti izvornu sliku na temelju
// izvorna datoteka i odredite njezinu veličinu
$w_src = slikex($im); //izračunajte širinu
$h_src = imagesy($im); //izračunaj visinu slike
// stvoriti praznu kvadratnu sliku
// truecolor je važan!, inače ćemo imati 8-bitni rezultat
$dest = imagecreatetruecolor($w,$w);
// izrežite središte kvadrata duž x ako je fotografija vodoravna
ako ($w_src>$h_src)
imagecopyresampled($dest, $im, 0, 0,
krug((max($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
// izrežite kvadratni vrh duž y,
// ako je fotografija okomita (iako možete koristiti i sredinu)
ako ($w_src<$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
min($w_src,$h_src), min($w_src,$h_src));
// kvadratna slika je skalirana bez izrezivanja
ako ($w_src==$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
$datum=vrijeme(); //izračunajte trenutno vrijeme.
imagejpeg($dest, $path_to_90_directory.$date.".jpg");//spremite sliku u jpg formatu u željenu mapu, naziv će biti trenutno vrijeme. Napravljen da spriječi da avatari imaju ista imena.
//zašto jpg? Zauzima vrlo malo prostora + uništava se animacija GIF slike koja ometa korisnika. Nije baš ugodno čitati njegov komentar kad krajičkom oka primijetite neki pokret.
$avatar = $path_to_90_directory.$date.".jpg";//stavite put do avatara u varijablu.
$delfull = $path_to_90_directory.$filename;
prekini vezu ($delfull);//izbriši izvorno učitanu sliku, više nam ne treba. Zadatak je bio dobiti minijaturu.
}
drugo
{
//u slučaju neslaganja formata, izdati odgovarajuću poruku
exit("Avatar mora biti u formatu JPG, GIF ili PNG");
}
//kraj procesa učitavanja i dodjeljivanje varijabli $avatar adrese učitanog ava
}



// dodano novo *********************************************** **
// Slijedi sve iz prvog dijela članka, ali trebate dodati promjenu upita u bazu podataka.
//spojiti se na bazu podataka
// provjerite postoji li korisnik s istom prijavom
$result = mysql_query("SELECT id FROM korisnika WHERE login="$login"",$db);
if (!empty($myrow["id"])) (
exit("Nažalost, prijava koju ste unijeli je već registrirana. Unesite drugu prijavu.");
}
// ako to nije slučaj, spremite podatke
$result2 = mysql_query("INSERT INTO korisnici (prijava,lozinka,avatar) VALUES("$prijava","$lozinka","$avatar")");
// Provjerite ima li grešaka
ako ($result2=="TRUE")
{
echo "Uspješno ste se registrirali! Sada možete ući na stranicu. Početna stranica";
}
drugo(
echo "Greška! Niste registrirani.";
}
?>

4. Trebate dodati jednu tablicu u istu bazu podataka. Pohranit će IP adrese koje su napravile pogreške prilikom prijave. Na ovaj način možemo ograničiti pristup onima koji su pogriješili više od tri puta zaredom na otprilike 15 minuta. Mislim da će programi koji biraju lozinke morati dugo petljati.
Idemo na phpmyadmin i napravimo novu tablicu s 3 polja:


ip - IP adresa.
datum - datum neuspješne prijave u zadnjih 15 minuta za korisnika s ovom ip. col - broj pogrešaka u zadnjih 15 minuta za korisnika s ovom ip.
Sjajno! Gotovo, sada promijenimo datoteku za potvrdu prijave i lozinke jer je sada naša lozinka šifrirana. Otvorite testreg.php i izbrišite sve osim uklanjanja razmaka iz korisničkog imena i lozinke. Zatim dodajemo sljedeći kod:

//ukloni dodatne razmake
$login = trim($login);
$lozinka = trim($lozinka);

// zamijeniti novim******************************************** *******
// povezivanje s bazom podataka
include("bd.php");// datoteka bd.php mora biti u istoj mapi kao i sve ostale, ako nije, samo promijenite putanju
// mini-provjera za odabir lozinke
$ip=getenv("HTTP_X_FORWARDED_FOR");
if (prazno($ip) || $ip=="nepoznato") ( $ip=getenv("REMOTE_ADDR"); )//izdvoj ip
mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");//izbrisati IP adrese korisnika koji su pogriješili prilikom prijave nakon 15 minuta.
$result = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);
$myrow = mysql_fetch_array($rezultat);
if ($myrow["col"] > 2) (
//ako ima više od dvije greške, odnosno tri, izdajemo poruku.
exit("Unijeli ste svoje korisničko ime ili lozinku netočno 3 puta. Pričekajte 15 minuta prije ponovnog pokušaja.");
}
$password = md5($password);//kriptiraj lozinku
$password = strrev($password);// za pouzdanost dodajte obrnuto
$lozinka = $lozinka."b3p6f";
//možete dodati nekoliko vlastitih znakova po svom ukusu, na primjer, unosom "b3p6f". Ako se ova lozinka hakira brutalnom silom na istom md5 poslužitelju, onda očito ništa dobro neće proizaći iz toga. Ali savjetujem vam da stavite druge znakove, možda na početak retka ili u sredini.
//U ovom slučaju potrebno je povećati duljinu polja lozinke u bazi podataka. Šifrirana lozinka može biti mnogo veća.

$result = mysql_query("SELECT * FROM users WHERE login="$login" AND password="$password"",$db); //dohvati iz baze sve podatke o korisniku s unesenom prijavom i lozinkom
$myrow = mysql_fetch_array($rezultat);
if (prazno($myrow["id"]))
{
//ako korisnik s unesenom prijavom i lozinkom ne postoji
//Pravimo zapis da se ovaj ip nije mogao prijaviti.
$select = mysql_query("SELECT ip FROM oshibka WHERE ip="$ip"");
$tmp = mysql_fetch_row($select);
if ($ip == $tmp) (//provjeri je li korisnik u tablici "oshibka"
$result52 = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);
$myrow52 = mysql_fetch_array($result52);
$col = $myrow52 + 1;//dodaj još jedan neuspješni pokušaj prijave
mysql_query("UPDATE error SET col=$col,date=NOW() WHERE ip="$ip"");
}
drugo(
mysql_query("INSERT INTO oshibka (ip,date,col) VRIJEDNOSTI ("$ip",NOW(),"1")");
//ako nije bilo grešaka u zadnjih 15 minuta, tada umetnite novi unos u tablicu "oshibka"
}

exit("Nažalost, korisničko ime ili lozinka koje ste unijeli nisu točni.");
}
drugo(
nbsp; //ako se lozinke podudaraju, pokrećemo sesiju za korisnika! Možete mu čestitati, ušao je!
$_SESSION["password"]=$myrow["password"];
$_SESSION["login"]=$myrow["login"];
$_SESSION["id"]=$myrow["id"];//ovi podaci se vrlo često koriste, tako da će ih prijavljeni korisnik “nositi sa sobom”

//Dalje spremamo podatke u kolačiće za naknadnu prijavu.
//PAŽNJA!!! UČINITE OVO PO SVOJEM NAHOĐENJU BUDUĆI PODATCI SU POHRANJENI U KOLAČIĆIMA BEZ ENKRIPCIJE
if ($_POST["save"] == 1) (
//Ako korisnik želi da se njegovi podaci spremaju za kasniju prijavu, mi ih spremamo u kolačiće njegovog preglednika
setcookie("prijava", $_POST["prijava"], vrijeme()+9999999);
setcookie("lozinka", $_POST["lozinka"], vrijeme()+9999999);
}}
jeka " ";//korisnika preusmjeravamo na glavnu stranicu, gdje ćemo ga obavijestiti o uspješnoj prijavi
?>

5. U potpunosti ćemo promijeniti glavnu stranicu. Na njemu je potrebno prikazati avatar korisnika, prikazati poveznicu za odjavu s računa i dodati okvir za pamćenje lozinke prilikom prijave.
Indeks.php

// cijeli postupak radi u sesijama. Tu se pohranjuju podaci korisnika dok je on na stranici. Vrlo je važno pokrenuti ih na samom početku stranice!!!
početak_sesije();
include("bd.php");// datoteka bd.php mora biti u istoj mapi kao i sve ostale, ako nije, samo promijenite putanju
if (!empty($_SESSION["login"]) i !empty($_SESSION["password"]))
{
//ako postoji prijava i lozinka u sesijama, provjerite ih i dohvatite avatar
$login = $_SESSION["login"];
$lozinka = $_SESSION["lozinka"];
$result = mysql_query("SELECT id,avatar FROM users WHERE login="$login" AND password="$password"",$db);
$myrow = mysql_fetch_array($rezultat);
//izdvojite potrebne korisničke podatke
}
?>


Početna stranica


Početna stranica

if (!isset($myrow["avatar"]) ili $myrow["avatar"]=="") (
//provjerite jesu li korisnički podaci ekstrahirani iz baze podataka. Ako nije, onda nije prijavljen ili je lozinka u sesiji netočna. Prikazujemo prozor za prijavu. Ali nećemo ga pokazati onima koji uđu, njima više ne treba.
ispisati<<


OVDJE;

If (isset($_COOKIE["login"])) //postoji li varijabla s prijavom u COOKIE. Trebao bi biti ako je korisnik kliknuo na potvrdni okvir "Zapamti me" tijekom prethodne prijave
{
//ako da, unesite njegovu vrijednost u obrazac. U tom slučaju korisniku se prikazuje da je njegova prijava već upisana u traženi stupac
echo " value="".$_COOKIE["login"]."">";
}

ispisati<<




OVDJE;

If (isset($_COOKIE["password"]))//postoji li varijabla s lozinkom u COOKIE-u. Trebao bi biti ako je korisnik kliknuo na potvrdni okvir "Zapamti me" tijekom prethodne prijave
{
//ako da, unesite njegovu vrijednost u obrazac. U tom slučaju korisniku se prikazuje da je njegova lozinka već upisana u traženi stupac
echo " value="".$_COOKIE["password"]."">";
}

Ispis<<



Zapamti me.






Registar



Prijavljeni ste kao gost

OVDJE;
}
drugo
{
//ako je prijava uspješna, korisnik dobiva sve ispod između zvjezdica.

ispisati<<
Prijavljeni ste na stranicu kao $_SESSION (izlaz)


Ovaj link dostupan je samo registriranim korisnicima

Vaš avatar:




OVDJE;

//************************************************************************************
//ako je prijava uspješna, korisnik dobiva sve što se nalazi GORE između zvjezdica.
}
?>



6. Prijavljenim korisnicima potrebno je omogućiti odjavu. Na glavnoj stranici je već postojala veza za izlaz. Ali ova datoteka još ne postoji. Dakle, stvorimo novu datoteku izlaz.php s kodom:

početak_sesije();
if (prazno($_SESSION["prijava"]) ili prazno($_SESSION["lozinka"]))
{
//ako nema sesije s prijavom i lozinkom, tada je ovoj datoteci pristupio neprijavljeni korisnik. On ne pripada ovdje. Izdajemo poruku o pogrešci i zaustavljamo skriptu
izlaz ("Pristup ovoj stranici dozvoljen je samo registriranim korisnicima. Ako ste registrirani, prijavite se na stranicu koristeći svoje korisničko ime i lozinku
Početna stranica");
}

poništi($_SESSION["lozinka"]);
poništi($_SESSION["prijava"]);
unset($_SESSION["id"]);// uništavanje varijabli u sesijama
Izlaz(" ");
// poslati korisnika na glavnu stranicu.
?>

OK, sada je sve gotovo! Uživajte za svoje zdravlje! Sretno!



Povezane publikacije