Toto není hotové řešení, protože nejde udělat něco univerzálního, co by pasovalo i na vaši databázi. Jestli ale chcete ne-fulltextové vyhledávání, tady máte inspiraci ve vyhledávání, které je na tomto webu (LIKE).

Na fulltextovém vyhledávání není nic složitého, zvlášť např. v mySQL a určitě na toto téma naleznete na internetu spoustu článků. Může se však stát, že fulltext nechcete nebo nemůžete použít, například kvůli nekompatibilnímu datovému typu nebo staré verzi databáze. Zde máte řešení s LIKE.

$pripojeninaDB = mysql_connect ("$server","$user","$password") 
or
die ("Nepovedlo se připojit na databázový server"); mysql_select_db("$databaze") or die ("Nepovedlo se otevřít databázi");

Provedeme dotaz na databázi s užitím LIKE, vše demonstruji na vyhledávání na tomto webu, takže ponechávám i proměnné, fráze obsahuje hledaný výraz zaslaný uživatelem. Asi jste si všimli, že prohledávám pouze sloupec nadpis, to proto abych mohl poskytnout relevantnější a méně relevantní články. Potom v cyklu uložím vyhledané ID do pole nejlepsi.

$dotaz = "SELECT id FROM clanky WHERE nadpis
LIKE '%
$_POST[fraze]%'
order by id desc"
; $query = mysql_query($dotaz) or die("SQL dotaz nešlo provést"); while ($row=mysql_fetch_array($query)) { $nejlepsi[] = "$row[id]"; }

To samé jsem udělal i se sloupci perex a článek. Výsledky v perexu jsem uložil do pole stredni a z článku do nejhorsi.

$dotaz = "SELECT id FROM clanky WHERE perex LIKE '%$_POST[fraze]%' 
order by id desc"
; $query = mysql_query($dotaz) or die("SQL dotaz nešlo provést"); while ($row=mysql_fetch_array($query)) { $stredni[] = "$row[id]"; } $dotaz = "SELECT id FROM clanky WHERE clanek LIKE '%$_POST[fraze]%'
order by id desc"
; $query = mysql_query($dotaz) or die("SQL dotaz nešlo provést"); while ($row=mysql_fetch_array($query)) { $nejhorsi[] = "$row[id]"; }

Teď bychom ale z velkou pravděpodobností měli ve výsledku duplicitní výsledky, protože výraz nalezený v nadpisu bejvá téměř vždy i v samotném článku apod. Musíme se tedy těchto záznamů zbavit.

Do proměnné prvku_nejlepsi tedy pomocí funkce count načteme počet záznamů v poli, protože je to nutná informace pro procházení pole v cyklu a poté tedy pole cyklicky projdeme, přičemž v každé iteraci (zkrátka každý záznam v poli) načteme do jiného pole nejlepsi_checked, nebudeme aplikovat žádné vyřazování, protože z nadpisu by měli být výsledky nejbližší věci, kterou hledáme. Asi si říkáte, že tato operace je zbytečná a taky máte pravdu, dělal jsem to pro pořádek, abych se v polích nezamotal.

$prvku_nejlepsi = count($nejlepsi);
for($cislo = 0; $cislo < $prvku_nejlepsi; ++$cislo)
{
$nejlepsi_checked[] = "$nejlepsi[$cislo]";
}



U dalších polí ale už budou duplicitní záznamy a ty nechceme. Opět si načteme počet záznamů v poli a cyklicky ho projdeme. Každý záznam ale před zapsáním do nového pole stredni_checked proženeme podmínkou, která otestuje, zda již tento záznam neexistuje v poli nejlepsi_checked. Fce in_array (přidána v PHP 4) má jako první parametr hodnotu kterou testujeme a jako druhý pole. Funkce zjistí existenci hodnoty v poli a v případě pravdy vrací true-jedničku. Proto také musíme použít negace (!) před funkcí a navíc je ještě třeba připsat @, aby funkce nevypisovala chybové hlášení. V případě, že by hledaný výraz nebyl nalezen -> pole by bylo prázdné by totiž chybu vypisovala a ta samozřejmě uživatele nezajímá.

$prvku_stredni = count($stredni);
for($cislo = 0; $cislo < $prvku_stredni; ++$cislo)
{
if (@!in_array($stredni[$cislo],$nejlepsi_checked))
$stredni_checked[] = "$stredni[$cislo]";
}


$prvku_nejhorsi = count($nejhorsi);
for($cislo = 0; $cislo < $prvku_nejhorsi; ++$cislo)
{
if (@!(in_array($nejhorsi[$cislo],$nejlepsi_checked) 
or in_array($nejhorsi[$cislo],$stredni_checked)))
$nejhorsi_checked[] = "$nejhorsi[$cislo]";
}



Teď už jenom provedeme poslední dotaz. Tady jsem se zaseknul a musel jsem se zeptat na fóru, jak použít celé pole v dotazu. Neúspěšně jsem zkoušel nějaké bastleniny, ale nakonec mně zachránila funkce implode. Tato funkce spojí obsah pole do jediného řetězce a jednotlivé položky oddělí oddělovačem, který funkci zadáme jako první parametr.

A nakonec se jako slušný programátor odpojíme od databáze :-).

if(isset($nejlepsi_checked[0]))
{
$dotaz = "SELECT * FROM clanky WHERE id in 
(".implode(",",$nejlepsi_checked).") LIMIT 10";
$query = mysql_query($dotaz) 
or die("SQL dotaz nešlo provést");
}


if(isset($stredni_checked[0]))
{
$dotaz = "SELECT * FROM clanky WHERE id in 
(".implode(",",$stredni_checked).") LIMIT 10";
$query = mysql_query($dotaz) 
or die("SQL dotaz nešlo provést");
}


if(isset($nejhorsi_checked[0]))
{
$dotaz = "SELECT * FROM clanky WHERE id in 
(".implode(",",$nejhorsi_checked).") LIMIT 10";
$query = mysql_query($dotaz) 
or die("SQL dotaz nešlo provést");
}

mysql_close ($pripojeninaDB);



2 komentáře

Neváhejte napsat k článku komentář

Nevyplňujte:

  1. 1
    chlast

    chlast<zavináč>centrumtečkacz

    zdravím, mohl by si mi poskytnout ty zdrojové kódy? díky

  2. 2
    Antonín Daněk

    danek<zavináč>antonindanektečkacz

    Zdrojové kódy byly doplněny.