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"].

<?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é příspěvky e-mailem
Podnikatel.cz: Daň z příjmů: online formulář

Daň z příjmů: online formulář

Podnikatel.cz: Jste pojištěnec VZP? Stahujte u nás přehled

Jste pojištěnec VZP? Stahujte u nás přehled

Měšec.cz: Bič na šmejdy: bezplatná mediace

Bič na šmejdy: bezplatná mediace

Podnikatel.cz: Faktura v lednu s plněním loni. Co s ní v hlášení?

Faktura v lednu s plněním loni. Co s ní v hlášení?

Vitalia.cz: Fuck you, rakovino

Fuck you, rakovino

Měšec.cz: Velký jističový podfuk

Velký jističový podfuk

Podnikatel.cz: Není jim to, tak to vrátí. Víme, jak na ně

Není jim to, tak to vrátí. Víme, jak na ně

Podnikatel.cz: Registr všech účtů. Konec daňovým únikům?

Registr všech účtů. Konec daňovým únikům?

120na80.cz: Domácí homeopatická lékárnička

Domácí homeopatická lékárnička

Lupa.cz: Vlhký sen vnitra se splnil: vznikl státní podnik pro IT

Vlhký sen vnitra se splnil: vznikl státní podnik pro IT

Měšec.cz: Vše o dani z nemovitých věcí

Vše o dani z nemovitých věcí

Root.cz: EU chce zrušit anonymní platby

EU chce zrušit anonymní platby

Lupa.cz: Stream koupil Červeného trpaslíka a další seriály

Stream koupil Červeného trpaslíka a další seriály

Lupa.cz: Miliony mladých lidí utíkají z Facebooku. Kam?

Miliony mladých lidí utíkají z Facebooku. Kam?

Lupa.cz: Tip: tucet užitečných shieldů pro Arduino

Tip: tucet užitečných shieldů pro Arduino

Vitalia.cz: Pro otrlé: 42 obrázků, které budou na cigaretách

Pro otrlé: 42 obrázků, které budou na cigaretách

Lupa.cz: Lepší než Google: proč používat DuckDuckGo?

Lepší než Google: proč používat DuckDuckGo?

Lupa.cz: Foto: Jak se skladuje zboží pro Koloniál.cz

Foto: Jak se skladuje zboží pro Koloniál.cz

Vitalia.cz: Nafotila svůj boj s rakovinou

Nafotila svůj boj s rakovinou

Podnikatel.cz: Nové lejstro k doložení životního pojištění

Nové lejstro k doložení životního pojištění

Ušetřete