Navigace

Hlavní menu

 

Submenu

 

Statistika přístupů v PHP – vyhledávací fráze

V dnešním pokračování navážeme na předchozí díl a řekneme si, jak zjistit, které fráze používají návštěvníci ve vyhledávačích jako je Seznam nebo Google.

Hotovou aplikaci si můžete prohlédnout a vyzkoušet. V ukázkové verzi se provádí statistika přístupů stránek www.czechia.cz/help.

Na úvod by se hodilo říci, co je vlastně ta "vyhledávací fráze". Jedná se o text (slovo, věta…), který uživatel zadal v některém vyhledávači. Tento vyhledávač mu našel několik odkazů odpovídajících danému textu, odkazy jsou většinou zobrazeny na stránce, jejíž URL má tvar http://www.vyhledavac.cz/search.php?promenna=vyhledavaci_fraze. Mezi nalezenými odkazy je i odkaz na naši stránku. Uživatel na něj klikne a dostanete se tak na naše stránky, přičemž v hlavičce Referer je uložena výše popsaná stránka určitého vyhledávače. Tuto hlavičku jsme využili již předchozím díle při vytváření statistiky serverů, ze kterých návštěvníci přicházejí. Kromě toho se dá z hlavičky vyčíst i použitá vyhledávací fráze.

Vytvořením statistiky vyhledávacích frází si můžeme ověřit např. zda uživatelé najdou na našich stránkách to, co hledají, zda se nedostávají na naše stránky nějakým omylem atd. Úplné pochopení celé problematiky vyžaduje znalost předchozího článku. Připomenu proto jen nejdůležitější věc: hlavička Referer je uložena v proměnné $referer.

Část zjišťující, zda uživatel přišel z vyhledávače a použil přitom nějakou frázi, umístíme do poslední větve podmínky zjišťující, odkud návštěvník přišel. Úvodní část této větve, kterou znáte z předchozího dílu, provádí obecnou statistiku příchodů z cizích stránek. Hned poté se můžeme pustit do "kuchání" vyhledávací fráze.

// REFERER - odkud přišel návštěvník
$no_referer = "localhost/zadara";    // pokud bude $referer obsahovat tuto hodnotu, jedná se o přechod v rámci serveru
$http_referer = URLDecode(StrToLower($referer));    // rozkóduje URL a převede na malá písmena

if ($http_referer == ""):    // přímé volání
    $referer = 1;

elseif (EregI($no_referer, $http_referer)):    // přechod v rámci serveru
    $referer = 2;

else:    // návštěvník přisel z cizích stránek
    $url = Parse_URL($http_referer); // rozdělí URL na části
    $host = EregI_Replace("^www\.", "", $url["host"]); // odstraní "www."

    // je stránka v databázi ? (pokud ne, přidáme ji)
    $query = MySQL_Query("SELECT id FROM referer WHERE server = '$host'");
    if ($result = MySQL_Fetch_Array($query)):
        $referer = $result["id"];
    else:
        $query = MySQL_Query("INSERT INTO referer VALUES ('', '$host')");
        $referer = MySQL_Insert_ID();
    endif;

Databázová struktura

Celá statistika vyhledávacích frází (přístupů z vyhledávačů) bude úplně oddělena od základní databázové tabulky access a bude tvořena celkem třemi tabulkami, což dobře znázorňuje následující schéma. Nejdůležitější je tabulka searched obsahující datum přístupu z určitého vyhledávače a použitou frázi. Protože vyhledávací fráze i vyhledávače se budou opakovat, bude lepší tyto údaje ukládat do tabulky searched jako cizí klíče z tabulek searchengine a searchtext.

DB schéma - kliknutím zvětšíte

Tabulky vytvoříme pomocí těchto SQL dotazů.

CREATE TABLE searched (
    id int(11) NOT NULL auto_increment,
    search_date datetime,
    server int(11),
    query int(11),
    PRIMARY KEY (id)
);

  • id - unikátní označení každého přístupu s použitím vyhledávací fráze (primární klíč)
  • search_date - datum a čas tohoto přístupu
  • server - použitý vyhledávač
  • query - použitá fráze

CREATE TABLE searchengine (
    id int(11) NOT NULL auto_increment,
    server varchar(50),
    variable varchar(20),
    PRIMARY KEY (id)
);

  • id - unikátní označení každého vyhledávače (primární klíč)
  • server - doménová adresa vyhledávače
  • variable - proměnná, kterou server používá pro vyhledávaní (obsahuje vyhledávací frázi)

CREATE TABLE searchtext (
    id int(11) NOT NULL auto_increment,
    query varchar(150),
    PRIMARY KEY (id)
);

  • id - unikátní označení každé vyhledávací fráze (primární klíč)
  • query - text fráze

Abychom mohli něco zjistit, musíme mít v tabulce searchengine nějaká data, tj. informace o nejvýznamnějších vyhledávačích. Nejdůležitější je položka variable. Možná ještě někomu není úplně jasné, co vlastně obsahuje. Uvedu proto jeden příklad. Máme odkaz http://search.seznam.cz/search.cgi?w=biologie. Vyhledávací fráze "biologie" je obsažena v proměnné "w" a právě tu uložíme do položky variable. Seznam nejdůležitějších českých a zahraničních vyhledávačů přináší tato tabulka (searchengine):

idservervariable
1seznam.czw
2centrum.czq
3atlas.czsearchtext
4google.comq
5webfast.czq
6idnes.czqu
7redbox.czsrch
8quick.czquery
9najdi.todotaz
10uzdroje.czsquery
11zoznam.sks
12altavista.comq
13yahoo.comp

Teorii máme za sebou, nyní přichází na řadu praxe. Z minulého dílu víme, jak z URL zjistit doménovou adresu. Z doménové části odkazu $http_referer (tj. $url["host"]) musíme zjistit doménu druhé a první úrovně, abychom ji mohli porovnat se záznamy v tabulce searchengine a případně pokračovat dál. Pokud byl nějaký záznam nalezen, znamená to, že uživatel přichází z vyhledávače a můžeme se tedy pustit do zjištění použité vyhledávací fráze. Část odkazu za "?" (= dotaz), kterou máme po zpracování odkazu funkcí URL_Parse v poli s indexem query, obsahuje kromě dalších proměnných i námi hledanou proměnnou obsahující vyhledávací frázi.

Po rozdělení na jednotlivé proměnné oddělené znakem "&", zjistíme pomocí jednoduchého cyklu obsah dané proměnné ($result["variable"]), tj vyhledávací frázi. Celou proměnnou nejprve rozdělíme na části oddělené "=". V první části je pak název proměnné, v druhé obsah proměnné (= vyhledávací fráze). Vyhledávací frázi si na závěr uložíme do proměnné $searchtext.

// VYHLEDÁVAČE - jaká fráze byla použitá při vyhledávání
$explode = Explode(".", $url["host"]);    // rozdělí adresu serveru ($url["host"]) na jednotlivé části
$host_domain = $explode[Count($explode)-2] . "." . $explode[Count($explode)-1];    // doména 2. úrovně

// jedná se o vyhledávač ?
$query = MySQL_Query("SELECT * FROM searchengine WHERE server = '$host_domain'");
if($result = MySQL_Fetch_Array($query)):
    // zjistíme použitou frázi - přes proměnnou, kterou vyhledávač používá
    $variables = Explode("&", $url["query"]);
    for($i=0;$i<Count($variables);$i++):
        $explode = Explode('=', $variables[$i]);
        if($explode[0] == $result["variable"]):
            $searchtext = $explode[1];    // fráze použitá při vyhledávání
            break;
        endif;
    endfor;

Někdy se může stát, že uživatel sice přijde např. ze Seznamu, ale nepoužije vyhledávání, nýbrž katalog. Poté se žádná fráze zjistit nedá, a tak musíme uvést následující podmínku. Za ní nejprve pomocí známých postupů uložíme do tabulky searchtext vyhledávací frázi a následně do tabulky searched veškeré informace o daném přístupu z vyhledávače.

    // pokud se podařilo zjistit frázi, zapíšeme vše do databáze
    if($searchtext != ""):
        $server = $result["id"];
        // je fráze v databázi ? (pokud ne, přidáme ji)
        $query = MySQL_Query("SELECT id FROM searchtext WHERE query = '$searchtext'");
        if ($result = MySQL_Fetch_Array($query)):
            $search_id = $result["id"];
        else:
            $query = MySQL_Query("INSERT INTO searchtext VALUES ('', '$searchtext')");
            $search_id = MySQL_Insert_ID();
        endif;
        $query = MySQL_Query("INSERT INTO searched VALUES ('', '$date', '$server', '$search_id')");
    endif;
endif;

Vyhodnocení

Statistiku použitých vyhledávacích frází za dané období vypíšeme do jedné tabulky. Na prvním řádku bude celkový počet přístupů s použitím vyhledávací fráze. Do dalších řádků vložíme počet přístupů z jednotlivých vyhledávačů. Pod každým vyhledávačem pak bude seznam vyhledávacích frází, počet použití dané fráze a její podíl na celkovém počtu.

// VYHLEDÁVACÍ FRÁZE
echo '<p align="center" class="heading">Fráze použité při vyhledávání</p>';
echo '<table width="680" cellspacing="0" align="center">';
echo '<tr><td width="150" class="tableheader">Vyhledávač (fráze)</td><td width="50" class="tableheader">Počet</td><td class="tableheader" width="480">Podíl</td class="tableheader">';

// celkový počet přístupů ze všech vyhledávačů za dané období
$query = MySQL_Query("SELECT count(*) FROM searched WHERE $sql_search_date");
$result = MySQL_Fetch_Array($query);
$count_search = $result["count(*)"];

echo '<tr><td>Celkem</td><td>' . $count_search . '</td><td> </td></tr>';

V prvním SQL dotazu, který zjišťuje zastoupení jednotlivých vyhledávačů, spojíme tabulky searchengine a searched. V druhém SQL dotazu, zjišťujícím fráze použité na jednotlivých vyhledávačích, spojíme tabulky searchtext a searched, přičemž nesmíme zapomenout na podmínku WHERE searched.server = '$id', kde $id je označení právě zpracovávaného serveru, které získáme z prvního dotazu. Myslím, že SQL dotazy žádný další komentář nepotřebují, vztahy mezi tabulkami totiž dobře znázorňuje výše uvedené schéma. Další postup, tj. výpočet šířky obrázku a podílu byl komentován ve třetím díle.

// vybíráme vyhledávače podle jejich zastoupení
$query = MySQL_Query("SELECT searchengine.id AS id, searchengine.server AS server, count(*) AS count_it FROM searchengine, searched WHERE searchengine.id = searched.server AND $sql_search_date GROUP BY searchengine.id ORDER BY count_it DESC");
$max = MySQL_Result($query, 0, "count_it");    // počet přístupů z nejvíce zastoupeného vyhledávače
$move = MySQL_Data_Seek($query, 0);     // přesuneme se znovu na začátek

while($result = MySQL_Fetch_Array($query)):
    $width = Round($result["count_it"]/$max*400);    // šířka obrázku znázorňujícího podíl
    $rate = BCDiv($result["count_it"], ($count_search/100), 2);    // podíl v procentech
    echo '<tr><td class="tableheader">' . $result["server"] . '</td><td class="tableheader">' . $result["count_it"] . '</td><td class="tableheader"><img src="1.gif" width="' . $width . '" height="8" border="0" alt=""> ' . $rate . ' %</td></tr>';
    
    // vybíráme vyhledávací fráze u daného vyhledávače (podle počtu)
    $id = $result["id"];    // id vyhledávače
    $query2 = MySQL_Query("SELECT searchtext.query AS query, count(*) AS count_it FROM searchtext, searched WHERE searched.server = '$id' AND searched.query = searchtext.id AND $sql_search_date GROUP BY searchtext.id ORDER BY count_it DESC");    
    while($result = MySQL_Fetch_Array($query2)):
        $rate = BCDiv($result["count_it"], ($count_search/100), 2);    // podíl v procentech
        $width = Round($result["count_it"]/$max*400);    // šířka obrázku znázorňujícího podíl
        echo '<tr><td>' . $result["query"] . '</td><td>' . $result["count_it"] . '</td><td><img src="1.gif" width="' . $width . '" height="8" border="0" alt=""> ' . $rate . ' %</td></tr>';
    endwhile;
endwhile;

echo '</table><br>';

Příště začneme pracovat s doménovou adresou počítače, ze kterého přišel požadavek, přičemž se zaměříme na statistiku domén nejvyšší úrovně.

Předchozí díly:
Statistika přístupů v PHP – odkud přicházejí návštěvníci
Statistika přístupů v PHP – rozlišení a barevná hloubka
Statistika přístupů v PHP – detekce operačního systému
Statistika přístupů v PHP – detekce prohlížeče
Statistika přístupů v PHP – počet unikátních návštěvníků

Kebrt, Michal (8. 7. 2002)
Diskuze: Statistika přístupů v PHP – vyhledávací fráze
2002-07-08 00:24:55Marek Prokoprozlišení katalogů a vyhledavačů
2002-07-08 18:51:45Michal Kebrtrozlišení katalogů a vyhledavačů
2002-07-08 19:22:45Marek Prokoprozlišení katalogů a vyhledavačů
2002-07-12 18:57:53Michal Kebrtrozlišení katalogů a vyhledavačů