Niemyślenie ma miejsce wtedy, gdy z pasji nie zależy od myśli.

Śmieszne aforyzmy

bezmyślność jako cecha osobowości - skłonność do niemyślenia o konsekwencjach swoich działań; zachowywać się niewystarczająco celowo, głupio, bezmyślnie; niezdolność do głębokiego i dogłębnego myślenia, zrozumienia czegoś poprawnie.

Pewnej ostrej zimy rodzinie zabrakło drewna na opał. Ojciec poszedł na obrzeża, znalazł martwe drzewo i ściął je. Wiosną zobaczył, że pędy przebijają się z wyciętego pniaka. - Byłem pewien - powiedział ojciec - że to drzewo jest martwe. Było wtedy tak zimno, że jego gałęzie pękały, łamały się i spadały z mrozu na ziemię, jakby w korzeniach nie pozostała kropla życia. Teraz widzę, że życie wciąż migotało w tym bagażniku.

I zwracając się do syna, powiedział: - Zapamiętaj tę lekcję. Nigdy nie ścinaj drzewa zimą. Nigdy nie podejmuj decyzji z bezmyślności, w złym czasie lub gdy jesteś w złym stanie umysłu. Czekać. Bądź cierpliwy, złe czasy przeminą. Pamiętaj, że wiosna powróci.

Ignorancja jest córką głupoty i głupoty. Jest to brak jakiejkolwiek obecności zdrowego rozsądku. Bezmyślność mówi o nieuwadze i braku szacunku dla ludzi. Kogo kochamy i szanujemy, troszczymy się, martwimy i martwimy, dlatego myślimy o wszystkich niuansach, wszystkich małych rzeczach, które mogą mu zaszkodzić lub uniemożliwić mu życie. Kogo nie szanujemy i nie doceniamy, okazujemy temu bezmyślność.

Bezmyślność jest sprzymierzeńcem idiotyzmu, głupoty, głupoty i bezmózgi.

Facet udając ciekawość pyta ładnej stewardesy: - Dziewczyno, co oznacza TU-154-2B? — Nie możesz sam o tym pomyśleć? Otóż ​​TU oznacza, że ​​samolot został wyprodukowany przez projektanta Tupolewa, 150 to liczba miejsc w kabinie, a 4 to liczba członków załogi. - A 2B? - Cóż, widać bezmyślność swojego mocnego punktu! To jest Marina i ja.

Bezmyślność jest wtedy, gdy człowiek żyje bez zrozumienia, że ​​będzie musiał odpowiedzieć za każde działanie. Nie przychodzi mu do głowy, że konsekwencje jego działań, jak bumerang, powrócą do niego zgodnie z prawem karmy. Zarówno dobrzy, jak i źli na pewno wrócą.

Bezmyślność to dobrze znany sposób na niedogodności otoczenia.

V. Schlachter mówi, że bardzo często bezmyślność postrzegamy jako głupotę. Albo nawet o bestialstwo. Na przykład kierowca wjechał na ruchliwe skrzyżowanie. Zablokował ruch wszystkim, którzy stoją na bocznej drodze i czekają na zielone światło. Ale z tego zrobił, najprawdopodobniej, nie ze złości, a nie dlatego, że był głupim, podłym brutalem. Po prostu nie zawracał sobie głowy swoją biedną małą główką, by myśleć o konsekwencjach. Teraz wszyscy mu sygnalizują (częściej jej!), Nazywając go najbardziej niepochlebnymi epitetami z nieformalnego słownictwa.

„Zostaw kotu dużo wody, nie będzie mnie na trzy dni” – mówi moja mama. A syn przynosi kotu paczkę plastikowych półtoralitrowych butelek. Pij kotku! To, że kot nie może otworzyć butelki i napić się z niej, nawet nie przychodzi do głowy jego synowi. Poprosili o więcej wody - przyniósł więcej, jakie problemy? Nie zrobił tego z głupoty. I nie z nienawiści do nieszczęsnego kota. Od bezmyślności!

Bezmyślność przychodzi na myśl znacznie wcześniej niż zdrowie psychiczne. Towarzyszą mu zawsze pochopne osądy.

Nauczyciel zawsze ostrzegał swoich uczniów przed bezmyślnością, to znaczy przed pochopnymi sądami o ludziach, a tym bardziej przed pochopnymi radami. Mówił w ten sposób: - Dopóki nie poczujesz w sercu i umyśle, że przeniknąłeś do samej istoty problemu i najmniejsza wątpliwość, że postępujesz właściwie, nie opuści cię, niech twoim najlepszym działaniem będzie bezczynność, a najpewniejsza słowo - cisza. W przeciwnym razie twoja rada sprawi, że ludzie powtórzą los chłopa cierpiącego na bezmyślność.

Co się z nim stało? - zapytali studenci. - Jego dom, stojący na wzgórzu, został zdmuchnięty przez okrutne wiatry ze wszystkich stron. Chłop bezmyślnie naiwnie wierzył, że wiatr pojawił się, ponieważ wysokie drzewa otaczające dom kołysały się z boku na bok. Pewnego dnia rozgniewał się i ściął wszystkie drzewa. W rezultacie dom, tracąc swoją ostatnią ochronę, stał się jeszcze zimniejszy i bardziej wietrzny.

Bezmyślność to plaga ludzi, którzy myślą tylko o własnych interesach.

Chorąży pyta żołnierza: - Co należy zrobić w przypadku wybuchu nuklearnego? – Połóż się stopami do lampy błyskowej i zakryj rękami – odpowiada. - Niewłaściwie. Musisz wyciągnąć ręce do przodu z karabinem maszynowym, aby stopiony metal nie kapał na rządowe buty.

Bezmyślność popycha człowieka w środowisko niepewności. Kiedy dana osoba nie może sobie wyobrazić, co stanie się za kilka minut, oznacza to, że żyje w stanie całkowitej niepewności.

Mąż wrócił z podróży służbowej. Nikogo w domu. Postanowił ukryć się, żeby zaskoczyć żonę. Nagle widzi swoją żonę wchodzącą do mieszkania z jakimś mężczyzną. Wchodzą do sypialni. Drzwi się zamykają, mąż jest bardziej skłonny do dziurki od klucza. I widzi, jak jego żona całuje tego mężczyznę, zdejmuje wszystkie jej ubrania, oboje rzucają się na łóżko, zdejmuje ubranie i rzuca majtki do drzwi wejściowych, gdzie mąż się ukrywa, i oni, wisi na klamce, dobrze zamknij zamek do męża i całą recenzję. A potem mąż myśli z irytacją: - Cóż, straciłem dzień na próżno, znowu pełen niepewności!

Piotr Kowaliow

1 rok temu | 9.8K

W programowaniu bardzo powszechnym zadaniem jest uzyskanie dostępu do innej witryny za pośrednictwem protokołu HTTP lub HTTPS. W tym artykule przyjrzymy się prostemu sposobowi używania języka programowanie PHP wykonać to zadanie.

Po co uzyskiwać dostęp do innej witryny za pomocą PHP przez HTTP lub HTTPS?

Powodów może być kilka, na przykład w Twojej witrynie znajduje się część funkcjonalności, która odpowiada za dodawanie nowych produktów lub katalogów filmów do Twojej witryny.

Nowe filmy pojawiają się na ekranie niemal codziennie i lepiej zautomatyzować ten proces, aby robot mógł to zrobić za darmo.

Z towarami sytuacja jest taka sama - Twój sklep internetowy może mieć partnerów, którzy chcą umieścić swoje towary na Twojej stronie i z każdej sprzedaży towaru partnerzy oddadzą Ci część swoich dochodów. Jeśli partner ma kilka tysięcy produktów, a baza danych jest na bieżąco aktualizowana, proces dodawania produktów do serwisu również musi być zautomatyzowany przy użyciu języka programowania PHP.

Przykład dostępu do innej witryny za pomocą PHP

W tym prosty przykład, użyjemy standardowej funkcji PHP o nazwie file_get_contents().

W odpowiedzi z serwera VK zobaczysz następujące informacje:

( - odpowiedź: [ - ( - id: 210700286, - imię: "Lindsey", - nazwisko: "Stirling", - bdata: "21.09.1986" - ) - ] )

gdzie otrzymaliśmy imię, nazwisko i datę urodzenia użytkownika o identyfikatorze 210700286.

Jak możemy teraz? przy użyciu PHP uzyskać te informacje i przekonwertować je na tablicę, aby ułatwić dalszą pracę?

Korzystając z języka programowania PHP i funkcji file_get_contents(), jest to bardzo łatwe!

$user_id to zmienna, w której wpisujesz identyfikator użytkownika VK,

$informacje- w tej zmiennej zapisujemy wynik dostępu do API VK.COM

Mając tablicę z tymi informacjami, możesz wyświetlać w swojej witrynie użytkowników, których Cię interesuje, w dowolnym celu, a za pomocą , możesz pięknie wyświetlać te informacje w swojej witrynie.

Wniosek

Jak widać, dzięki PHP możesz bardzo łatwo wysyłać żądania do stron HTTP i HTTPS, a omówiliśmy tylko jedną cechę języka programowania PHP, która może być używana do pobierania danych z zewnętrznej strony.

W kolejnych artykułach przyjrzymy się innej ciekawej, ale potężniejszej funkcji, w której można ustawić Dodatkowe opcje, takich jak przeglądarka, system operacyjny i inne, dla bardziej eleganckiej pracy z witrynami zewnętrznymi.

Na początek ulepszymy stronę rejestracji, dodając możliwość wgrania awatara. Obraz źródłowy musi być w formacie jpg, gif lub png. Powinno też być nie więcej niż 2 MB. Nie martw się, po skompresowaniu go za pomocą skryptu rozmiar awatara będzie wynosił około 3 kb, a format to jpg. Otwórz stronę reg.php i dodaj w tagu < Formularz> linia enctype="Dane wieloczęściowe/formularzowe", jak w przykładzie:


Rejestracja










Teraz zapisz reg.php

2. Następnie musisz utworzyć kolejne pole w tabeli użytkownicy. Idziemy do phpmyadmin, wybierz żądaną bazę danych i tabelę.


Ustawiamy wszystkie wartości, jak na rysunku:

Ścieżka do awatara zostanie zapisana w tym polu i zostanie zapisana w osobnym folderze, nazwijmy to „awatary”. Folder będzie znajdować się w tym samym katalogu, co pozostałe pliki skryptów.

3. Przejdź do pliku ratować_ użytkownik. php oraz po usunięciu spacji z loginu i hasła dodaj następujący kod:

//usunąć dodatkowe spacje
$logowanie = przycinanie($logowanie);

// Dodaj nowe ********************************************** ***

// dodaj czek na długość loginu i hasła
if (strlen($login)< 3 or strlen($login) > 15) {
exit ("Login musi składać się z co najmniej 3 znaków i nie więcej niż 15.");
}
if (strlen($hasło)< 3 or strlen($password) > 15) {
exit("Hasło musi mieć co najmniej 3 znaki i co najwyżej 15.");
}

if (!empty($_POST["fupload"])) //Sprawdź, czy użytkownik przesłał obraz
{
$fupload=$_POST["fupload"]; $fupload = przyciąć($fupload);
if ($fupload =="" lub pusty($fupload)) (
unset($fupload);// jeśli zmienna $fupload jest pusta, usuń ją
}
}
if (!isset($fupload) lub pusty($fupload) lub $fupload =="")
{
//jeżeli zmienna nie istnieje (użytkownik nie wysłał obrazka), to przypisz do niej wcześniej przygotowany obrazek z napisem "brak awatara"
$avatar = "avatary/net-avatara.jpg"; //możesz narysować net-avatara.jpg lub pobrać go ze źródła
}
w przeciwnym razie
{
//w przeciwnym razie - załaduj obraz użytkownika
$path_to_90_directory = "avatary/";//folder, w którym zostanie załadowany obraz początkowy i jego skompresowana kopia

If(preg_match("/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/",$_FILES["fupload"]["nazwa"])) //sprawdź oryginalny format obrazu
{
$nazwa pliku = $_FILES["fupload"]["nazwa"];
$źródło = $_FILES["fupload"]["tmp_name"];
$cel = $ścieżka_do_90_katalogu . $nazwa pliku;
move_uploaded_file($source, $target);//prześlij oryginał do $path_to_90_directory
if(preg_match("/[.](GIF)|(gif)$/", $nazwapliku)) (
$im = imagecreatefromgif($ścieżka_do_katalogu_90.$nazwapliku) ; //jeśli oryginał był w formacie gif, to tworzymy obrazek w tym samym formacie. Wymagane do późniejszej kompresji
}
if(preg_match("/[.](PNG)|(png)$/", $nazwapliku)) (
$im = imagecreatefrompng($path_to_90_directory.$filename) ;//jeśli oryginał był w format png, następnie tworzymy obrazek w tym samym formacie. Wymagane do późniejszej kompresji
}

If(preg_match("/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/", $nazwapliku)) (
$im = imagecreatefromjpeg($ścieżka_do_katalogu_90.$nazwapliku); //jeśli oryginał był w format jpg, następnie tworzymy obrazek w tym samym formacie. Wymagane do późniejszej kompresji
}
//TWORZENIE OBRAZU KWADRATOWEGO I JEGO KOLEJNA KOMPRESJA JEST POBIERANA NA STRONIE www.codenet.ru
// Utwórz kwadrat 90x90
// dest - obraz wynikowy
// w - szerokość obrazu
// ratio - współczynnik proporcjonalności
$w = 90; // kwadrat 90x90. Możesz również dostarczyć inne rozmiary.
// Stwórz oryginalny obraz na podstawie
// Plik źródłowy i określ jego rozmiar!
$w_src = obrazyx($im); //oblicz szerokość
$h_src = imagesy($im); //oblicz wysokość obrazu
// utwórz pusty kwadratowy obraz
// truecolor jest ważny!, inaczej otrzymamy wynik 8-bitowy
$dest = imagecreatetruecolor($w,$w);
// wytnij środek kwadratu o x, jeśli zdjęcie jest poziome
jeśli ($w_src>$h_src)
imagecopyresampled($dest, $im, 0, 0,
round((max($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
// przetnij kwadratowy blat w y,
// jeśli zdjęcie jest pionowe (chociaż możesz mieć też środek)
jeśli ($w_src<$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
min($w_src,$h_src), min($w_src,$h_src));
// kwadratowy obrazek jest skalowany bez wycięć
jeśli ($w_src==$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
$data=godzina(); //oblicz czas w chwili obecnej.
imagejpeg($dest, $ścieżka_do_90_katalogu.$data..jpg");//zapisz obraz jpg w żądanym folderze, nazwa będzie Obecny czas. Upewniłem się, że awatary nie mają tej samej nazwy.
//dlaczego jpg? Zajmuje bardzo mało miejsca + niszczy animowany gif obrazu, który rozprasza użytkownika. Nie jest przyjemnie czytać jego komentarz, gdy kątem oka zauważysz jakiś ruch.
$avatar = $ścieżka_do_katalogu_90.$data..jpg";//wstaw ścieżkę do awatara w zmiennej.
$delfull = $ścieżka_do_katalogu_90.$nazwa_pliku;
unlink ($delfull);//usuń oryginalny przesłany obraz, już go nie potrzebujemy. Zadaniem było zdobycie miniatury.
}
w przeciwnym razie
{
//w przypadku niezgodności formatu wyślij odpowiedni komunikat
exit("Awatar musi być w formacie JPG, GIF lub PNG");
}
//zakończenie procesu ładowania i przypisanie adresu załadowanej ava do zmiennej $avatar
}



// dodano nowy ********************************************* ****
// Dalej następuje wszystko z pierwszej części artykułu, ale konieczne jest dodanie zmiany do zapytania bazy danych.
//połącz się z bazą danych
// sprawdź, czy istnieje użytkownik o tym samym loginie
$result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
if (!empty($myrow["id"])) (
exit("Przepraszamy, wprowadzona nazwa użytkownika jest już zarejestrowana. Wprowadź inną nazwę użytkownika.");
}
// jeśli nie ma, to zapisz dane
$result2 = mysql_query ("WSTAW użytkowników (login,hasło,awatar) WARTOŚCI("$login","$hasło","$avatar")");
// Sprawdź, czy są błędy
jeśli ($result2=="PRAWDA")
{
echo "Zarejestrowałeś się pomyślnie! Teraz możesz wejść na stronę. Strona główna";
}
w przeciwnym razie(
echo "Błąd! Nie jesteś zalogowany.";
}
?>

4. Musisz dodać jedną tabelę do tej samej bazy danych. Będzie przechowywać adresy IP, które popełniły błędy podczas logowania. W ten sposób możemy ograniczyć dostęp do tych, którzy popełnili błąd więcej niż trzy razy z rzędu przez około 15 minut.Myślę, że programy odgadujące hasła będą musiały długo się bałaganić.
Przejdźmy do phpmyadmina i stwórzmy nową tabelę z 3 polami:


ip - adres ip.
date - data nieudanego logowania z ostatnich 15 minut dla użytkownika o podanym ip. col - ilość błędów w ciągu ostatnich 15 minut dla użytkownika o podanym ip.
Doskonały! Gotowe, teraz zmieńmy plik weryfikacji loginu i hasła, ponieważ teraz nasze hasło jest zaszyfrowane. Otwórz testreg.php i usuń wszystko poza usuwaniem spacji z loginu i hasła. Następnie dodaj następujący kod:

// usuń dodatkowe spacje
$logowanie = przycinanie($logowanie);
$hasło = przyciąć($hasło);

// zastąp nowym********************************************* ***
// połącz się z bazą danych
include("bd.php");// plik bd.php powinien znajdować się w tym samym folderze co wszyscy inni, jeśli nie, po prostu zmień ścieżkę
// minicheck do odgadywania haseł
$ip=getenv("HTTP_X_FORWARDED_FOR");
if (empty($ip) || $ip=="unknown") ( $ip=getenv("REMOTE_ADDR"); )//pobierz adres IP
mysql_query ("DELETE FROM error WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(data) > 900");//usuń adresy ip użytkowników, którzy popełnili błąd podczas logowania po 15 minutach.
$result = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db);// pobierz z bazy danych liczbę nieudanych prób logowania w ciągu ostatnich 15 dla użytkownika o podanym ip
$mojrow = mysql_fetch_array($wynik);
if ($mojrow["kol"] > 2) (
//jeżeli jest więcej niż dwa błędy, czyli trzy, to wystawiamy komunikat.
exit("Trzy razy wprowadziłeś niepoprawną nazwę użytkownika lub hasło. Poczekaj 15 minut, zanim spróbujesz ponownie.");
}
$hasło = md5($hasło);//zaszyfruj hasło
$password = strrev($password);// dla niezawodności dodaj odwrotność
$hasło = $hasło."b3p6f";
//możesz dodać kilka swoich postaci do smaku, na przykład wpisując "b3p6f". Jeśli to hasło zostanie zhakowane brutalną siłą na serwerze tego samego md5, to oczywiście nic dobrego z tego nie wyjdzie. Ale radzę umieścić inne znaki, możesz na początku linii lub w środku.
//W tym przypadku konieczne jest zwiększenie długości pola hasła w bazie danych. Zaszyfrowane hasło może być znacznie większe.

$result = mysql_query("SELECT * FROM users WHERE login="$login" AND password="$password"",$db); //pobranie z bazy danych wszystkich danych o użytkowniku z wpisanym loginem i hasłem
$mojrow = mysql_fetch_array($wynik);
if (pusty($myrow["id"]))
{
//jeśli użytkownik z podanym loginem i hasłem nie istnieje
//Utwórz rekord, do którego nie można się zalogować z podanego adresu IP.
$select = mysql_query("SELECT ip FROM error WHERE ip="$ip"");
$tmp = mysql_fetch_row($select);
if ($ip == $tmp) (// sprawdź, czy w tabeli "oshibka" jest użytkownik
$result52 = mysql_query("SELECT col FROM error WHERE ip="$ip"",$db);
$myrow52 = mysql_fetch_array($wynik52);
$col = $myrow52 + 1;// dodaj kolejną nieudaną próbę logowania
mysql_query("Błąd AKTUALIZACJI SET col=$col,data=TERAZ() GDZIE ip="$ip"");
}
w przeciwnym razie(
mysql_query ("INSERT INTO błąd (ip,data,kol) VALUES ("$ip",NOW(),"1")");
//jeśli nie było żadnych błędów w ciągu ostatnich 15 minut, to wstaw nowy rekord do tabeli "błąd"
}

exit("Przepraszamy, wpisana nazwa użytkownika lub hasło jest nieprawidłowe.");
}
w przeciwnym razie(
nbsp; //jeśli hasła się zgadzają, rozpoczynamy sesję dla użytkownika! Możesz mu pogratulować, wszedł!
$_SESSION["hasło"]=$mojerow["hasło"];
$_SESSION["zaloguj"]=$myrow["zaloguj"];
$_SESSION["id"]=$myrow["id"];//te dane są bardzo często używane, więc zalogowany użytkownik je "przeniesie"

//Następnie przechowujemy dane w plikach cookie do późniejszego logowania.
//UWAGA!!! ZRÓB TO WEDŁUG WŁASNEGO WŁASNOŚCI, PONIEWAŻ DANE SĄ PRZECHOWYWANE W COOKIES BEZ SZYFROWANIA
if ($_POST["zapisz"] == 1) (
//Jeżeli użytkownik chce, aby jego dane zostały zapisane do późniejszego logowania, to zapisujemy je w plikach cookies jego przeglądarki
setcookie("zaloguj", $_POST["zaloguj"], time()+9999999);
setcookie("hasło", $_POST["hasło"], time()+9999999);
}}
Echo " ";//przekieruj użytkownika na stronę główną, gdzie zostanie poinformowany o udanym logowaniu
?>

5. Całkowicie zmień stronę główną. Konieczne jest wyświetlenie na nim awatara użytkownika, wyświetlenie linku do wylogowania się z konta oraz dodanie checkboxa do zapamiętania hasła podczas logowania.
Index.php

// cała procedura działa na sesjach. To w nim przechowywane są dane użytkownika podczas jego pobytu w serwisie. Bardzo ważne jest, aby uruchomić je na samym początku strony!!!
start_sesji();
include("bd.php");// plik bd.php powinien znajdować się w tym samym folderze co wszyscy inni, jeśli nie, po prostu zmień ścieżkę
if (!empty($_SESSION["logowanie"]) i !empty($_SESSION["hasło"]))
{
//jeśli w sesjach jest login i hasło, to sprawdź je i wypakuj awatar
$logowanie = $_SESJA["logowanie"];
$hasło = $_SESJA["hasło"];
$result = mysql_query("SELECT id,avatar FROM users WHERE login="$login" AND password="$password"",$db);
$mojrow = mysql_fetch_array($wynik);
//pobierz wymagane dane użytkownika
}
?>


Strona główna


Strona główna

if (!isset($mojrow["awatar")]) lub $mojrow["awatar"]=="") (
//sprawdź, czy dane użytkownika są pobierane z bazy danych. Jeśli nie, oznacza to, że nie jest zalogowany lub hasło w sesji jest nieprawidłowe. Wyświetl okno logowania. Ale nie pokażemy go tym, którzy weszli, już go nie potrzebują.
wydrukować<<


TUTAJ;

Jeśli (isset($_COOKIE["login"])) //czy istnieje zmienna z loginem w COOKIE. Powinno być, jeśli użytkownik kliknął pole wyboru „Zapamiętaj mnie” podczas poprzedniego logowania
{
//jeśli tak, to wstaw jego wartość do formularza. W takim przypadku użytkownikowi zostanie wyświetlone, że jego login jest już wpisany w wymaganej kolumnie
echo "wartość="".$_COOKIE["zaloguj"]."">";
}

wydrukować<<




TUTAJ;

Jeśli (isset($_COOKIE["hasło"]))//czy istnieje zmienna hasła w COOKIE. Powinno być, jeśli użytkownik kliknął pole wyboru „Zapamiętaj mnie” podczas poprzedniego logowania
{
//jeśli tak, to wstaw jego wartość do formularza. W takim przypadku użytkownikowi jest pokazywane, że jego hasło jest już wpisane w wymaganej kolumnie.
echo "wartość="".$_COOKIE["hasło"]."">";
}

wydrukować<<



Aby mnie zapamiętać.






Zarejestrować



Jesteś zalogowany jako gość

TUTAJ;
}
w przeciwnym razie
{
// po pomyślnym zalogowaniu użytkownik otrzymuje wszystko, co znajduje się poniżej między gwiazdkami.

wydrukować<<
Jesteś zalogowany jako $_SESSION (wyloguj się)


Ten link jest dostępny tylko dla zarejestrowanych użytkowników

Twój awatar:




TUTAJ;

//************************************************************************************
//po pomyślnym zalogowaniu użytkownik otrzymuje wszystko, co znajduje się POWYŻEJ między gwiazdkami.
}
?>

6. Niezbędne jest umożliwienie wylogowania się zalogowanych użytkowników. Na strona główna był już link do wyjścia. Ale ten plik jeszcze nie istnieje. Więc stwórzmy nowy plik exit.php z kodem:

start_sesji();
if (pusty($_SESSION["login"]) lub pusty($_SESSION["hasło"]))
{
//jeśli nie ma sesji z loginem i hasłem, dostęp do tego pliku ma niezalogowany użytkownik. On tu nie pasuje. Wyświetl komunikat o błędzie, zatrzymaj skrypt
exit („Dostęp do tej strony mają tylko zarejestrowani użytkownicy. Jeśli jesteś zarejestrowany, wejdź na stronę, używając swojej nazwy użytkownika i hasła
Strona główna");
}

unset($_SESSION["hasło"]);
unset($_SESSION["logowanie"]);
unset($_SESSION["id"]);// zniszcz zmienne w sesjach
Wyjście(" ");
// wyślij użytkownika na stronę główną.
?>

OK, już po wszystkim! Używaj na zdrowie! Powodzenia!

Czasami chcesz odejść od aktualnej rutyny kodowania i od drobnych problemów, które są podane w artykułach o "szczegółach". Spójrz na to, co robisz od dłuższego czasu. Tak więc moja wizja podejścia do głównego zadania programowania w php - generowania stron internetowych. Częściowo już poruszyłem ten temat w częściach - w archiwum można znaleźć artykuły o klasie szablonu oraz o XML. Teraz chciałbym to wszystko zebrać w całość i stworzyć coś monumentalnego. Pierwsza część.

1. Początki php

Jak właściwie zaczął się php dla większości z nas? Od wstawiania skryptu na strony HTML. Na przykład własny katalog linków. Strona z linkami z określonej kategorii:

".mysql_result($wynik, 0).""; mysql_free_result($result); $result = mysql_query("SELECT id, tytuł, współczynnik, opis, data_strony FROM site WHERE rubrika=". intval($id). " ORDER BY stosunek DESC, site_date DESC, tytuł"); if (mysql_error()) echo mysql_error(); else while ($row = mysql_fetch_assoc($result)) echo " ($wiersz)
($wiersz)
Nagrano: ($row), Ocena: ($row)

Prosty i bezpretensjonalny, ale najważniejsze jest to, że ten kod działa. Trudności zaczynają się, gdy spróbujesz wpisać nazwę kategorii w tytule strony. Aby to zrobić, będziesz musiał utworzyć wstawkę php wewnątrz tagu , przenieś tam kod, który wykonuje pierwsze żądanie (wybór nazwy kategorii), zapisz wynik żądania do zmiennej, która następnie zostanie wyświetlona w treści strony.</p> <p>Kolejną komplikacją jest próba pracy z plikami cookies i wydawanie ich w zależności od tego, które sekcje odwiedza użytkownik. Aby lepiej to sobie wyobrazić: powiedzmy, że zdecydowaliśmy, że tłumy odwiedzających przejdą na naszą stronę główną, a dla potencjalnych reklamodawców stworzyliśmy silnik bannerów targetujących. Załóżmy, że użytkownik, który odwiedził sekcje muzyki rockowej i instrumentów muzycznych, zobaczy na następnej stronie baner z reklamą sklepu z gitarami elektrycznymi.</p> <p>W takim przypadku będziemy musieli wstawić kod php na samym początku pliku i tam przenieść sprawdzanie obecności kategorii, ponieważ ciasteczka można wystawić tylko przed wystawieniem pierwszego bajtu dokumentu.</p> <p><i>Oczywiście powiesz, że można to łatwo zrobić za pomocą mechanizmu sesji użytkownika, który jest łatwiejszy z punktu widzenia obsługi treści i bezpieczniejszy, ponieważ użytkownik może ręcznie zmienić zawartość pliku cookie. Tak, to prawda, ale po pierwsze, oto wizja początkującego programowania tworzącego swoją stronę domową, a po drugie, mówimy o odległej przeszłości – praktycznie jesteśmy w 1998 roku.</i></p> <p>Wyjście tych samych bloków kodu HTML i PHP w dołączonych plikach nie ułatwia życia. Opisane powyżej zadanie – zbudowanie prostego katalogu linków z nagłówkami – to być może górna granica możliwości tego podejścia. Przy wykonywaniu bardziej złożonych zadań ryzyko napotkania dużych kosztów pracy jest bardzo duże.</p> <p>2. Komplikacja kodu</p> <p>Logicznym rozwinięciem poprzedniego podejścia jest całkowite przejście na php w tym sensie, że wszystkie strony są kodem php - na początku pliku znajduje się tag otwierający "<?php", и дальше php-код не прерывается. Весь вывод делается через echo (print). Такой код, вроде бы, выглядит логичнее. Пример: страница подписки на новые ссылки в каталоге. В форме предлагается выбрать, на какие рубрики подписывается пользователь.</p><p> <?php include "db-connect.inc"; include "login-check.inc"; if (!$logged_in) { header ("Location: /register.php"); exit(); } include "page-header.inc"; print("<h2>class="club_article_small_caption">Wiadomości dla klientów</h2> <table cellpadding=\"4\" cellspacing=\"0\" border=\"0\">"); $result = mysql_query("SELECT id, tytuł, anons, news_date FROM news ORDER BY news_date DESC LIMIT 10"); if (mysql_error()) print(mysql_error()); else while ($row = mysql_fetch_assoc($ wynik)) drukuj(" <tr><td>($row)"); if ($row["news_date"] > date("R-m-d", time() - 3600*24*14)) print(" <font color=\"#cc0000\">Nowy!</font>");wydrukować("</td><td> <a href=\"read.php?id={$row}\"><b>($wiersz)</b></a> <br>($wiersz)</td></tr>");wydrukować("</table>"); dołącz "page-footer.inc"; ?></p><p> <?php ... else while ($row = mysql_fetch_assoc($result)) print_announce($row); ... ?> </p><p>Ale to wcale nie ułatwia pracy, a godzina rozliczenia na pewno nadejdzie: będzie potrzeba przeprojektowania strony. Projektant po prostu odmówi edycji tego. Tylko ten, kto napisał taki kod, będzie w stanie to rozgryźć i zastąpić stary HTML nowym. Jeśli ta osoba nie pracuje już nad projektem, to projekt będzie musiał zostać przepisany prawie od zera, albo umrze, stając się pomnikiem ludzkiej głupoty.</p> <p>Kolejny sposób na rozwinięcie podejścia mieszanego HTML i php. PHP posiada właściwość o nazwie advanced-escaping . Pozwala wyświetlać normalny kod HTML w konstrukcjach językowych:</p><p> <?php include "db-connect.inc"; include "login-check.inc"; if (!$logged_in) { header ("Location: /register.php"); exit(); } include "page-header.inc"; ?><h2 class="club_article_small_caption">Nowości dla klientów</h2> <table cellpadding="4" cellspacing="0" border="0"><?php $result = mysql_query("SELECT id, title, announce, news_date FROM news ORDER BY news_date DESC LIMIT 10"); if (mysql_error()) print(mysql_error()); else while ($row = mysql_fetch_assoc($result)) { ?><tr><td><?=$row["news_date"]?><?php if ($row["news_date"] >data("R-m-d", czas() - 3600*24*14)) ( ?> <font color="#cc0000">Nowy!</font><?php } ?></td><td> "> <b><?=$row["title"]?></b> <br><?=$row["announce"]?></td></tr><?php } ?></table><p>Projektant układu lub projektant, po otwarciu tego pliku w HomeSite, zobaczy znaczniki HTML z podświetleniem i będzie mógł edytować projekt strony. W prostych witrynach ta metoda jest całkiem odpowiednia. W kompleksie - nie do piekła.</p> <p>3. Przewrót</p> <p>Wraz z wydaniem PHP 3.0... Swoją drogą, nie zaszkodzi przywrócić chronologię, skoro mówimy o pełnej historii. Tak więc chronologia, która została przywrócona za pomocą archiwum listy dyskusyjnej php anonsu oraz strony z archiwum internetowego:</p><p>08.1997 PHP 3.0 Beta1 06.06.1998 PHP 3.0 wydanie 19.07.1999 PHP 4.0 Beta1 05.22.2000 PHP 4.0 wydanie 12.10.2001 PHP 4.1 wydanie 04.22.2002 PHP 4.2 wydanie 10.10.2002 PHP 4.3.0pre1 (pre1 nie Release Candidate)</p><p>Tak więc wraz z wydaniem PHP 3.0 pojawił się zestaw narzędzi do zastosowania nowego podejścia do programowania php - buforowania stron w skryptach. (Ważne, aby pamiętać, że nie jest to takie samo buforowanie, jak teraz).</p> <p>Z biegiem czasu zadania budowania stron stały się bardziej skomplikowane, coraz częściej używano php, strony stawały się coraz bardziej „dynamiczne”. Im większa witryna, tym bardziej problematyczne jest zrobienie wszystkiego na dołączonych plikach w mieszanym php i HTML. Dość logicznie kolejnym krokiem w rozszerzeniu php było przetworzenie strony HTML w pamięci skryptu i wydanie jej użytkownikowi w całości lub w częściach.</p> <p>Przynajmniej obsługa PHP3 (no cóż, emulacja) programowania obiektowego pomogła wdrożyć to podejście. Zostały stworzone <i>klasy szablonów</i>, co ułatwiło manipulowanie szablonem strony i danymi, które należy do niego wprowadzić.</p> <p>To rozszerzyło możliwości programów, ale jednocześnie wymagało więcej zasobów systemowych. Dziś możemy powiedzieć, że korzyści płynące z zastosowania tego podejścia przewyższały koszt zasobów systemowych, ale dwa lub trzy lata temu wiele osób uważało, że przechowywanie całego dokumentu w pamięci jest luksusem, na który nie można sobie pozwolić w przypadku programowania internetowego.</p> <p>Tak więc, mówiąc w przenośni, nastąpiła rewolucja technologiczna: jeśli wcześniej PHP chowało się w kodzie HTML i nieśmiało dodało swoje informacje, teraz wyszło na wierzch i trzyma w łapach cały HTML.</p> <p>4. Co jest nie tak z samodzielnie wykonanymi klasami szablonów</p> <p>Sześć miesięcy później postanowiłem coś zmienić w swoich planach. Nie będzie moralizowania na temat zła samodzielnych zajęć. Oni są dobrzy. Skorzystaj z nich, a to, czego potrzebujesz, dotrze z Tobą! Pamiętaj tylko, że niektóre okoliczności będą ci przeszkadzać.</p> <p>Pierwszy. Jeśli lekcja została napisana celowo, oznacza to, że jest trochę poza kontaktem z życiem. Niech za klasą będzie dużo doświadczenia w rozwoju, nadal była tworzona w warunkach szklarniowych. Powstała technologia będzie miała swoje specyficzne warunki użytkowania, w których przyszłe zmiany będą musiały zostać dostosowane lub klasa musi zostać przerobiona.</p> <p>Drugi. Klasa, która jest syntetyzowana z opracowań w różnych projektach, również wymaga zmian – im bardziej jest globalna, tym więcej.</p> <p>Możesz więc tworzyć własne klasy (klasy szablonowe, o ile wiem, wiele osób korzysta z własnych). Jeśli pójdziesz dedukcyjnie, budując klasę na podstawie oszacowania tego, czego potrzebujesz, istnieje niewielka szansa, że ​​skończysz z czymś genialnym. I istnieje duże prawdopodobieństwo, że nie okaże się dokładnie to, czego potrzebujesz. Można zastosować indukcję – wtedy po dużym i <a href="https://bar812.ru/pl/electronic-transformer-shema-podklyucheniya-podrobnaya-shema-vybora-elektronnogo-transformatora-i-kak-p.html">długa praca</a> masz gwarancję, że otrzymasz coś, co działa, ale niekoniecznie genialne.</p> <p>Zło produktów domowej roboty, o których wspomniałem w poprzednich częściach, polega w pierwszym przypadku na bardzo wysokim prawdopodobieństwie uzyskania czegoś, co nie działa tak, jak marzyłeś, wymagający <a href="https://bar812.ru/pl/obzor-lg-g4-android-flagman-s-osobym-podhodom-usb-modem-zte-mf823.html">specjalne podejście</a> i dużo kodowania. W drugim przypadku możesz ciężko pracować przez długi czas i uzyskać coś, co już zostało zrobione i opublikowane przez kogoś przed tobą.</p> <p>Jeśli chodzi o porównywanie technologii, głównym problemem jest trafność. Bardzo prostą witrynę można utworzyć na dołączonych plikach i nie myśleć o klasach i silnikach. Bardziej skomplikowaną witrynę najlepiej wykonać na szablonach. Jeśli złożoność wzrasta i na jednej stronie dużo zależy od różnych warunków - menu nawigacyjne w zależności od statusu itp. - lepiej pomyśleć o snopie XML&XSLT.</p> <p>Przykład: forum phpBB. Nie możesz całkowicie zmienić w nim projektu, jak chcesz, ponieważ wiele elementów projektu nie znajduje się w szablonach, ale w kodzie php. Wszelkiego rodzaju formularze logowania, menu kontrolne dla zalogowanego użytkownika itp. - są wstawiane na stronę za pomocą kodu php, a nie jako zagnieżdżony szablon. Najpopularniejsze rozwiązanie nie zawsze jest najlepsze.</p> <p>Dmitrij Koterow komentuje doświadczenie uczenia się phpBB w następujący sposób: po napisaniu klasy szablonowej wielu z entuzjazmem zaczyna wciskać wszystko pod tę klasę. Ideą tej klasy jest oddzielenie kodu i stylu, ale autorzy phpBB pomieszali je tak bardzo, jak to możliwe.</p> <p>Ale moim zdaniem nawet przy normalnej implementacji tego podejścia (klasa szablonów) kod byłby niewygodny, byłoby dużo plików z szablonami. Ostatnio doszedłem do wniosku, że na klasach szablonowych w zasadzie nie da się tak naprawdę oddzielić kodu php od danych i projektu. Wraz ze zmianą projektu strony na takim silniku na pewno będziesz musiał zagłębić się w skrypty php i to nie projektant to zrobi, ale Ty.</p><p> <table border> <tr> <td colspan=2> <b>__światowy__</b> <p>(ukryty i automatycznie dodany)</td> </tr> <tr> <td><b>blok1</b></td> <td> <table border> <tr> <td colspan=2><b>blok2</b></td> </tr> <tr> <td><b>wewnętrzna1</b></td> <td><b>wewnętrzna2</b></td> </tr> </table> </td> </tr> </table> </p><p>Dokumentacja mówi, że nie ma potrzeby określania w szablonie, który blok jest jego dzieckiem. Klasa to zrozumie.</p> <p>Dokumentacja dla tej klasy mówi, że wie, że inner1 jest dzieckiem bloku 2 i nie ma potrzeby o tym mówić. Aby wstawić dane do bloku, wystarczy wykonać następujący kod tyle razy, ile jest to konieczne dla wierszy:</p><p> <?php $tpl->ustawianie zmiennej(...); $tpl->parseCurrentBlock(); ?></p><p>Aby dodać zawartość do bloku 1, musisz wykonać następujące czynności:</p><p> <?php $tpl->setCurrentBlock("wewnętrzna1"); $tpl->ustawZmienną(...); $tpl->parseCurrentBlock(); $tpl->ustawZmienną(...); $tpl->parseCurrentBlock(); $tpl->parse("blok1"); ?></p><p>W rezultacie kod skryptu wygląda tak:</p><p> <?php $tpl = new HTML_Template_IT(); // загрузка шаблона или указание его через класс $tpl->loadTemplatefile(string filename [, boolean removeUnknownVariables, boolean removeEmptyBlocks]) // ustaw zmienne „globalne”, tj. zmienne nie zawarte w bloku (blok potomny) $tpl->setVariable(string nazwa zmiennej, wartość mieszana); // innym sposobem określenia zmiennych jest tablica $tpl->setVariable(array (string varname => wartość mieszana)); // Użyjmy jakiegoś bloku, nawet jeśli jest głęboko zagnieżdżony $tpl->setCurrentBlock(string blockname); // Powtórz tyle ile potrzeba $tpl->setVariable(array (string varname => wartość mieszana)); $tpl->parseCurrentBlock(); // pobierz wynik lub wypisz go, wywołując $tpl->show() $tpl->get(); ?></p><p>Kod jest wygodniejszy i bardziej przejrzysty niż w przypadku FastTemplate.</p> <p>Ale wielu programistów i tak pisze własne klasy szablonów. Prostszy, ale z pewnymi funkcjami, których nie ma w klasach publicznych. Napisałem własną klasę, w której wykonałem bloki, do których automatycznie wstawiane były wyniki zapytań SQL, dodatkowo był nagłówek i ogon bloku (np. tagi <table>oraz</table>), które pojawiły się w wyniku tylko wtedy, gdy w zapytaniu SQL były wiersze.</p> <p>PHP3 wprowadził moduł funkcji przetwarzania XML. Korzystając z funkcji tego modułu można tworzyć własne programy obsługi kodu XML, ale nie można sprawdzić poprawności dokumentu XML.</p> <p><i>Mała dygresja do teorii czym jest XML i dlaczego jest potrzebny.</i></p> <p><i>XML to sposób pisania uporządkowanych danych. „Dane strukturalne” zwykle odnoszą się do takich rzeczy, jak arkusze kalkulacyjne, książki adresowe, ustawienia konfiguracji, transakcje finansowe, rysunki techniczne i tak dalej. XML to zbiór reguł (można je również traktować jako instrukcje lub konwencje) do programowania <a href="https://bar812.ru/pl/kak-izmenit-razreshenie-tekstovogo-dokumenta-tipy-formatov-failov-kak.html">formaty tekstowe</a>, co pozwoli Ci uporządkować Twoje dane.</i></p> <p>Wyjaśnienie, czym jest struktura.</p><p> <eshop> <!-- категории товаров --> <category id="3"> <title>Produkty mięsne Ryba kilogram 100 Mięso kilogram 200 Produkcja odpadów kawior rybny kilogram 10 produkty ziołowe Słonecznik rzecz 50

W ten sposób można napisać ustrukturyzowane dane o sklepie spożywczym w XML, w którym produkty są podzielone na kategorie, a kategorie mogą być sobie podrzędne. Oczywiście dane te można zapisać w inny sposób, powiedzmy tekst z tabulatorami jako separatorami i określając id kategorii nadrzędnej (swoją drogą, przy zapisie danych w formacie XML, jak widać powyżej, nie trzeba ich podawać ). XML to gotowy format do napisania takiej struktury, w ramach którego wystarczy wymyślić nazwy węzłów (tagów) oraz zasady, w jakich struktura ma się mieścić (np. że produkt nie może znajdować się poza kategorii lub że nie może być więcej niż trzy poziomy kategorii). Dalej:

XML nie jest językiem programowania i nie musisz być programistą, aby go używać lub uczyć się. XML ułatwia komputerowi tworzenie i odczyt danych przy jednoczesnym zapewnieniu niepowtarzalności ich struktury. XML pozwala uniknąć typowych błędów projektowych języka: jest rozszerzalny, niezależny od platformy i obejmuje obsługę internacjonalizacji i lokalizacji. XML jest w pełni kompatybilny z Unicode.

Programiści PHP proponują przetwarzanie poszczególnych elementów dokumentu XML funkcje php. Przykład z podręcznika php:

"B", "EMFAZA" => "I", "LITERAŁ" => "TT"); // Funkcja uruchamiająca tag (może wyprowadzać złożony tekst, ale w ten przykład daje // tylko odpowiedni tag). function startElement($parser, $name, $attrs) ( global $map_array; if ($htmltag = $map_array[$name]) ( print "<$htmltag>"; ) ) // Funkcja dla funkcji znacznika końcowego endElement($parser, $name) ( global $map_array; if ($htmltag = $map_array[$name]) ( print ""; ) ) // funkcja tekstu (węzeł tekstowy) function characterData($parser, $data) ( print $data; ) $xml_parser = xml_parser_create(); $map_array xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true); xml_set_element_handler($xml_parser, "startElement", "endElement"); xml_set_character_data_handler($xml_parser, "characterDatap"); (!($ Odczytaj plik XMLf) $file, "r"))) ( die("nie można otworzyć danych wejściowych XML"); ) while ($data = fread($fp, 4096)) ( if (!xml_parse($xml_parser, $data, feof( $ fp))) ( die(sprintf("Błąd XML: %s w linii %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); ) ) xml_parser_free($xml_parser); ?>

Ten przykład można rozszerzyć, dodając tablicę nazw znaczników, które będą przetwarzane inaczej, oraz odpowiednie warunki w funkcjach startElement i endElement.

Kod wygląda po prostu okropnie. Używane w Transformacja XML jest praktycznie bezużyteczny na stronach HTML, chociaż był używany w niektórych miejscach, na przykład na stronie How IT works. Oczywiście możesz napisać własne automaty, które będą czytać pliki konfiguracyjne i utworzone tablice, ale pod względem całkowitych kosztów pracy bardziej opłaca się używać potężnych klas szablonów, takich jak Smarty.

Prace nad tym projektem rozpoczęły się w 1999 roku, kiedy grupa programistów zaczęła pisać specyfikację silnika szablonów. Po ustaleniu, co powinien zrobić, programiści próbowali napisać moduł w C, ale w końcu zdecydowali, że lepiej jest uczynić klasę php dostępną i zrozumiałą dla wszystkich programistów witryn.

Teraz Smarty jest jednym z projektów PHP, jego strona internetowa znajduje się pod adresem Serwer PHP na smarty.php.net.

Formalnie Smarty jest klasą szablonową. W rzeczywistości jego funkcjonalność jest o rząd wielkości wyższa niż w zestawie *Szablon.

Po pierwsze, Smarty nie tylko wstawia zmienne do szablonu, ale także wykonuje kod PHP w samym szablonie. Po drugie, szablony w Smarty są konwertowane na skrypty php, a cała brudna robota polegająca na wstawianiu zmiennych do tekstu i wykonywaniu konstrukcji logicznych jest przekazywana parserowi wbudowanemu w php. Te skrypty php, gdy buforowanie jest włączone, są zapisywane w plikach, które są wywoływane podczas kolejnych wywołań szablonów. Gdy szablony się zmienią, skrypty są generowane ponownie. Takie buforowanie znacznie przyspiesza pracę skryptów.

Smarty może również obsługiwać logiczne szablony osadzone w szablonach. konstrukcje if-else, konwertując je na kod php. Podobnie postępuje się z konstrukcjami zwanymi modyfikatorami zmiennych. Pozwalają usunąć niektóre funkcje z głównego skryptu, przenosząc je do szablonu i ich buforowanych skryptów php.

(* Napisz tytuł wielkimi literami *)

($tytuł|górny),

(* Skróć temat do 40 znaków, wstawiając... na końcu *) Topic: ($topic|truncate:40:"...")

Ten tekst jest konwertowany na ten kod:

_run_mod_handler("górny", prawda, $this->_tpl_vars["Nazwa"]); ?> Temat:_run_mod_handler("obcinanie", prawda, $this->_tpl_vars["Nazwa"], 40, "..."); ?>

Dostępny jest również zestaw wbudowanych zmiennych, takich jak $smarty.now (aktualny czas). Dopełnieniem idyllicznego obrazu jest wyjście okna debugowania zawierające wartości zmiennych, wywołanie zagnieżdżonych szablonów, obsługa niestandardowych filtrów I/O i wtyczek.

Wszystko byłoby dobrze, gdyby Smarty był mniejszy. Teraz (wersja 2.3.1) "waży" 144 kilobajtów i działa zauważalnie wolno na AMD K6 266 MHz. Deweloperzy Smarty zalecają używanie Zend Accelerator lub PHP Accelerator.

DOM - włączony ten moment ostatnie słowo w szablonach dokumentów w php. Moduł opisałem w artykule "XML: Specyfikacja i funkcje DOM w PHP".

Pomimo gadatliwości i dużej ilości kodu, który wykonuje dość proste operacje, DOM XML ma wielkie nadzieje.

Główną wadą tekstowego podejścia do edycji dokumentu XML (oczywiście w skrypcie) jest to, że trzeba albo uważnie przeczytać specyfikację XML, albo nie być całkowicie pewnym, jaki jest efekt końcowy.

Na przykład wstawianie tekstu do węzła jest prostym zadaniem. Jednak w dokumencie XML znaki usługowe i znaki, które nie są zawarte w tabeli ISO, muszą zostać przekonwertowane na encje XML (<) или в номера символов UTF-8 (&x0442;). В модуле DOM XML достаточно сконвертировать текст в UTF-8 и вызвать метод create_text_node.

Nadal mam stary silnik tekstowy działający na mojej stronie i czasami robi kilka interesujących sztuczek z dokumentami o niepoprawnej formie. Dodatkowo obiekty mogą być przekazywane jako parametr funkcji, a nazwa wywoływanej metody może być zmienna.

Wreszcie, główną zaletą DOM XML jest brak modułu binarnego do przetwarzania tekstu dokumentu w php. Oznacza to, że sam będziesz musiał napisać parser.

Jeśli chodzi o dużą ilość kodu, jest to całkiem naturalne. W końcu, jeśli chcesz edytować dokument za pomocą tekstu, a następnie napisz wyrażenia regularne, użyj zestawu funkcji ciągów. Ten kod jest również bardzo potrzebny, jeśli przestrzegasz konwencji XML.

Operacje na dokumencie za pośrednictwem DOM muszą być pogrupowane we własne funkcje, czyli zbudować klasę szablonu DOM.

W osobnym szablonie możesz umieścić dane wspólne dla witryny lub jej sekcji. Resztę należy wstawić do dokumentu za pomocą opisanej przeze mnie techniki:

element_dokumentu(); $dziecko = $root1->child_nodes(); $root2 = $dom2->element_dokumentu(); dla ($i = 0; $i< sizeof($child); $i++) $root2->append_child($child[$i]->clone_node()); ?>

Dla strony możesz zrobić prosty skrypt, do którego będą przekierowywane prośby o dokumenty. W .htaccess jest napisane:

Opcje FollowSymLinks RewriteEngine On # sprawdź czy istnieje plik o tej samej nazwie # i rozszerzeniu phpxml dla partycji root RewriteCond %(DOCUMENT_ROOT)/$1/index.phpxml -f # jeśli taki plik istnieje, reguła odpala RewriteRule ^(+ )/?$ /$1 /index.php # ta reguła zadziała dla adresu przepisanego # przez poprzednią regułę i dla wszystkich innych plików # poprzez wysłanie żądania do skryptu composer.php. RewriteCond %(DOCUMENT_ROOT)/$1.phpxml -f RewriteRule ^(+)\.php$ /composer.php [L]

Skrypt composer.php otworzy plik o takiej samej nazwie, jak żądana, ale z rozszerzeniem phpxml. Serwer Apache podczas przetwarzania reguł sprawdził już istnienie tego pliku.

6.1 Walidacja dokumentów

Jest to narzędzie, które powinno zastąpić lub znacząco zastąpić domowe narzędzia do walidacji danych. Teraz modne stało się porzucanie bazy danych i przechowywanie danych w plikach.

W przypadku bazy było to łatwe: otrzymujesz tablicę i tworzysz z niej ciąg tekstowy (za pomocą pętli lub klasy szablonu, takiej jak php-templates) lub otrzymujesz ciąg znaków za pomocą drzewa obiektów sql2xml (lub ponownie ciągu). Trudniej jest pracować z plikiem, ponieważ na wszelki wypadek warto sprawdzić integralność danych.

Istnieją dwa podejścia do tworzenia znaczników. Pierwszy to znaczniki zorientowane na dane, a drugie to znaczniki zorientowane na dokumenty.

Przykład znaczników zorientowanych na dane:

ETCC FIA zorganizowała serie wyścigowe. Używaj samochodów wyścigowych. BTCC Brytyjskie Mistrzostwa Samochodów Turystycznych Analogicznie do ETCC, tyle że wyścigi biorą. http://btcc.co.uk DTM Mistrzowie Deuche Tourenwagen

Dwa poziomy hierarchii - wiersz + pole (oczywiście, jeśli są 3 lub 4, to jakościowo nic się nie zmieni), generalnie to samo, co zapytanie z bazy danych sformatowane przy użyciu sql2xml. Przykład znacznika zorientowanego na dokument:

FIA zorganizowała około 20 serwisów wyścigowych, w tym 2 mistrzostwa samochodów turystycznych. Mistrzostwa Europy Samochodów Turystycznych (ETCC) używa znacząco dostrojonych samochodów drogowych, głównie BMW. Kolejna seria FIA to Brytyjski samochód turystyczny (BTCC) jest odpowiednikiem ETCC, z wyjątkiem tego, że wyścigi biorą. Nie są to jednak najsłynniejsze mistrzostwa świata. DTM (Mistrzowie Deuche Tourenwagen), najsłynniejsza seria wyścigów Touring nie tylko w Niemczech.

Ta wersja jest napisana w wolnym języku ludzkim, ale dane w elementach acro i title pozostają takie same, można je uzyskać z dokumentu za pomocą tych samych zapytań XPath lub XQuery: /mistrzostwa/mistrzostwo/tytuł Pierwsza opcja znaczników może być reprezentowana jako tabela bazy danych. Możesz to skomplikować, na przykład - fragment dokumentu:

DTM Mistrzowie Deuche Tourenwagen Najsłynniejsza niemiecka seria wyścigów Touring. Laurent Aiello Bernda Schneidera Marcel Fassler Jean Alesi Christian Albers

Nie oznacza to, że dokument nie jest zorientowany na dane. Nowy dokument może być reprezentowany jako 2 połączone tabele na żądanie operatora LEFT JOIN.

Drugi dokument ma bardziej złożoną strukturę iw ogólnym przypadku nie będzie można go upchnąć w tabeli.

Nawiasem mówiąc, jest to główna różnica między bazami danych XML a bazami danych innych niż XML. Baza danych XML działa również ze znacznikami zorientowanymi na dokumenty (nie tylko, że wyniki są zwracane w formacie XML). Znaczniki zorientowane na dane można łatwo przechowywać w relacyjnej bazie danych, a następnie sformatować za pomocą narzędzia takiego jak sql2xml .

Wracając więc do walidacji dokumentów, należy zauważyć, że znaczniki zorientowane na dokumenty są bardzo trudne do sprawdzenia pod kątem zgodności z DTD lub schematem XML za pomocą prostego parsera ciągów.

Innym przykładem jest znacznik formularza w mojej klasie TXF:

0"/>

Sprawdzam to poprzez schemat DTD. Walidacja schematu dokumentu to standardowa funkcja biblioteki DOM XML.

W przypadku powszechnie używanych formatów wymiany danych, takich jak RSS, istnieją specyfikacje i schematy DTD (schematy XML). Aby nie zawracać sobie głowy pisaniem własnego parsera RSS, możesz po prostu dodać schemat do dokumentu i sprawdzić poprawność. Następnie pobierz niezbędne węzły z dokumentu, używając wyrażeń get_content lub XPath.

6.2 Dygresja

Do pilnego zakończenia pisania tej części serii zostałem zmuszony przez ostatnią notatkę Spectatora zatytułowaną "Szablony w PHP dla opornych".

Wzywa do zapomnienia słów takich jak XML, XHTML "i inne X...", po drodze daje zasłużonego kopa Smarty'emu, a kończąc jego Impromptu, wzywa mądrych ludzi do golenia się brzytwą Ockhama.

Biedna brzytwa! Podnieśli ją na sztandary, wymachują nią gdzie tylko się da, szturchają nią i próbują nią zranić przeciwników.

Cholera brzytwa! Do diabła z tą głupią zasadą „nie twórz bytów ponad to, co jest konieczne”. Jest to zbyt oklepana prawda, aby ludziom przypominać, a do oceny innych generalnie nie jest odpowiednia. Ilość „dodatkowo niezbędnego” dla każdej osoby jest inna. Właściciel serwisu może powiedzieć: „Dlaczego potrzebuję twoich skryptów, stwórz je w zwykłym HTML, abyśmy mogli je edytować za pomocą FrontPage! Czy czytałeś o brzytwie Ockhama?”

Przez długi czas uważałem, że głównym powodem, dla którego warto wykorzystywać nowe technologie w programowaniu, są korzyści skali. Jak napisali do mnie w komentarzach do starego artykułu, „wraz z rozwojem strony utoniesz w swoich szablonach”. I w moich artykułach oparłem się właśnie na tym - mówią, proszę, pobaw się swoim przebiegłym include'em i kodem zmieszanym z HTML, będzie ci gardło, gdy będziesz musiał zrobić dużo kodu programu.

Właściwie jest jeszcze jeden powód. To są umiejętności każdej osoby. Ci, którzy dobrze znają XML, XSLT i XPath lub potrafią szybko znaleźć rozwiązania problemów w tym środowisku, w większości przypadków zrealizują projekt z wykorzystaniem technologii XML. To będzie dla niego proste i łatwe, ponieważ jest w tym dobry. Ci, którzy nie wiedzą lub wiedzą słabo, zrobią to w „popularny” sposób.

Pozostaje tylko pytanie, czy jego rozwiązania oparte na XML będą bardziej wydajne, niż gdyby robił je na klasach szablonów lub mieszanym PHP&HTML? Tak oni będą. Podam alegoryczne porównanie.

Widzieliście, jak doświadczeni gracze i „lamerzy” grają w siatkówkę? Drużyny „worków” za pomocą haka lub oszusta przerzucają piłkę na drugą stronę tak, aby przeciwnik upuścił piłkę do domu. Nie wiedzą, jak zadać cios ofensywny i, prowadzeni osławioną brzytwą, grają po prostu. Doświadczony gracz potrafi rzucić piłkę znacznie lepiej niż worek. Osiągnie jednak lepszy wynik, jeśli wykona dobry cios ofensywny.




Jeśli masz więcej pytań lub coś jest niejasne - zapraszamy do naszego

5 lutego , 2017

Nie znam żadnego frameworka php. To smutne i zawstydzające, ale prawo tego jeszcze nie zabrania. Jednocześnie chcę pobawić się REST API. Problem polega na tym, że php domyślnie obsługuje tylko $_GET i $_POST. Aby zapewnić usługę RESTful, musisz również mieć możliwość pracy z PUT, DELETE i PATCH. I nie jest oczywiste, jak kulturowo obsłużyć wiele próśb, takich jak POBIERZ http://site.ru/users, USUŃ http://site.ru/goods/5 i inne nieprzyzwoitości. Jak zapakować wszystkie takie żądania w jeden punkt, uniwersalnie rozłożyć je na części i uruchomić niezbędny kod do przetwarzania danych?

Prawie każdy framework php może to zrobić po wyjęciu z pudełka. Na przykład Laravel, gdzie routing jest realizowany w sposób przejrzysty i prosty. Ale co, jeśli nie musimy teraz studiować nowego dużego tematu, ale chcemy po prostu szybko rozpocząć projekt z obsługą REST API? Zostanie to omówione w artykule.

Co powinna zrobić nasza usługa RESTful?

1. Obsługa wszystkich 5 podstawowych typów żądań: GET, POST, PUT, PATCH, DELETE.
2. Zajmij się różnymi rodzajami tras
POST /towary
PUT /towary/(dobryId)
POBIERZ /users/(identyfikator użytkownika)/informacje
i inne dowolnie długie łańcuchy.

Uwaga: ten artykuł nie dotyczy podstaw REST API
Zakładam, że znasz już podejście REST i rozumiesz, jak to działa. Jeśli nie, to w internecie jest mnóstwo świetnych artykułów na temat podstaw REST - nie chcę ich powielać, moim pomysłem jest pokazanie Wam jak w praktyce pracować z REST-em.

Jaką funkcjonalność będziemy wspierać?

Rozważ 2 podmioty - produkty i użytkowników.

W przypadku produktów dostępne są następujące opcje:

  • 1. POBIERZ /towary/(dobryId)— Uzyskiwanie informacji o produkcie
  • 2. POST /towary— Dodanie nowego produktu
  • 3. PUT /towary/(dobryId)— Edycja produktu
  • 4. PATCH /towary/(dobryId)— Edycja niektórych parametrów produktu
  • 5. USUŃ /towary/(goodId)— Usuwanie produktu

Dla odmiany rozważ kilka opcji z GET

  • 1. POBIERZ /users/(identyfikator użytkownika)— Pełne informacje o użytkowniku
  • 2. POBIERZ /users/(identyfikator użytkownika)/informacje- Tylko ogólne informacje o użytkowniku
  • 3. GET /users/(userId)/orders- Lista zamówień użytkowników

Jak to działa w natywnym PHP?

Pierwszą rzeczą, którą zrobimy, jest skonfigurowanie .htaccess tak, aby wszystkie żądania były przekierowywane do pliku index.php. To on będzie zaangażowany w wydobywanie danych.

Po drugie – zdecydujmy jakich danych potrzebujemy i napiszmy kod, który je otrzyma – w index.php.
Interesują nas 3 rodzaje danych:

  • 1. Metoda żądania (GET, POST, PUT, PATCH lub DELETE)
  • 2. Dane z adresu URL, np. users/(userId)/info - potrzebne są wszystkie 3 parametry
  • 3. Dane z organu wniosku
I po trzecie, napiszmy kod, który uruchamia niezbędne funkcje. Funkcje podzielone są na pliki, wszystko jest Feng Shui, dodawanie nowych ścieżek i metod dla usługi RESTful będzie bardzo proste.

.htaccess

Stwórzmy plik .htaccess w katalogu głównym projektu

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

Za pomocą tych tajemniczych linii nakazujemy to zrobić:
1 - kieruj wszystkie żądania dowolnego rodzaju do pliku king index.php
2 - udostępnij ciąg w adresie URL w index.php w parametrze get q. Czyli dane z adresu URL formularza /użytkownicy/(identyfikator użytkownika)/informacje otrzymamy z $_GET["q"].

index.php

Spójrzmy na index.php linia po linii. Najpierw pobierzmy metodę żądania.

// Zdefiniuj metodę żądania $method = $_SERVER["REQUEST_METHOD"];

Następnie dane z treści żądania

// Pobierz dane z treści żądania $formData = getFormData($method);

W przypadku GET i POST łatwo jest pobrać dane z odpowiednich tablic $_GET i $_POST. Ale w przypadku innych metod musisz trochę zboczyć. Kod dla nich jest pobierany ze strumienia php://wejście, kod jest łatwy do google, właśnie napisałem ogólny wrapper - funkcję getFormData($method)

// Pobieranie danych z funkcji getFormData($method) treści żądania ( // GET lub POST: zwróć dane w postaci, w jakiej są, jeśli ($method === "GET") return $_GET; if ($method === "POST ") return $_POST; // PUT, PATCH lub DELETE $data = array(); $exploded = explode("&", file_get_contents("php://input")); foreach($exploded as $pair) ( $item = explode("=", $para); if (count($item) == 2) ( $data = urldecode($item); ) ) return $data; )

Oznacza to, że uzyskaliśmy niezbędne dane, ukrywając wszystkie szczegóły w getFormData - cóż, świetnie. Przejdźmy do najciekawszego - routingu.

// Przeanalizuj adres URL $url = (isset($_GET["q"])) ? $_GET["q"] : ""; $url = rtrim($url, "/"); $urls = rozbij("/", $url);

Powyżej dowiedzieliśmy się, że .htaccess wstawi parametry z adresu URL-a do parametru q tablicy $_GET. Oznacza to, że $_GET["q"] będzie zawierać coś takiego: użytkowników/10. Bez względu na metodę ściągamy żądanie.

ALE rozbij("/", $url) konwertuje ten ciąg do nas w tablicę, z którą już możemy pracować. W ten sposób twórz dowolnie długie łańcuchy żądań, na przykład
POBIERZ /goods/strona/2/limit/10/sort/price_asc
I koniecznie zdobądź tablicę

$urls = array("towary", "strona", "2", "limit", "10", "sortuj", "price_asc");

Teraz mamy wszystkie dane, musimy z nimi zrobić coś pożytecznego. A do tego potrzeba tylko 4 linijek kodu.

// Zdefiniuj router i dane adresu URL $router = $urls; $urlData = array_slice($urls, 1); // Dołącz plik routera i uruchom główną funkcję include_once "routers/" . $router. ".php"; trasa($metoda, $urlData, $formData);

Rozumiesz? Tworzymy folder routerów, w którym dodajemy pliki manipulujące jednym podmiotem: towarami lub użytkownikami. Jednocześnie zgadzamy się, że nazwy plików pasują do pierwszego parametru w urlData - będzie to router $router. I ten router musi zostać usunięty z urlData, już go nie potrzebujemy i służy tylko do podłączenia żądanego pliku. array_slice($urls, 1) i wyciągnij wszystkie elementy tablicy, z wyjątkiem pierwszego.

Teraz pozostaje podłączyć żądany plik routera i uruchomić funkcję trasy z trzema parametrami. Co to za trasa funkcji? Umówmy się, że każdy plik routera zdefiniuje funkcję, która na podstawie parametrów wejściowych określi, jaką akcję zainicjował użytkownik i wykona wymagany kod. Teraz stanie się jaśniejsze. Rozważ pierwsze żądanie - uzyskanie danych o produkcie.

POBIERZ /towary/(dobryId)

Plik routery/goods.php

// Router funkcji route($method, $urlData, $formData) ( // Pobieranie informacji o produkcie // GET /goods/(goodId) if ($method === "GET" && count($urlData) === 1 ) ( // Pobierz identyfikator produktu $goodId = $urlData; // Wyodrębnij produkt z bazy danych... // Wyświetl odpowiedź do klienta echo json_encode(array("method" => "GET", "id" => $goodId, "good" => "phone", "price" => 10000)); return; ) // Zwróć nagłówek błędu("HTTP/1.0 400 Bad Request"); echo json_encode(array("error " => "Złe żądanie ")); )

Zawartość pliku to jedna duża funkcja trasy, która w zależności od przekazanych parametrów wykonuje niezbędne akcje. Jeśli metoda GET i 1 parametr (goodId) są przekazywane do urlData, jest to żądanie pobrania danych produktu.

Uwaga: przykład jest bardzo uproszczony.
W rzeczywistości oczywiście trzeba dodatkowo sprawdzić parametry wejściowe, np. goodId to liczba. Zamiast pisać tutaj kod, prawdopodobnie dodasz odpowiednią klasę. Aby otrzymać towar, stwórz obiekt tej klasy i wywołaj na nim jakąś metodę.
A może przekaże sterowanie do jakiegoś kontrolera, który już zajmie się inicjalizacją niezbędnych modeli. Opcji jest wiele, rozważamy tylko ogólną strukturę kodu.

W odpowiedzi na klienta wyświetlamy niezbędne dane: nazwę produktu i jego cenę. id produktu i metoda są całkowicie opcjonalne w rzeczywistej aplikacji. Pokazujemy je tylko po to, aby upewnić się, że wywoływana jest właściwa metoda z poprawnymi parametrami.

Spróbujmy na przykładzie: otwórz konsolę przeglądarki i wykonaj kod

$.ajax((url: "/examples/rest/goods/10", metoda: "GET", dataType: "json", sukces: function(odpowiedź)(console.log("odpowiedź:", odpowiedź))) )

Kod wyśle ​​żądanie do serwera, na którym wdrożyłem podobną aplikację i wydrukuje odpowiedź. Upewnij się, że trasa Cię interesuje /towary/10 naprawdę działało. Na karcie Sieć zauważysz to samo żądanie.
I tak, /examples/rest to ścieżka główna naszej aplikacji testowej do strony

Jeśli jesteś bardziej przyzwyczajony do używania curl w konsoli, uruchom to w terminalu - odpowiedź będzie taka sama, a nawet z nagłówkami z serwera.

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

Na końcu funkcji napisaliśmy następujący kod.

// Zwróć nagłówek błędu("HTTP/1.0 400 Bad Request"); echo json_encode(array("błąd" => "Złe żądanie"));

Oznacza to, że jeśli popełniliśmy błąd w parametrach lub żądana trasa nie jest zdefiniowana, to zwrócimy klientowi 400. błąd Bad Request. Dodaj na przykład do adresu URL coś takiego towary/10/inny_param i zobaczysz błąd w konsoli i odpowiedź 400 - krzywe żądanie nie powiodło się.

Za pomocą kodów http odpowiedzi serwera
Nie będziemy zawracać sobie głowy wyprowadzaniem różnych kodów, chociaż według REST warto to zrobić. Istnieje wiele błędów klienta. Nawet w naszym prostym przypadku 405 jest odpowiednie w przypadku niepoprawnie przekazanej metody. Nie chcę zbytnio komplikować rzeczy.
Jeśli się powiedzie, serwer zawsze zwróci 200 OK. Na dobrą sprawę, tworząc zasób, powinieneś podać 201 Utworzonych. Ale znowu, jeśli chodzi o uproszczenie, odrzucimy te subtelności, aw prawdziwym projekcie możesz je łatwo wdrożyć samodzielnie.

Szczerze mówiąc, artykuł się skończył. Myślę, że już zrozumiałeś podejście, jak rozwiązywane są wszystkie trasy, usuwane są dane, jak to testować, jak dodawać nowe żądania itp. Ale aby uzupełnić obraz, podam realizację pozostałych 7 żądań, które zidentyfikowaliśmy na początku artykułu. Po drodze dam kilka ciekawych uwag, a na koniec zamieszczę archiwum z kodami źródłowymi.

POST /towary

Dodanie nowego produktu

// Dodanie nowego produktu // POST /goods if ($method === "POST" && empty($urlData)) ( // Dodanie produktu do bazy danych... // Wyprowadzenie odpowiedzi do klienta echo json_encode (array("metoda" => "POST", "id" => rand(1, 100), "formData" => $formData)); return; )

urlData jest teraz pusty, ale używany jest formData - po prostu wyślemy go do klienta.

Jak to zrobić „dobrze”?
Zgodnie z kanonami REST, w post-requestie należy zwrócić tylko id tworzonego podmiotu lub url, pod którym można go uzyskać. Oznacza to, że odpowiedź będzie albo tylko liczbą - (dobry identyfikator), lub /towary/(Identyfikator dobrego).
Dlaczego napisałem „poprawnie” w cudzysłowie? Tak, ponieważ REST to nie zbiór ścisłych zasad, ale rekomendacje. A jak ją zrealizujesz, zależy od Twoich preferencji lub już przyjętych umów dotyczących konkretnego projektu.
Pamiętaj tylko, że inny programista, który czyta kod i jest świadomy podejścia REST, będzie oczekiwał w odpowiedzi na żądanie postu id utworzonego obiektu lub adres url, który można wykorzystać do pobrania danych o tym obiekcie za pomocą żądania get .

Testowanie z konsoli

$.ajax((url: "/examples/rest/goods/", method: "POST", data: (good: "notebook", price: 20000), dataType: "json", success: function(response)( console.log("odpowiedź:", odpowiedź))))

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

PUT /towary/(dobryId)

Edycja produktu

// Zaktualizuj wszystkie dane produktu // PUT /goods/(goodId) if ($method === "PUT" && count($urlData) === 1) ( // Pobierz identyfikator produktu $goodId = $urlData; // Zaktualizuj wszystkie pola produktów w bazie danych... // Wyświetl odpowiedź do klienta echo json_encode(array("method" => "PUT", "id" => $goodId, "formData" => $formData)); zwrócić; )

Tutaj wszystkie dane są już w pełni wykorzystane. Z urlData wyciągany jest id produktu, a z formData - właściwości.

Testowanie z konsoli

$.ajax((url: "/examples/rest/goods/15", metoda: "PUT", data: (good: "notebook", cena: 20000), dataType: "json", sukces: function(odpowiedź) (console.log("odpowiedź:", odpowiedź))))

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

PATCH /towary/(dobryId)

Częściowa aktualizacja produktu

// Częściowa aktualizacja danych produktu // PATCH /goods/(goodId) if ($method === "PATCH" && count($urlData) === 1) ( // Pobierz identyfikator produktu $goodId = $urlData; / / Aktualizuj tylko określone pola produktów w bazie danych... // Wyświetl odpowiedź do klienta echo json_encode(array("method" => "PATCH", "id" => $goodId, "formData" => $formData )); zwrócić; )

Testowanie z konsoli

$.ajax((url: "/examples/rest/goods/15", metoda: "PATCH", data: (cena: 25000), dataType: "json", sukces: function(odpowiedź)(console.log(" odpowiedź:", odpowiedź))))

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

Dlaczego te popisy z PUT i PATCH?
Czy jedno PUT nie wystarczy? Czy nie robią tego samego - aktualizują dane obiektu?
Zgadza się - na zewnątrz akcja jest jedna. Różnica w przesyłanych danych.
PUT zakłada, że ​​serwer jest wysyłany wszystko pola obiektów i PATCH - tylko zmieniony. Te przeszły w treści prośby. Zauważ, że w poprzednim PUT przekazaliśmy zarówno nazwę produktu, jak i cenę. A w PATCH - tylko cena. Oznacza to, że na serwer wysłaliśmy tylko zmienione dane.
Potrzebujesz PATCH - zdecyduj sam. Pamiętaj jednak, że programista czytający kod, o którym wspomniałem powyżej.

USUŃ /towary/(goodId)

Usuwanie produktu

// Usuwanie produktu // DELETE /goods/(goodId) if ($method === "DELETE" && count($urlData) === 1) ( // Pobierz identyfikator produktu $goodId = $urlData; // Usuń produkt z bazy danych... // Wyślij odpowiedź do klienta echo json_encode(array("method" => "DELETE", "id" => $goodId)); return; )

Testowanie z konsoli

$.ajax((url: "/examples/rest/goods/20", metoda: "DELETE", dataType: "json", sukces: function(odpowiedź)(console.log("odpowiedź:", odpowiedź))) )

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

Z żądaniem DELETE wszystko jest jasne. Przyjrzyjmy się teraz pracy z użytkownikami - routerem użytkowników i odpowiednio plikiem users.php

POBIERZ /users/(identyfikator użytkownika)

Pobieranie wszystkich danych użytkownika. Jeśli żądanie GET formularza /użytkownicy/(identyfikator użytkownika), zwrócimy wszystkie informacje o użytkowniku, jeśli dodatkowo zostaną określone /informacje lub /Zamówienia, następnie odpowiednio tylko informacje ogólne lub listę zamówień.

// Router funkcji route($method, $urlData, $formData) ( // Pobierz wszystkie informacje o użytkowniku // GET /users/(userId) if ($method === "GET" && count($urlData) == = 1) ( // Pobierz identyfikator produktu $userId = $urlData; // Pobierz wszystkie dane użytkownika z bazy danych... // Wyświetl odpowiedź do klienta echo json_encode(array("method" => "GET", "id" = > $userId, "info" => array("email" => " [e-mail chroniony]", "name" => "Webdevkin"), "orders" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "12.01.2017"), array(" orderId" => 8, "summa" => 5000, "orderDate" => "02/03/2017")))); return; ) // Zwróć nagłówek błędu("HTTP/1.0 400 Bad Request"); echo json_encode( array("błąd" => "Złe żądanie")); )

Testowanie z konsoli

$.ajax((url: "/examples/rest/users/5", metoda: "GET", dataType: "json", sukces: function(odpowiedź)(console.log("odpowiedź:", odpowiedź))) )

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

POBIERZ /users/(identyfikator użytkownika)/informacje

Ogólne informacje o użytkowniku

// Uzyskaj ogólne informacje o użytkowniku // GET /users/(userId)/info if ($method === "GET" && count($urlData) === 2 && $urlData === "info") ( // Pobranie identyfikatora produktu $userId = $urlData; // Pobranie ogólnych danych o użytkowniku z bazy danych... // Wyświetlenie odpowiedzi do klienta echo json_encode(array("method" => "GET", " id" => $userId, " info" => array("email" => " [e-mail chroniony]", "nazwa" => "Webdevkin"))); return; )

Testowanie z konsoli

$.ajax((url: "/examples/rest/users/5/info", metoda: "GET", dataType: "json", sukces: function(odpowiedź)(console.log("odpowiedź:", odpowiedź) )))

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

GET /users/(userId)/orders

Uzyskiwanie listy zamówień użytkowników

// Pobierz zamówienia użytkowników // GET /users/(userId)/orders if ($method === "GET" && count($urlData) === 2 && $urlData === "zamówienia") ( // Pobierz id produktu $userId = $urlData; // Wydobywanie danych o zamówieniach użytkowników z bazy danych... // Wyświetlanie odpowiedzi do klienta echo json_encode(array("method" => "GET", "id" => $userId , "orders" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "12.01.2017"), array("orderId" => 8, "summa" => 5000, "data zamówienia " => "02.03.2017")))); powrót; )

Testowanie z konsoli

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

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

Wyniki i źródła

Źródła z przykładów artykułów -

Jak widać zorganizowanie wsparcia dla REST API w natywnym php okazało się nie takie trudne i całkiem legalne. Najważniejsze jest wsparcie dla tras i niestandardowych metod php PUT, PATCH i DELETE.

Główny kod implementujący to wsparcie mieści się w 3 tuzinach linii index.php. Reszta to już powiązanie, które można zaimplementować w dowolny sposób. Zaproponowałem zrobienie tego w postaci dołączonych plików routera, których nazwy pasują do jednostek twojego projektu. Ale możesz połączyć swoją wyobraźnię i znaleźć ciekawsze rozwiązanie.