Ako vytvoriť vyhľadávací algoritmus pre niekoľko slov v PHP z databázy. PHP _SELF na atribúte action formulára Home men search php submit

V tomto článku sa dozviete, ako vytvoriť vyhľadávanie obsahu databázy pre vašu stránku. Tento algoritmus podporuje vyhľadávanie viacerých kľúčových slov. Algoritmus vyberie riadky databázovej tabuľky, v ktorých sú prítomné všetky zadané kľúčové slová.

Je tam stôl "novinky" ktorý obsahuje nasledujúce polia: id, titul a obsahu:

Chcete hľadať podľa poľa obsahu v našej databáze, ktorá pozostáva z nasledujúcich stĺpcov, pozri príklad na obrázku vyššie. Poďme k implementácii. Najprv si vytvorte stránku na testovanie práce. Bude obsahovať formulár s poľom na zadávanie kľúčových slov a tlačidlom "nájsť":

Výpis html kódu:

Vyhľadajte v databáze

Do atribútov formulára zapíšeme cestu k handleru, ktorý obsahuje algoritmus a metódu post transfer.

Na odovzdanie radu vybraných položiek používame reláciu.

Aby sme to dosiahli, spustíme ho na samom začiatku stránky.

Pre výstup použijeme funkciu print_r ().

Aby sa po opätovnom načítaní stránky výsledok nezobrazil druhýkrát pomocou odstaviť zabijeme reláciu.

Vytvorme handler search.php... Najprv spustíme reláciu a pripojíme sa k databáze:

"localhost", "dbname" => "ggwp", "user" => "ggwp", "password" => "123456",); $ dsn = "mysql: host = ($ params [" hostiteľ "]); dbname = ($ params [" dbname "])"; $ db = nové PDO ($ dsn, $ params ["používateľ"], $ params ["heslo"]); $ db-> exec ("názvy súborov utf8"); ?>

Získajte viac informácií o pripojení k databáze cez CHOP pozrieť sa do.

Činnosť algoritmu je znázornená na obrázku:

Rozoberme si výber podľa prvého slova, ako príklad použijeme vyhľadávací dopyt „ako urobiť webovú stránku“:

dotaz ($ sql); $ result-> setFetchMode (PDO :: FETCH_ASSOC); $ id_mass = pole (); $ i = 1; while ($ row = $ result-> fetch ()) ($ id_mass [$ i] = $ riadok ["id"]; $ i ++;) $ id_count = count ($ id_mass); ?>

Najprv sa zmeňte $ str získajte reťazec z formulára pomocou metódy POST... Tento riadok rozdelíme pomocou funkcie na slová oddelené medzerou vystaviť a spočítajte počet slov. Vykonáme dotaz, v ktorom skontrolujeme prítomnosť prvého slova v stĺpci obsahu... Vytvoríme prázdne pole a zapíšeme do neho hodnoty získané ako výsledok výberu dotazu. Zapisujeme si $ id_count počet prijatých položiek.

dotaz ($ sql); $ result-> setFetchMode (PDO :: FETCH_ASSOC); $ vysledok-> vykonat (); $ id_mass2 = pole (); $ riadok = $ vysledok-> vyzdvihnutie (); $ temp = $ riadok ["id"]; if ($ temp! = $ id_mass [$ j]) ($ id_mass [$ j] = -1;)))?>

Táto časť algoritmu funguje na princípe „skríningu“. Povedzme, že v databáze je desať článkov. Po vzorkovaní prvého slova dostaneme idčlánkov, v ktorých je slovo „ako“, takýchto článkov bolo šesť. Ďalej hľadáme druhé slovo medzi týmito šiestimi článkami, čím zužujeme vyhľadávanie. Táto iterácia ponecháva štyri články, ktoré obsahujú ako a čo robiť. V poslednej iterácii medzi zvyšnými štyrmi článkami hľadáme slovo „site“. Po tomto prechode dostaneme id jeden článok, ktorý obsahuje všetky kľúčové slová.

Počet iterácií sa rovná počtu slov vo vyhľadávacom dopyte. Konečná prijatá suma id môže byť čokoľvek, v závislosti od dotazu a obsahu databázovej tabuľky.

Ak v dôsledku vykonania dotazu v slučke dostaneme id(premenná tepl) rovná jednej z id predchádzajúca vzorka ( id_mass), potom toto id nechávame nezmenené. V opačnom prípade priradíme k prvku id_mass [j] hodnotu -1, čím sa vylúči zo spracovania.

Po skončení cyklov dostaneme pole z id kde boli nájdené kľúčové slová a -1. Preniesť používateľovi len tie požadované id, používame cyklus, v ktorom prebieha kontrola, v dôsledku ktorej sú všetky prvky rovné -1 vyradené. Ostatné prvky odovzdáme do poľa relácie:

Funkcia hlavička slúži na presmerovanie klienta na stránku vyhľadávania.

V dôsledku vykonaných akcií sme dostali funkciu prehľadávania databázovej tabuľky. S malými úpravami je možné tento algoritmus použiť na načítanie a vyhľadávanie akéhokoľvek poľa v akejkoľvek databáze.

Na organizáciu prenosu údajov na server pomocou formulára budete musieť implementovať HTML formulár, do ktorého návštevníci stránky zadajú svoje informácie a PHP kód, ktorého účelom je prijímať a spracovávať prijaté údaje na serveri.

HTML formulár na odosielanie údajov

Formulár na stránke tvoria značky

...
, vo vnútri ktorej sú umiestnené značky pre polia na zadávanie textových informácií, značky pre špeciálne komponenty (napríklad pole so zoznamom), značky pre pole výberu a nahrávanie súboru.

* V prípade HTML5 je tiež možné umiestniť značky poľa formulára nie do značiek formulára, ale kdekoľvek na stránke. Okrem toho musíte pre každé takéto pole zadať atribút „form“, aby ste určili, s ktorou formou odoslania má interagovať.

Takže najjednoduchší odoslaný formulár môže obsahovať nasledujúci kód:


Hodnota A:
Hodnota B:

Prvky formulára a ich parametre:

action = "myform.php"- atribút "action" definuje, ktorý php súbor spracuje odoslané údaje. V tomto príklade budú údaje odoslané do súboru "myform.php" umiestneného v rovnakom adresári ako stránka s formulárom. Ak tento atribút nie je výslovne uvedený, údaje formulára sa odošlú na adresu stránky samotného formulára.

metóda = "post"- parameter method definuje spôsob prenosu dát POST alebo GET. Viac podrobností o tom v článku "Rozdiely medzi metódami POST a GET". Ak atribút explicitne nešpecifikujete, štandardne sa použije metóda GET.

Text "Význam A:" a "Hodnota B:" pridané len za účelom dizajnu a prehľadnosti formulára pre užívateľa. Pri prenose údajov to nie je potrebné pridávať, ale aby používateľ pochopil, čo má zadať, stojí za to špecifikovať.

Značky: sa používajú na vytváranie rôznych ovládacích prvkov formulárov.

typ = "text"- atribút "type" definuje typ poľa. V závislosti od špecifikovaného typu sa mení vzhľad prvku aj jeho účel. Hodnota atribútu „text“ označuje, že prehliadač vykreslí prvok ako jednoriadkové textové pole, do ktorého môže používateľ zadať svoj reťazec.

name = "data1"- atribút "name" označuje názov alebo skôr index údajov v poli prijatom serverom. Toto je povinný parameter, pomocou ktorého je potom možné pristupovať k odovzdanej hodnote v obslužnom programe php. Názov je možné zvoliť ľubovoľne, je však vhodnejšie, keď má táto hodnota nejaký zrozumiteľný význam.

typ = "odoslať"- štítok s touto hodnotou parametra "typ" sa zobrazí na stránke ako tlačidlo. V skutočnosti sa zaobídete bez tlačidla na formulári. Ak má formulár napríklad textové polia, odoslanie je možné vykonať jednoduchým stlačením klávesu „Enter“ na klávesnici. Prítomnosť tlačidla však robí formulár zrozumiteľnejším.

value = "(! LANG: Odoslať" !}- v tomto prípade (pre typ = "odoslať") definuje len nadpis na tlačidle. Napríklad pre typ = "text" to bude text, ktorý sa zobrazí v textovom poli.

V dôsledku toho bude tento kód na stránke vyzerať asi takto:

Kliknutím na tlačidlo sa údaje odošlú na zadanú stránku a ak existuje a funguje správne, údaje sa spracujú.

Spracovanie údajov odoslaných formulárom HTML v PHP

Takto odoslané dáta sa umiestnia do superglobálnych polí $ _POST, $ _GET a $ _REQUEST. $ _POST alebo $ _GET bude obsahovať údaje v závislosti od spôsobu odoslania. $ _REQUEST obsahuje zadané údaje ktoroukoľvek zo špecifikovaných metód.

$ _POST, $ _GET a $ _REQUEST sú asociatívne polia, ktorých polia indexu sa zhodujú s atribútmi „name“ značiek ... Ak chcete pracovať s údajmi v súbore myform.php, môžete premenným priradiť hodnoty prvkov takéhoto poľa zadaním názvu poľa ako indexu:

// pre metódu GET
$ a = $ _GET [ "údaje1"];
$ b = $ _GET [ "údaje2"];

// pre metódu POST
$ a = $ _POST [ "údaje1"];
$ b = $ _POST [ "údaje2"];

// pre akúkoľvek metódu
$ a = $ _REQUEST [ "údaje1"];
$ b = $ _REQUEST [ "údaje2"];

Kontrola vyplnenia polí formulára

Niekedy pri prijímaní údajov musíte skontrolovať, či používateľ odoslal prázdny formulár. Na to môžete použiť funkciu prázdny.

if (prázdne ($ _REQUEST ["data1"])) (
ozvena "Pole nie je vyplnené";
} inak (
ozvena "Pole bolo vyplnené";
$ a = $ _REQUEST [ "údaje1"];
}

Zvyčajne toto riešenie postačuje. Ak potrebujete zadať text, bude jasné, či je zadaný alebo nie. Ak však používateľ pri výpočtoch úmyselne zadá nulu, prázdna funkcia ukáže, že neexistuje žiadna hodnota. Preto je pre takéto situácie lepšie použiť funkciu isset. Explicitne skontroluje, či je hodnota daná alebo nie.

if (isset ($ _REQUEST ["data1"])) (
ozvena "Pole bolo vyplnené";
$ a = $ _REQUEST [ "údaje1"];
} inak (
ozvena "Pole nie je vyplnené";
}

Tento článok podrobne popisuje použitie premennej PHP _SELF.

Čo je premenná PHP _SELF?

PHP premenná _SELF vracia názov a cestu k aktuálnemu súboru (vzhľadom na koreň dokumentu). Túto premennú môžete použiť v atribúte akcie formulára. Existujú aj niektoré nuansy, o ktorých by ste si mali byť vedomí. Tieto nuansy, samozrejme, nemôžeme žiadnym spôsobom ignorovať.

Pozrime sa na niekoľko príkladov.

Echo $ _SERVER ["PHP_SELF"];

1) Predpokladajme, že váš súbor php sa nachádza na nasledujúcej adrese:

Http://www.yourserver.com/form-action.php

V tomto prípade bude premenná PHP _SELF obsahovať:

"/form-action.php"

2) Predpokladajme, že váš súbor php sa nachádza na tejto adrese:

Http://www.yourserver.com/dir1/form-action.php

PHP _SELF bude:

"/dir1/form-action.php"

PHP _SELF na atribút akcie formulára. Prečo ju tam potrebovali?

Typicky sa PHP premenná _SELF používa v atribúte action tagu formulára. Atribút action špecifikuje adresu, na ktorú bude obsah formulára odoslaný po potvrdení (používateľ klikne na tlačidlo s typom = "odoslať"). Spravidla ide o tú istú stránku, z ktorej formulár odišiel.

Ak však premenujete súbor, na ktorý formulár odkazuje, budete musieť premenovať názov súboru v atribúte action, inak formulár nebude fungovať.

Premenná PHP _SELF vám ušetrí zbytočné opravy, keďže adresa stránky sa vygeneruje automaticky na základe názvu súboru.

Povedzme, že máte súbor s formulárom form-action.php a chcete, aby bol formulár po potvrdení odoslaný do rovnakého súboru. Zvyčajne píšu takto:

Ale môžete použiť PHP premennú _SELF namiesto form-action.php. V tomto prípade bude kód vyzerať takto:

" >

Kód pre form-action.php

Skombinujme skript s formulárom:

$ meno"; echo"
Na zadanie nového mena môžete znova použiť nasledujúci formulár. ";)?> ">

Najprv sa spustí kód v hornej časti stránky HTML. Prvý riadok kódu kontroluje, či bol formulár odoslaný alebo nie. Ak $ _POST ["submit"] existuje, potom sa vykoná konštrukcia IF (TRUE) a zobrazí sa meno zadané používateľom.

Ak premenná $ _POST ["submit"] neexistuje, formulár nebol odoslaný, a preto sa konštrukcia IF nevykoná (FALSE). Preto sa používateľské meno nezobrazí.

Zlé body súvisiace s premennou PHP _SELF

PHP premenná _SELF sa používa na získanie názvu a cesty aktuálneho súboru – dobré, ale môžu ju použiť aj hackeri – zlé. Ak má vaša stránka PHP _SELF, používateľ môže zadať lomku (/) a napísať škodlivé skripty XXS.

Uvažujme o príklade:

"metóda =" príspevok ">

Teraz, ak používateľ prišiel z normálnej adresy URL, panel s adresou bude obsahovať niečo ako:
http://www.yourdomain.com/form-action.php
a vyššie uvedený kód možno čítať takto:

V tomto prípade, ako vidíte, je všetko v poriadku.

Teraz sa pozrime na situáciu, keď používateľ začne „podvádzať“ s adresným riadkom:
http://www.yourdomain.com/form-action.php/%22%3E%3Cscript%3Ealert("xss")%3C
/ skript% 3E% 3Cfoo% 22

V tomto prípade po spustení PHP bude váš kód vyzerať takto:

Sami vidíte, že do kódu pribudla značka skriptu a výstražný príkaz. Po načítaní tejto stránky sa používateľovi zobrazí varovné okno. Toto je jednoduchý príklad toho, ako možno využiť premennú PHP _SELF.

Medzi značky skriptu je možné pridať akýkoľvek kód JavaScript. Hacker môže tiež odkazovať na súbor JavaScript, ktorý bude umiestnený na inom serveri. Tento súbor pravdepodobne obsahuje škodlivý kód, prostredníctvom ktorého môže hacker zmeniť globálne premenné a odoslať formulár na inú adresu, aby mohol zachytiť vstup používateľa.

Ako sa vyhnúť problémom s PHP _SELF

Problémom sa dá vyhnúť použitím funkcie htmlentities (). Pozrite sa na kód formulára, v ktorom je prítomná funkcia htmlentities ().

"metóda =" príspevok ">

Funkcia htmlentities () konvertuje všetky možné znaky na ich zodpovedajúce HTML entity. Teraz pokus o obídenie premennej PHP _SELF zlyhá a výsledok vloženia škodlivého kódu bude vyjadrený takto:

Skúste napísať slovo ajax


Výsledky pre

V tomto súbore sme vytvorili bežný HTML formulár, ktorý odosiela požiadavku POST do back-end súboru do_search.php.

select_list ($ sql); if (počet ($ riadok)) ($ end_result = ""; foreach ($ riadok ako $ r) ($ výsledok = $ r ["title"]; $ bold = " ". $ slovo.""; $ end_result. ="

  • ". str_ireplace ($ slovo, $ tučné, $ výsledok)."
  • ";) echo $ end_result;) else (echo"
  • Nenašli sa žiadne výsledky pre vaše vyhľadávanie.
  • "; } } ?>

    PHP kód obsahuje komentáre, pomocou ktorých môžete ľahko pochopiť, ako skript funguje. Ak sa v databáze nachádzajú zhody, zobrazíte ich používateľovi a tučným písmom zvýrazníte slová, ktoré používateľ hľadal.

    Pridajme k tomu všetkému nejaké CSS:

    Telo (rodina písma: Arial, Helvetica, bezpätkové;) * (okraj: 0; výplň: 0;) #container (okraj: 0 auto; šírka: 600px;) a (farba: # DF3D82; dekorácia textu: žiadny) a: hover (farba: # DF3D82; text-decoration: underline;) ul.update (štýl zoznamu: žiadny; veľkosť písma: 1,1 em; okraj-horný: 10px) ul.update li (výška: 30px; border-bottom: #dedede solid 1px; text-align: left;) ul.update li: first-child (border-top: #dedede solid 1px; height: 30px; text-align: left;) #flash (margin- top: 20px; text-align: left;) #searchresults (text-align: left; margin-top: 20px; display: none; font-family: Arial, Helvetica, sans-serif; font-size: 16px; color: # 000;) .word (hmotnosť písma: tučné; farba: # 000000;) #search_box (odsadenie: 4px; orámovanie: plné 1px # 666666; šírka: 300px; výška: 30px; veľkosť-písma: 18px; -moz- border-radius: 6px; -webkit-border-radius: 6px;) .search_button (border: # 000000 solid 1px; padding: 6px; color: # 000; font-weight: bold; font-size: 16px; -moz- border-radius: 6px; -webkit-border-radius: 6px;) .found (font-weight: bold ; štýl písma: kurzíva; farba: # ff0000; ) h2 (pravý okraj: 70px;)

    Teraz ste sa naučili, ako vytvoriť jednoduchý vyhľadávací formulár, ktorý funguje bez opätovného načítania stránky. Dúfam, že sa vám návod páčil.

    Posledná aktualizácia: 1.11.2015

    Jedným z hlavných spôsobov prenosu údajov na webovú stránku je spracovanie formulárov. Formuláre predstavujú špeciálne prvky značky HTML, ktoré obsahujú rôzne vstupné prvky – textové polia, tlačidlá atď. A pomocou údajov formulára môžeme zadať nejaké údaje a odoslať ich na server. A server už tieto údaje spracováva.

    Vytvorenie formulára pozostáva z nasledujúcich aspektov:

      Vytváranie prvkov

      v značke HTML

      Pridanie jedného alebo viacerých vstupných polí do tohto prvku

      Nastavenie spôsobu prenosu údajov: GET alebo POST

      Nastavenie adresy, na ktorú budú odoslané zadané údaje

    Poďme teda vytvoriť nový tvar. Za týmto účelom si zadefinujeme nový súbor form.php, do ktorého vložíme nasledujúci obsah:

    Zadajte lokalitu

    Prihlásiť sa:

    heslo:

    Atribút action = "login.php" prvku formulára určuje, že údaje formulára budú spracované skriptom login.php ktorý bude so súborom formulár.php v jednom priečinku. A atribút method = "POST" označuje, že metóda POST bude použitá ako metóda prenosu údajov.

    Teraz vytvoríme súbor login.php ktorý bude mať nasledujúci obsah:

    Vaše heslo: $ password ";?>

    Globálna premenná $ _POST sa používa na získanie údajov formulára. Predstavuje asociatívne pole údajov odoslaných pomocou metódy POST. Pomocou kľúčov môžeme získať odoslané hodnoty. Kľúče v tomto poli sú hodnoty atribútov názvov vstupných polí formulára.

    Keďže atribút name vstupného poľa prihlásenia je login ( ), potom v poli $ _POST bude hodnota tohto poľa predstavovať kľúč "login": $ _POST ["login"]

    A keďže existujú situácie, keď vstupné pole nebude nastavené, napríklad keď prejdete priamo do skriptu: http: // localhost: 8080 / login.php... V tomto prípade je vhodné pred spracovaním údajov skontrolovať dostupnosť údajov pomocou funkcie isset (). A ak je premenná nastavená, funkcia isset () vráti hodnotu true.

    Teraz môžeme prejsť na formulár:

    A kliknutím na tlačidlo sa zadané údaje metódou POST odošlú do skriptu login.php:

    Údaje formulára nemusíte odosielať do iného skriptu, údaje formulára môžete spracovať v rovnakom súbore formulára. Ak to chcete urobiť, zmeňte súbor formulár.php nasledujúcim spôsobom:

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

    Zadajte lokalitu

    Prihlásiť sa:

    heslo:

    Bezpečnosť údajov

    Bezpečnosť dát je v PHP veľmi dôležitá. Poďme sa pozrieť na niekoľko jednoduchých mechanizmov, ktoré môžu zlepšiť bezpečnosť našej webovej stránky.

    Najprv si však zoberme formulár z predchádzajúcej témy a skúsme doň zadať nejaké údaje. Napríklad do prihlasovacieho poľa zadajte ""a v poli pre heslo text"

    heslo

    ":

    Po odoslaní údajov do značky html sa vloží kód javascript, ktorý zobrazí okno so správou.

    Ak sa chcete vyhnúť tomuto druhu bezpečnostných problémov, použite funkciu htmlentities ():

    If (isset ($ _ POST ["login")] && isset ($ _ POST ["heslo"])) ($ login = htmlentities ($ _ POST ["login"]); $ password = htmlentities ($ _ POST ["heslo" ]); echo "Vaše prihlásenie: $ login
    Vaše heslo: $ password ";)

    A aj po zadaní kódu html alebo javascript budú všetky značky escapované a dostaneme nasledujúci výstup:

    Ďalšia funkcia, funkcia strip_tags (), vám umožňuje úplne odstrániť html značky:

    If (isset ($ _ POST ["login")] && isset ($ _ POST ["heslo"])) ($ login = strip_tags ($ _ POST ["login"]); $ password = strip_tags ($ _ POST ["heslo" ]); echo "Vaše prihlasovacie meno: $ login
    Vaše heslo: $ password ";)

    Výsledkom jeho práce s rovnakým vstupom bude nasledujúci výstup.