PHP okénko: Setřídění záznamů podle vlastního kritéria

Jakub Vrána 27. 6. 2005

Dnešní PHP okénko ukazuje, jak se dá na stránce zobrazit seznam výrobků, které si návštěvník stránek naposledy prohlížel. Správné využití MySQL funkce řešení dále zjednodušuje a zpřehledňuje.

Řekněme, že chceme uživateli na stránce elektronického obchodu zobrazit posledních pět výrobků, které si prohlížel. Pro uložení takovéto informace se ideálně hodí session proměnná:

<?php
// $id je ID právě prohlíženého záznamu
if (!isset($_SESSION["prohlednute"])) {
    $_SESSION["prohlednute"] = array(); // prvotní inicializace pole
} elseif (($pos = array_search($id, $_SESSION["prohlednute"])) !== false) { // $id už v poli je
    unset($_SESSION["prohlednute"][$pos]); // vyjmeme ho a později vložíme na konec
} else {
    unset($_SESSION["prohlednute"][4]); // zobrazovat pouze posledních 5 prohlédnutých výrobků
}
// na tomto místě bude výpis prohlédnutých záznamů
array_unshift($_SESSION["prohlednute"], $id); // uložíme aktuální zboží pro příští stránku
?> 

Výpis prohlednutých záznamů by byl triviální za předpokladu, že bychom zboží nechtěli řadit podle pořadí, ve kterém bylo prohlédnuto. Pokud ho tak ale řadit chceme, budeme se muset trochu snažit:

<?php
if ($_SESSION["prohlednute"]) {
    $vyrobky = array();
    $result = mysql_query("SELECT * FROM vyrobky WHERE id IN (" . implode(", ", $_SESSION["prohlednute"]) . ")");
    while ($row = mysql_fetch_assoc($result)) {
        $vyrobky[$row["id"]] = $row;
    }
    mysql_free_result($result);
    foreach ($_SESSION["prohlednute"] as $id) {
        // zobrazení záznamu $vyrobky[$id]
    }
}
?> 

Kód je ale neelegantní a náročný na paměť. Problém se dá mnohem elegantněji vyřešit s využitím MySQL funkce FIELD. Tato funkce přijímá seznam parametrů a vrací pořadí prvního z nich mezi ostatními. Např. FIELD(id, 2, 4, 6) tedy vrátí pro id=4 dvojku, protože 4 je mezi dalšími parametry na druhém místě. A to je přesně ta funkce, kterou potřebujeme – výsledek chceme setřídit podle pořadí id v poli  $_SESSION["prohlednute"].

widgety

<?php
if ($_SESSION["prohlednute"]) {
    $prohlednute_list = implode(", ", $_SESSION["prohlednute"]);
    $result = mysql_query("SELECT * FROM vyrobky WHERE id IN ($prohlednute_list) ORDER BY FIELD(id, $prohlednute_list)");
    while ($row = mysql_fetch_assoc($result)) {
        // zobrazení záznamu $row
    }
    mysql_free_result($result);
}
?> 

Třídění podle dynamického výrazu je ještě pomalejší než třídění podle neindexovaného sloupce, takže bychom se mu za normálních okolností měli vyhnout. Na tomto místě si ho ale můžeme dovolit, protože počet vrácených záznamů je pevně omezen.


Podobně laděné texty můžete najít i na autorově weblogu PHP triky.

Ohodnoťte jako ve škole:

Průměrná známka 2,81

Našli jste v článku chybu?
Zasílat nově přidané názory e-mailem
Podnikatel.cz: Nedodáte hlášení k DPH. Pokutu vám prominou

Nedodáte hlášení k DPH. Pokutu vám prominou

Vitalia.cz: Očkování a autismus ve světle vědeckého objevu

Očkování a autismus ve světle vědeckého objevu

120na80.cz: Superpotraviny. Jaké to jsou?

Superpotraviny. Jaké to jsou?

Vitalia.cz: Zkontrolujte si kvalitu vody ve studních

Zkontrolujte si kvalitu vody ve studních

Podnikatel.cz: Podání u DPH ve špatném formátu? Je neúčinné

Podání u DPH ve špatném formátu? Je neúčinné

Lupa.cz: Jaký je Průvodce světem Arduina?

Jaký je Průvodce světem Arduina?

Vitalia.cz: Maurer: Nechci Jamieho Olivera za pět miliónů

Maurer: Nechci Jamieho Olivera za pět miliónů

Podnikatel.cz: Stahujte přehledy pro všechny pojišťovny

Stahujte přehledy pro všechny pojišťovny

Vitalia.cz: Pomóc! Obyčejný knoflík je dohání k šílenství

Pomóc! Obyčejný knoflík je dohání k šílenství

Vitalia.cz: Takhle ne! Nesnažte se urychlit vývoj dítěte

Takhle ne! Nesnažte se urychlit vývoj dítěte

Podnikatel.cz: Upravuje se použití paušálních výdajů

Upravuje se použití paušálních výdajů

Lupa.cz: Počátky internetu v ČR? Sny a sdílené halucinace

Počátky internetu v ČR? Sny a sdílené halucinace

Vitalia.cz: Na přebytek bílkovin nemáme játra ani ledviny

Na přebytek bílkovin nemáme játra ani ledviny

DigiZone.cz: Přechod na DVB-T2 nabírá zpoždění

Přechod na DVB-T2 nabírá zpoždění

Vitalia.cz: Nejvíce vín a dobrot na jednom místě

Nejvíce vín a dobrot na jednom místě

Vitalia.cz: Asijský LI-WU vařil z prošlého masa

Asijský LI-WU vařil z prošlého masa

Vitalia.cz: 7 situací, kdy ženy škodí svým ňadrům

7 situací, kdy ženy škodí svým ňadrům

Podnikatel.cz: Poděs, Slibotechna a další. Ty berte obloukem

Poděs, Slibotechna a další. Ty berte obloukem

Lupa.cz: Stát chce vytěsnit malé firmy z trhu

Stát chce vytěsnit malé firmy z trhu

Podnikatel.cz: Když si reklamou "zabíjíte" zákazníky

Když si reklamou "zabíjíte" zákazníky

Ušetřete