Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Hakurobotti

Sivun loppuun

Teme [23.01.2003 14:29:22]

#

Tämä koodinpätkä etsii tiedostosta hakusanaa vastaavaa tulosta ja näyttää sen käyttäjälle. Pieni selostus tämän toiminnasta: Käyttäjä kirjoittaa hakusanan, joka muunnetaan pieniksi kirjaimiksi. Tämän jälkeen käydään hakusanat sisältävä tiedosto läpi ja poimitaan mukaan vastaavat tulokset. Tämä olisi kyllä parempi toteuttaa MySQL-tietokannalla, mutta kyllä tämäkin käy, vähän työläämpi vain... Sama robotti on käytössä omilla sivuillani osoitteessa: www.teemuikonen.net ja se näyttää toimivan loistavasti. Jos koodissa on mielestääne parantamisen varaa, voisitko ilmoittaa siitä sivuillani olevalla palautelomakkeella??

Formi, johon käyttäjä syöttää hakusanan:

<form action="search.php" method="GET">
Hakusana:<br>
<input type="text" name="query"><br><br>
<input type="submit" value="Hae!">
</form>

Tiedostossa olevat tulokset, joista haetaan, menevät seuraavasti:

hakusana:otsikko:kuvaus:sivun url-osoite

Esimerkiksi:

kopioi:Downloads-osio:Lataa pelit täältä.:kopioi.html

HUOM!!!
KIRJOITA HAKUSANAT TIEDOSTOON PIENILLÄ KIRJAIMILLA, JOTTA HAKUKONE LÖYTÄÄ NE!!!!

Hakuskripti eli toisin sanoen search.php

<?php
$hs = strtolower(trim($_GET['query'])); //otetaan hakusana muuttujaan
if (empty($hs)) { Tyhjä(); die; } //jos tyhjä => Tyhjä()

   if (file_exists("hakusanat.txt") or TiedostoaEiLöydy())
    {

        $banned = file("hakusanat.txt"); /* vaihda tiedostonimi, jos hakusanat sisältävä tiedosto on eriniminen kuin tämä */

        for ($i = 0; $i < count($banned); $i++)
        {
        	$tiedot = explode(":", $banned[$i]); //etsitään
        	if ($tiedot[0] == $hs)
        	{ $tlm++; }
    }

    }

    if ($tlm == 0) { EiTuloksia(); } //ei tuloksia
    unset ($banned);
    unset ($i);
    unset ($tiedot);

    if ($tlm == 1) { $tlm = $tlm." vastaava tulos"; }
    if ($tlm > 1) { $tlm = $tlm." vastaavaa tulosta"; }

    	echo "<html>\n";
        echo "<head>\n";
        echo "<title>Haun tulokset</title>\n";
        echo "</head>\n";
        echo "<h3>Hakusanalla ".chr(34).trim($_GET['query']).chr(34)." löytyi ".$tlm.":</h3><menu>\n\n";

        $banned = file("hakusanat.txt"); //tiedostonimi?

        for ($i = 0; $i < count($banned); $i++)
        {
        	$tiedot = explode(":", $banned[$i]);
        	if ($tiedot[0] == $hs)
        	{
// -------------- tuloksien listaus --------------
        		echo "<li><b><a href=".chr(34).$tiedot[3].chr(34)." title=".chr(34).$tiedot[1].chr(34).">".$tiedot[1]."</a></b><br>\n";
                        echo "<dd>".$tiedot[2]."<br><br>\n\n"; }
        }
        echo "</menu>\n</body>\n";
        echo "</html>";


function Tyhjä() { //Hakusana-kenttä tyhjä
echo "<html>\n";
echo "<head>\n";
echo "<title>Virheellinen hakusana</title>\n";
echo "</head>\n";
echo '<body topmargin="100">'."\n";
echo '<div align="center"><h3>Syöttämäsi hakusana on virheellinen. Kokeile toista hakusanaa.</h3></div>'."\n";
echo "</body>\n";
echo "</html>"; die; }

function TiedostoaEiLöydy() { //Hakutuloksia sisältävää tiedostoa ei löydy
echo "<html>\n";
echo "<head>\n";
echo "<title>Haun suorittamisessa virhe</title>\n";
echo "</head>\n";
echo '<body topmargin="100">'."\n";
echo '<div align="center"><h3>Haun suorittamisessa tapahtui virhe. Voisitteko ilmoittaa asiasta ylläpitäjälle <a href="mailto:email@osoitteesi.org">sähköpostilla?</a></h3></div>'."\n";
echo "</body>\n";
echo "</html>"; die; }
//vaihda yllä olevan linkin kohde oikeaksi

function EiTuloksia() {
echo "<html>\n";
echo "<head>\n";
echo "<title>Virheellinen hakusana</title>\n";
echo "</head>\n";
echo '<body topmargin="100">'."\n";
echo '<div align="center"><h3>Hakusanalla '.chr(34).trim($_GET['query']).chr(34).' ei löytynyt vastaavia tuloksia. Kokeile suorittaa haku uudelleen toisella hakusanalla.</h3></div>'."\n";
echo "</body>\n";
echo "</html>"; die; }
?>

Tämä voi olla aikamoista koodia, mutta näin se on nyt tehty. Sitä voisi kyllä lyhennellä ja parannella, mutta sitä voi itse muokata...

Teme [24.01.2003 19:33:28]

#

Huomasin juuri, että koodin joukossa on myös omilla sivuillani tarpeellisia, jotka eivät kuulu tuohon. Ne kannattaa poistaa sieltä... Esimerkiksi kohta:
&lt;link rel="stylesheet" type="text/css" href="defstyle.css"&gt;

Teme [24.01.2003 19:44:05]

#

Jos käytätte tätä, muistakaa tarkistaa koko skripti läpi rivi riviltä!

snakari [24.01.2003 19:53:22]

#

ei näytä hirveen hyvältä.
en kyllä testannu, mutta..

Teme [24.01.2003 20:42:44]

#

Joo ei ole mikään kauheen hyvä, mutta joidenkin mielestä voi olla parempi kuin ei mitään...? Aion kyl päivittää mun nykyisen hakurobotin MySQL-pohjaiseksi.

progo [25.01.2003 11:04:51]

#

Jahas.. voihan tuota johonkin käyttää..

thefox [25.01.2003 22:14:12]

#

Aikamoista koodia! heh..

djMiksu [13.02.2003 11:34:54]

#

Missä toi hakusana:otsikko:kuvaus:sivun url-osoite pitäis olla?

Teme [25.02.2003 16:58:00]

#

Tiedostossa, jonka nimi sinun pitää vaihtaa tonne skripteihin. Mulla on tällä hetkellä parempi hakukone käytössä, käy katsomassa: www.teemuikonen.net. Jos tarttet ni pistä postii: teemu.ikonen@nic.fi ni teen sulle oman version.

juhotan [22.05.2003 14:29:01]

#

VÄHÄ SIISTI! Se toimii totta tosiaan!

makeuu [09.10.2003 18:42:05]

#

joo, käytössä osoitteessa, http://koti.mbnet.fi/desing .

Todella hyvin toimii, paitsi jos saisi sen laajennetun haun samaan scriptiin niin olisiko nannaa!!

Juzmo [14.08.2004 18:09:10]

#

Kyllähän toi toimii, mut parempikin vois olla... Hyvää työtä silti! ;)

Djörs [25.08.2004 20:24:20]

#

Tää ei ole kommentti vaan kysymys. Toivottavasti joku ehtii vastaamaan :)

Voiko tuohon hakusanat.txt:hen laittaa monta hakusanaa yhdelle riville, joilla voisi hakea? Eli saman tuloksen voisi saada useammalla eri hakusanalla?

Olikohan tämä kysymys nyt järkevästi esitetty...? En oikein ole perillä näistä asioista. Mutta tarkoitin siis, että esimerkiksi jos "Otsikko" olisi "Eläimet", niin hakusanoina voisi olla "kissa" ja "koira" ja "possu", ja kun yksi käyttäjä hakee sanalla "kissa", niin se saisi saman hakutuloksen kuin "possu"-sanalla hakenut...? Eli molemmille hauille tuloksena olisi "Eläimet"?

Daiz [09.11.2004 14:43:21]

#

Ilmeisesti tuohno täytyisi vain tehdä jokaiselle hakusanalle oma rivi, joka olisi muuten sama lukuunottamatta hakusanaa...

temu92 [26.02.2005 21:24:55]

#

toimii

elemo [23.05.2005 14:45:15]

#

siis miten noi hakusanat laitetaan tonne hakusanat.txt tiedostoon?!?! Muuten toimii mutta ei vaan löydä niitä mitä oon sinne kirjottanu!?!?! APUA!??!

elemo [23.05.2005 14:48:43]

#

Nyt toimii!! Aika helvettin siisti skripti silti!! Tosi nätti. Pistän ton kyllä sivuilleni...

Jaksu [09.10.2005 13:07:06]

#

Miten ton sais silleen että se linkki ois jollekkin webbisivulle??? Muuten mahti koodi!!

Jaksu [09.10.2005 14:24:07]

#

Joo eli sainkin muutettuu ton sillain että toi linkittää webbisivulle!!! elikkä silloin search.php:en koodi on tuollainen:

<?php
$hs = strtolower(trim($_GET['query'])); //otetaan hakusana muuttujaan
if (empty($hs)) { Tyhjä(); die; } //jos tyhjä => Tyhjä()

   if (file_exists("hakusanat.txt") or TiedostoaEiLöydy())
    {

        $banned = file("hakusanat.txt"); /* vaihda tiedostonimi, jos hakusanat sisältävä tiedosto on eriniminen kuin tämä */

        for ($i = 0; $i < count($banned); $i++)
        {
            $tiedot = explode("_", $banned[$i]); //etsitään
            if ($tiedot[0] == $hs)
            { $tlm++; }
    }

    }

    if ($tlm == 0) { EiTuloksia(); } //ei tuloksia
    unset ($banned);
    unset ($i);
    unset ($tiedot);

    if ($tlm == 1) { $tlm = $tlm." vastaava tulos"; }
    if ($tlm > 1) { $tlm = $tlm." vastaavaa tulosta"; }

        echo "<html>\n";
        echo "<head>\n";
        echo "<title>Haun tulokset</title>\n";
        echo "</head>\n";
        echo "<h3>Hakusanalla ".chr(34).trim($_GET['query']).chr(34)." löytyi ".$tlm.":</h3><menu>\n\n";

        $banned = file("hakusanat.txt"); //tiedostonimi?

        for ($i = 0; $i < count($banned); $i++)
        {
            $tiedot = explode("_", $banned[$i]);
            if ($tiedot[0] == $hs)
            {
// -------------- tuloksien listaus --------------
                echo "<li><b><a href=".chr(34).$tiedot[3].chr(34)." title=".chr(34).$tiedot[1].chr(34).">".$tiedot[1]."</a></b><br>\n";
                        echo "<dd>".$tiedot[2]."<br><br>\n\n"; }
        }
        echo "</menu>\n</body>\n";
        echo "</html>";


function Tyhjä() { //Hakusana-kenttä tyhjä
echo "<html>\n";
echo "<head>\n";
echo "<title>Virheellinen hakusana</title>\n";
echo "</head>\n";
echo '<body topmargin="100">'."\n";
echo '<div align="center"><h3>Syöttämäsi hakusana on virheellinen. Kokeile toista hakusanaa.</h3></div>'."\n";
echo "</body>\n";
echo "</html>"; die; }

function TiedostoaEiLöydy() { //Hakutuloksia sisältävää tiedostoa ei löydy
echo "<html>\n";
echo "<head>\n";
echo "<title>Haun suorittamisessa virhe</title>\n";
echo "</head>\n";
echo '<body topmargin="100">'."\n";
echo '<div align="center"><h3>Haun suorittamisessa tapahtui virhe. Voisitteko ilmoittaa asiasta ylläpitäjälle <a href="mailto:email@osoitteesi.org">sähköpostilla?</a></h3></div>'."\n";
echo "</body>\n";
echo "</html>"; die; }
//vaihda yllä olevan linkin kohde oikeaksi

function EiTuloksia() {
echo "<html>\n";
echo "<head>\n";
echo "<title>Virheellinen hakusana</title>\n";
echo "</head>\n";
echo '<body topmargin="100">'."\n";
echo '<div align="center"><h3>Hakusanalla '.chr(34).trim($_GET['query']).chr(34).' ei löytynyt vastaavia tuloksia. Kokeile suorittaa haku uudelleen toisella hakusanalla.</h3></div>'."\n";
echo "</body>\n";
echo "</html>"; die; }
?>

Codeprofile [08.12.2006 21:43:15]

#

Mulla se ei mee minnekään, kun klikkaan hakutuloksissa ollutta linkkiä. Tossa hakusanat.txt tiedostossa määritelty URL-menee suoraan sen URL:n perään, missä search.php on.

Teknkik [15.05.2010 21:56:44]

#

ICompare.Comparen selostusta en tehnyt koska olin eritellyt funktion eri if lausekkeiden return arvot kommentteina.(rivit 48-80).

Vinkin aihe itsessään ei ollu CompareTo -metodi, vaan keino käyttää ICompare luokkaa oman kustomoidun järjestelijän tekemisessä.

CompareTo metodia taasen käytetään rivillä 76-77, joista ei ollut mitään infoa palautusarvosta.(Siksi tein infon metodista erikseen)

Compare on itsessään samanlainen kuin CompareTo, mutta vertailu tapahtuu kahden objektin välillä, kun taasen CompareTo:ssa objektin ja instanssin välillä.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta