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.

Našli jste v článku chybu?
Lupa.cz: Kdy se Estonec přihlásí k české datové schránce?

Kdy se Estonec přihlásí k české datové schránce?

Lupa.cz: Co najdete uvnitř kosmické sondy?

Co najdete uvnitř kosmické sondy?

Vitalia.cz: Skutečně zdravá škola je ve 160 školách zdarma

Skutečně zdravá škola je ve 160 školách zdarma

Lupa.cz: Co vzal čas: internetové kavárny a herny

Co vzal čas: internetové kavárny a herny

120na80.cz: Bylinka pro dobrý sex. Jaká to je?

Bylinka pro dobrý sex. Jaká to je?

Vitalia.cz: Vakcína Cervarix je oficiálně i pro chlapce

Vakcína Cervarix je oficiálně i pro chlapce

DigiZone.cz: Sky Deutschland: dvakrát fotbal ve 4K

Sky Deutschland: dvakrát fotbal ve 4K

Lupa.cz: Elektronika tajemství zbavená. Jak s ní začít?

Elektronika tajemství zbavená. Jak s ní začít?

Lupa.cz: Samořídicí taxíky jsou tu. Začíná s nimi Uber

Samořídicí taxíky jsou tu. Začíná s nimi Uber

Lupa.cz: Měřičům síly hesla se nedá věřit. Víte proč?

Měřičům síly hesla se nedá věřit. Víte proč?

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

Měšec.cz: Co když na dovolené přijdete o kartu?

Co když na dovolené přijdete o kartu?

DigiZone.cz: Skylink přepracoval web

Skylink přepracoval web

Root.cz: Legendární hra Quake slaví 20. narozeniny

Legendární hra Quake slaví 20. narozeniny

DigiZone.cz: Vláda schválila digitální vysílání ČRo

Vláda schválila digitální vysílání ČRo

Vitalia.cz: Syfilis: To není „nemoc z lásky“

Syfilis: To není „nemoc z lásky“

Lupa.cz: Hackujete? Můžete mít problém sehnat práci

Hackujete? Můžete mít problém sehnat práci

Měšec.cz: Platíme NFC mobilem. Konečně to funguje!

Platíme NFC mobilem. Konečně to funguje!

Podnikatel.cz: Novela zákoníku práce. Řeší homeworking

Novela zákoníku práce. Řeší homeworking

Podnikatel.cz: OSA zdraží, ale taky přidá nový poplatek

OSA zdraží, ale taky přidá nový poplatek