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:
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.
session_start(); ?>
Aby sme to dosiahli, spustíme ho na samom začiatku stránky.
Pre výstup použijeme funkciu print_r ().
print_r($_SESSION["id"]); ?>
Aby sa po opätovnom načítaní stránky výsledok nezobrazil druhýkrát pomocou odstaviť zabijeme reláciu.
unset($_SESSION["id"]); ?>
Vytvorme handler search.php... Najprv spustíme reláciu a pripojíme sa k databáze:
session_start(); $params = array ("host" =>"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“:
$str = $_POST["string"]; $mass = explode(" ", $str); $count = count($mass); $sql = "SELECT id, content FROM news WHERE content LIKE "%".$mass."%""; $result = $db->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.
for ($i=1; $i<=$count-1; $i++) { for ($j=1; $j<=$id_count; $j++) { $sql = "SELECT id, content FROM news WHERE id=".$id_mass[$j]." AND content LIKE "%".$mass[$i]."%""; $result = $db->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:
$l=1; for($i=1; $i<$id_count+1; $i++) { if ($id_mass[$i] == -1) continue; else { $_SESSION["id"][$l] = $id_mass[$i]; $l++; } } header("Location: /index.php"); ?>
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:
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:
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:
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 ().