Počítače Okna Internet

Frenzy dělat php akce. PHP a formuláře. Špatné body související s proměnnou PHP _SELF

„Nepoužívej příkaz goto“- tak nám to řekli učitelé na akademii a skutečně, tento operátor mění kód v úplný nepořádek. Vývojáři php problém vyřešili radikálně - v php3 a php4 prostě neexistuje. Čím se zpočátku řídili? Možná nám všem chtěli vštípit správný styl programování? No, dá se říct, že se jim to docela povedlo - už jsme si na to všichni zvykli, to znamená, že je přesnější říci, že jsme úplně ztratili zvyk na tohoto operátora, možná je to k lepšímu, protože jsem jeden čas měl přijít s logickou strukturou, která tuto nešťastnou situaci zcela kompenzuje jít do.
Nevím, jak někdo, ale já jsem měl obzvlášť často touhu použít goto při vytváření html formuláře handleru, kdy se od uživatele posílá na server spousta dat, což php skript měli zkontrolovat krok za krokem. Tento proces probíhá zpravidla v několika fázích: tisk samotného formuláře, kontrola přijatých dat, předběžné zobrazení a například uložení. Některé fáze se navíc mohou opakovat: pokud kontrola dat neprošla úspěšně, přejdeme k tisku formuláře, nebo pokud náhled uživateli nevyhovuje, může se vrátit k zadávání dat. Stručně řečeno, některé části kódu lze použít vícekrát. Používání funkcí za těchto podmínek také není příliš pohodlné – vstupních a výstupních proměnných je mnoho, funkce musí provádět příliš složité akce, celkově působí nemotorně a čitelnost kódu prudce klesá.
A vymyslel jsem takový návrh.

dělat (

přepínač ($ akce) (

výchozí:

přestávka;

případ "PRINT_FORM":

Tiskneme hlavní formulář

přestávka;

případ "CHECK_FORM":

Kontrola správnosti údajů

přestávka;

případ "PREVIEW_FORM":

Náhled

přestávka;

případ "SAVE_FORM":

Data uložíme

přestávka;

) zatímco (pravda);

Zde je hlavní operátor s více volbami přepínač uzavřený v nekonečné smyčce dělat, zatímco- tímto způsobem seskupujeme potřebné úkony do sekcí případ: přestávka; a můžeme donekonečna přecházet z jedné sekce do druhé. V sekci výchozí: je vhodné provést předběžnou analýzu dat, například pokud neexistují žádná vstupní data $ action = 'PRINT_FORM' tiskopis vytiskneme, pokud existuje např $ _POST [‚předložit‘] následně odešleme přijatá data ke zpracování $ action = „CHECK_FORM“... K přenosu řízení mezi bloky spínačů dochází změnou proměnné $ akce, dobře, opusťte smyčku s přestávka 2; nebo odejít;
Takže například do tiskového bloku hlavního formuláře můžete bezpečně dát přestávka 2; protože výstup formuláře předpokládá konec skriptu.
Design je velmi flexibilní a čitelný. Má to ale jednu nevýhodu – pokud jsou data zpracována nesprávně, můžete se dostat do nekonečné smyčky a skript zamrzne – je nepříjemné čekat až 30 sekund.
Stanovme limit na počet cyklů operátora dělat, zatímco, 20 stačí s hlavou. Nyní, pokud jsme něco přidali, skript natočí 20 otáček, zastaví se a vyhodí varování o nouzovém zastavení.
Je velmi vhodné takovou strukturu odladit - stačí po operátorovi swith vypíšeme proměnnou $ action a dostaneme kompletní sekvenci provádění bloku.

DO (// na začátku každého cyklu vytiskneme jméno // prováděné sekce, velmi vhodné pro ladění akce echo $. ""; SWITCH (akce $) (výchozí: přerušení; malá a velká písmena "PRINT_FORM": / * tisk hlavního formuláře * / zalomení; malá a velká písmena "CHECK_FORM": / * kontrola správnosti údajů * / přerušení; velikost písmen "PREVIEW_FORM": / * náhled * / break ; malá a velká písmena "SAVE_FORM": / * uložení dat * / break;) // konec přepínače) WHILE ((($ i ++)< 20) or die("Принудительный останов цикла"));

DO (

// na začátku každého cyklu vytiskneme jméno

// spuštěná sekce je velmi vhodná pro ladění

echo $ akce. "";< / strong >

PŘEPNOUT (akce $) (

výchozí:

přestávka;

případ "PRINT_FORM":

tiskneme hlavní formulář

přestávka;

Poslední aktualizace: 1.11.2015

Zpracování formulářů je jedním z hlavních způsobů přenosu dat na webovou stránku. Formuláře představují speciální prvky značek HTML, které obsahují různé vstupní prvky – textová pole, tlačítka a tak dále. A pomocí dat formuláře můžeme zadat nějaká data a odeslat je na server. A server tato data již zpracovává.

Vytvoření formuláře se skládá z následujících aspektů:

    Vytvoření prvku

    v HTML značkách

    Přidání jednoho nebo více vstupních polí k tomuto prvku

    Nastavení způsobu přenosu dat: GET nebo POST

    Nastavení adresy, na kterou budou zasílány zadané údaje

Pojďme tedy vytvořit nový tvar. K tomu si nadefinujeme nový soubor form.php, do kterého vložíme následující obsah:

Zadejte web

Přihlásit se:

Heslo:

Atribut action = "login.php" prvku formuláře určuje, že data formuláře budou zpracována skriptem login.php který bude se souborem formulář.php v jedné složce. A atribut method = "POST" označuje, že jako metoda přenosu dat bude použita metoda POST.

Nyní vytvoříme soubor login.php který bude mít následující obsah:

Vaše heslo: $ password ";?>

Globální proměnná $ _POST se používá k získání dat formuláře. Představuje asociativní pole dat odeslaných pomocí metody POST. Pomocí kláves můžeme získat odeslané hodnoty. Klíče v tomto poli jsou hodnoty atributů názvu vstupních polí formuláře.

Protože atribut name vstupního pole přihlášení je login ( ), pak v poli $ _POST bude hodnota tohoto pole představovat klíč "login": $ _POST ["login"]

A protože existují situace, kdy vstupní pole nebude nastaveno, například když přejdete přímo do skriptu: http: // localhost: 8080 / login.php... V tomto případě je vhodné před zpracováním dat zkontrolovat dostupnost dat pomocí funkce isset (). A pokud je proměnná nastavena, pak funkce isset () vrátí hodnotu true.

Nyní se můžeme obrátit na formulář:

A stisknutím tlačítka zadaná data metodou POST bude odesláno do skriptu login.php:

Data formuláře nemusíte odesílat do jiného skriptu, data formuláře můžete zpracovat ve stejném souboru formuláře. Za tímto účelem změníme soubor formulář.php následujícím způsobem:

Vaše heslo: $ password ";)?>

Zadejte web

Přihlásit se:

Heslo:

Bezpečnost dat

Zabezpečení dat je v PHP velmi důležité. Pojďme se podívat na pár jednoduchých mechanismů, které mohou zlepšit zabezpečení našeho webu.

Nejprve si ale vezměme formulář z předchozího tématu a zkusme do něj zadat nějaké údaje. Například do přihlašovacího pole zadejte ""a v poli pro heslo text"

Heslo

":

Po odeslání dat do značky html bude vložen javascriptový kód, který zobrazí okno se zprávou.

Chcete-li se tomuto druhu bezpečnostního problému vyhnout, použijte funkci htmlentities ():

If (isset ($ _ POST ["login"]) && isset ($ _ POST ["heslo"])) ($ login = htmlentities ($ _ POST ["login"]); $ password = htmlentities ($ _ POST ["heslo" ]); echo "Vaše přihlašovací údaje: $ přihlášení
Vaše heslo: $ password ";)

A to i po zadání html kód nebo javascript budou všechny značky escapovány a dostaneme následující výstup:

Další funkce, funkce strip_tags (), vám umožňuje zcela odstranit html značky:

If (isset ($ _ POST ["login")] && isset ($ _ POST ["heslo"])) ($ login = strip_tags ($ _ POST ["login"]); $ password = strip_tags ($ _ POST ["heslo" ]); echo "Vaše přihlašovací údaje: $ přihlášení
Vaše heslo: $ password ";)

Výsledkem jeho práce se stejným vstupem bude následující výstup.

24,6 tis

Pro nikoho není tajemstvím, že nejčastějším způsobem interakce html stránky s webem je formulář. Formulář (tedy html prvek tvořený tagem formuláře) využívají i bezplatné poštovní služby, e-shopy a mnoho dalších typů stránek.

Zpracování jednoduchých formulářů pomocí PHP je snadné. Čas od času se však objeví potřeba zpracovat formulář obsahující více polí stejného typu, navíc se jejich počet může lišit v širokém rozmezí a jejich počet není předem znám. PHP pro takové případy poskytuje zpracování stejného typu polí jako pole hodnot.


Podívejme se podrobněji na možnosti pro odlišné typy pole.

Textová pole

Textová pole v tomto článku odkazují na prvky vytvořené vstupními tagy s typem parametru text a tagem textarea. Nejjednodušší je zorganizovat zpracování formuláře sestávajícího z několika takových polí. Níže uvedený výpis ukazuje výpis s html označením pro takový formulář.






Jak můžete vidět z výpisu, názvy prvků formuláře jsou z pohledu PHP prvky pole. Skript PHP, který zpracuje tento formulář, proto bude s celou sadou textových polí na tomto formuláři zacházet jako s jedním polem. Jednotlivé prvky lze odkazovat pomocí indexu nebo vyčíslit pomocí seznamu a jednotlivých příkazů, jako v následujícím příkladu.

n ";?>

Přepínače

Zaškrtávací políčka v tomto článku jsou prvky vytvořené vstupními značkami s parametrem type rovným zaškrtávacímu políčku. Formulář pro použití proměnného počtu "přepínačů" je postaven úplně stejně. Všimněte si, že výběr konkrétní hodnoty přepínacího tlačítka (tj. hodnoty vlastnosti value) není důležitý. Příklad je uveden v seznamu níže:






Zpracování takového formuláře se však liší od zpracování popsaného u textových polí. V tomto případě je nutné zjistit, zda návštěvník webu zapnul ten či onen přepínač. Pokud je povoleno, pak odpovídající prvek pole existuje, pokud ne, pak chybí. Následující výpis ukazuje příklad PHP skriptu, který vytiskne povolené přepínače:

Přepínací tlačítka

Než popíšete zpracování přepínacích tlačítek, musíte si zapamatovat, jak fungují. Podstatou přepínacích tlačítek (prvky vytvořené vstupními tagy s hodnotou parametru typu rovnou rádiu) je, že výběrem jednoho tlačítka uživatel automaticky odznačí další tlačítko ze stejné sady. Je velmi snadné kombinovat tlačítka do sady: všechna tlačítka v sadě mají stejný název.

Ale hodnoty (tj. parametry hodnot) tlačítek v sadě se liší. A hodnota vybraného tlačítka s názvem sady bude odeslána na web. Stejně jako u textových polí a přepínacích tlačítek musí být názvy sad přepínacích tlačítek v PHP formátovány jako názvy prvků pole. Příklad takového formuláře je uveden v následujícím seznamu:

// první sada tlačítek
// druhá sada tlačítek
// třetí sada tlačítek

Zpracování přepínacích tlačítek kombinuje nápady, při zpracování využívá textová pole i přepínací tlačítka. Pokud autor html stránky nenastavil výchozí hodnotu a uživatel nevybral konkrétní tlačítko v sadě přepínačů, pak tento prvek nebude v poli přítomen (jako u přepínačů).

Vytvořili jsme základ pro budoucí plugin, který rozpoznává systém WordPress... Dnes se budeme zabývat přímo změnou základní funkcionality systému.

K tomu nám pomůže systém háčků, akcí a filtrů. Tyto tři koncepty jsou jádrem každého pluginu WordPress.

Háčky

Ve WordPressu jsou dva typy háčků:

  • Akční háček: označuje místo v kódu, které provádí určitou akci, např. je potřeba zadat nějaké údaje a uložit je do databáze.
  • Háček na filtr: označí filtr, který změní libovolnou hodnotu (proměnnou), takže v budoucnu bude kód používat upravenou hodnotu.

Akce

Práce s událostmi (akcemi)

Obecná logika pro správu událostí ve WordPressu je jednoduchá:

  1. Označte místo, kde se má akce provést, pomocí akčního háku s požadovanými parametry.
  2. Vytvořte funkci, která bude provádět požadované akce pomocí parametrů předávaných háčkem.
  3. Zaregistrujte událost, která bude provedena při spuštění zavěšení, se specifickou prioritou.
  4. Když WordPress načte stránku a najde háček, systém provede všechny funkce, které jsou k tomuto háku zaregistrovány.

K provedení prvního kroku systém poskytuje funkci 'do_action':

Do_action ($ tag, $ arg_1, $ arg_2, ..., $ arg_n);

Přijímá následující argumenty: $ tag - název "háčku", $ arg_1, $ arg_2,…, $ arg_n - parametry, se kterými bude funkce volána. Argumentů může být libovolný počet nebo 0.

Samotný systém má mnoho již definovaných háčků:

Do_action ("init");

Toto je velmi jednoduchý příklad bez dalších argumentů. Datový hák se spustí, když je většina systému již nakonfigurována a je čas vytvořit si vlastní objekty, kategorie, příspěvky atd.

Do_action ("save_post", $ post_id, $ post);

V tomto příkladu se hák spustí, když je příspěvek uložen se dvěma argumenty post_id - ID příspěvku a příspěvek - samotný příspěvek.

Vytvoření háku je k dispozici všem vývojářům, aby si vytvořil vlastní plugin (nebo téma). To nám dává mocný nástroj pro správu chování systému.

Do_action ("můj_skutečně_vlastní_hook");

Když jsme vytvořili háček a napsali funkci, musíme funkci zaregistrovat pomocí "add_action"

Add_action (tag $, $ function_to_add, $ priorita, $ accept_args_number);

Funkce „add_action“ má dva požadované parametry: $ tag: název odpovídajícího háčku a $ function_to_add: název funkce, která má být volána. Další dva parametry jsou volitelné: $ priorita: celočíselná proměnná, která určuje pořadí, ve kterém je funkce vykonávána (výchozí je 10), $ accept_args_number: počet argumentů, které funkce přijímá (výchozí je 1).

Podívejme se na příklad, abychom celý proces pochopili. Řekněme, že chceme přidat malé upozornění na konec našeho webu. Můžeme k tomu použít háček ‚wp_footer‘, protože je to povinná součást kódu, který používá každé téma.

Funkce msp_helloworld_footer_notice () (echo "

Dobrý den, jsem vaše vlastní upozornění
";) add_action (" wp_footer "," msp_helloworld_footer_notice ");

V tomto příkladu jsme vytvořili funkci, která jednoduše vygeneruje označení pro výstrahu a zaregistruje ji do „wp_footer“. Jakmile tento kód přidáme do našeho souboru pluginu (viz předchozí), uvidíme výsledek na stránce:

Upozornění na plugin WordPress

Práce s filtry

Filtry fungují stejně jako události. Filtry však nespouštějí pouze konkrétní část kódu, ale upravují hodnoty, které jim předá háček. To znamená, že každý filtr má přidruženou hodnotu (proměnnou), se kterou pracuje.

Funkce filtru převezme tuto hodnotu a transformuje ji pro pozdější použití. Filtrové háčky se mírně liší od akčních háčků.

Apply_filters (značka $, $ value_to_filter, $ arg_1, $ arg_2, ..., $ arg_n);

Funkce ‘apply_filter’ vytvoří háček pro filtr s názvem $ tag a požadovaný parametr $ value_to_filter (může být prázdný, ale musí být deklarován). Zbytek volitelných argumentů funguje stejně jako u událostí.

Funkce filtru ($ value_to_filter, $ arg_1, $ arg_2, ..., $ arg_n) (// návrat filtru $ value_to_filter; // hodnota musí být vrácena)

Toto je kostra filtru, která ukazuje, že filtr by měl:

  1. vzít alespoň 1 argument;
  2. vrátit upravenou hodnotu.
add_filter (tag $, $ function_to_add, $ priorita, $ accept_args);

Funkce 'add_filter' registruje funkci s názvem obsaženým v $ function_to_add pro háček značky $. Zbývající argumenty - $ priorita a $ accept_args - fungují stejně jako pro háčky událostí.

Běžným úkolem pluginu je například přidat něco na konec příspěvku. Pokud se blíže podíváme na funkci ‚the_content‘, která se používá k zobrazení obsahu příspěvku, najdeme háček takto:

$ content = apply_filters ("the_content", $ content);

Pomocí něj můžeme na konec příspěvku snadno přidat cokoliv.

Funkce msp_helloworld_post_footer ($ content) ($ content. = "

"; return $ content;) add_filter (" the_content "," msp_helloworld_post_footer ", 100);

Vezměte prosím na vědomí, že používáme velké číslo jako prioritu, abychom se ujistili, že všechny standardní filtry byly zpracovány před provedením „msp_helloworld_post_footer“. Po zahrnutí kódu do našeho pluginu uvidíme výsledek:


Jak najít háček

Nyní je nám jasné, že abychom mohli provádět určité akce, musíme vědět o existujících hácích.

WordPress Codex poskytuje seznamy háčků pro filtry a události Action Reference a Filter Reference.

Další akce s háčky

Stejně jako přidání lze háček odstranit pomocí podobné syntaxe.

Události můžete smazat takto:

Remove_action (značka $, $ function_to_remove, $ priorita, $ accept_args); remove_all_actions (značka $, priorita $);

Jak jste možná uhodli, 'remove_action' odstraní konkrétní událost registrovanou pro tento háček (musíte správně zadat prioritu a počet argumentů, jak bylo zadáno při registraci) a 'remove_all_actions' pomáhá odstranit všechny události registrované pro háček (pokud je priorita vynechána, funkce smaže všechny události).

Filtry lze odstranit stejným způsobem:

Remove_filter (značka $, $ function_to_remove, $ priorita, $ accept_args); remove_all_filters (značka $, priorita $);

Rozhraní API pluginu WordPress také poskytuje funkce pro kontrolu, zda je funkce registrována pro daný háček:

Has_action (značka $, $ function_to_check); has_filter (značka $, $ function_to_check);

Obě funkce kontrolují, zda tuto funkci pro háček a návrat true při úspěchu, jinak flase. Uvnitř funkce máme možnost zkontrolovat, že to háček nazval:

If ("hook_to_check_name" === aktuální_filtr ()) ()

Navzdory názvu ‘current_filter’ pracuje nejen s filtry, ale také s událostmi.

Netriviální příklad

Pojďme si animovat „kostru“ našeho pluginu, který jsme připravili v minulé lekci.

Do souboru ‚core.php‘ (hlavní část našeho pluginu, která obsahuje hlavní část funkcí) vyplňte kód, který řeší problém, který může při práci skutečně nastat. K jeho vyřešení použijeme akce a filtry.

Umožněte svému webu WordPress přijímat příspěvky od různých autorů od hostů, ale neumožněte vám vytvářet účty. To znamená, že uživatel, který příspěvek zveřejnil, a skutečný autor jsou různí lidé a my se musíme ujistit, že je v příspěvku uveden autor. Můžeme to udělat pomocí taxonomie.

Vytvořme si vlastní taxonomii pro zacházení se jménem autora a krátkým životopisem. V příspěvku budeme moci použít jméno autora jako jiné taxonomické termíny (například tagy). Kód:

/ ** registrovat filtry a události ** / funkce msp_helloworld_init () (add_action ("init", "msp_helloworld_taxonomies"); add_filter ("the_content", "msp_helloworld_author_block_filter"); add_filter ("post_class", "msp_hellow") add plugins_loaded", "msp_helloworld_init"); / ** taxonomie ** / funkce msp_helloworld_taxonomies () ($ args = pole ("labels" => pole ("name" => "Autoři hostů", "singular_name" => "Autor host"), "show_in_nav_menus" => false); register_taxonomy ("gauthor", pole ("post"), $ args);) / ** označení bloku autora ** / funkce msp_helloworld_author_block () (globální příspěvek $; $ author_terms = wp_get_object_terms ($ post-> ID, "gauthor"); if (prázdné ($ author_terms)) return; $ name = stripslashes ($ author_terms-> name); $ url = esc_url (get_term_link ($ author_terms)); $ desc = wp_filter_post_kses ($ author_terms-> popis); $ out = "

"; $ out. ="
Toto je příspěvek hosta od ($ name)
"; $ out. ="
($ desc)
"; return $ out;) / ** přidat označení na konec příspěvku ** / funkce msp_helloworld_author_block_filter ($ content) (if (is_single ()) $ content. = msp_helloworld_author_block (); return $ content;) / ** přidat třídu CSS do příspěvku ** / funkce msp_helloworld_post_class ($ post_class) (globální příspěvek $; $ author_terms = wp_get_object_terms ($ post-> ID, "gauthor"); if (! prázdné ($ author_terms)) ($ post_class = " gauthor";) return $ post_class;)

Jak můžete vidět, vytvořili jsme funkci pro registraci naší vlastní taxonomie a svázali ji s háčkem 'init'. Poté jsme vytvořili šablonu zodpovědnou za zobrazení autorského bloku pomocí funkce „wp_get_object_terms“ WordPress. Poté jsme pomocí filtru ‚the_content‘ vložili na konec příspěvku blok s informacemi o autorovi. Nakonec jsme přidali vlastní CSS třídu. Výsledek práce:


Vytvoří událost (háček pro libovolnou funkci). Aby byla funkce spuštěna v okamžiku události, musí být k této události připojena pomocí funkce add_action ().

Kromě událostí má WP filtry, princip fungování je stejný. Jediný rozdíl je v tom, že filtr musí vrátit výslednou proměnnou, tzn. filtruje (upravuje) data a událost umožňuje spuštění uživatelem definované funkce, když je tato událost spuštěna. Filtry jsou spouštěny funkcí apply_filters ().

✈ 1krát = 0,00007s = velmi rychle| 50 000 krát = 0,03 s = rychlost světla

Nejsou tam žádné háčky.

Návraty

Nevrací nic.

Používání

do_action (značka $, $ arg_a, $ arg_b, ...); $ tag (řetězec) (povinný) Název háčku, který se má vytvořit. $ arg_a Hodnota argumentu, který má být předán.
$ arg_b (řetězec / pole / číslo / objekt / logická hodnota) Smysl ještě jednoho argumentu...
Výchozí: argument neexistuje$ arg_с (řetězec / pole / číslo / objekt / logická hodnota) Funkcemi lze předat nekonečně mnoho argumentů ...

Příklady

#1. Příklad použití

Tuto funkci lze použít v zásuvných modulech, motivech atd., když je třeba ji vložit do procesu provádění kódu odjinud. Do pluginu jsme například nainstalovali „háček“ (do_action) a na něj se „přichytíme“ ze souboru functions.php v okamžiku, kdy se náš „háček“ spustí.

Řekněme, že jsme tento kód použili v pluginu:

Nyní můžeme provést nějakou akci v okamžiku, kdy je spuštěna funkce do_action, a zároveň můžeme naši akci popsat například ze souboru functions.php tak, že do něj vložíme následující kód:

Funkce do_my_hook ($ a, $ b) (// pokud je předaná proměnná $ a pravdivá, // pak například smažte záznam 10 if ($ a === true) wp_delete_post (10); // a zde jen zobrazíme proměnnou echo "
". $ b; // zobrazí hodnotu druhé proměnné) // Zaregistrujte háček pomocí // add_action (značka $, $ function_to_add, $ priority, $ accept_args); add_action (" my_hook "," do_my_hook ", 10, 2);

Akce se liší od filtrů v tom, že data předaná akcí se nevracejí zpět do funkce a v budoucnu se tam nepoužijí, ale pouze se předají pro použití ve funkci zavěšení.

Kód udělat akci: wp-includes / plugin.php WP 5.2.2

do_action ($ args); array_pop ($ wp_current_filter); )