Hlavní navigace

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

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.

Tweetni to Odměnte autora  Jak to funguje?

Ř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.

Jakub Vrána

Jakub Vrána

Autor se živí programováním v PHP, podílí se na jeho oficiální dokumentaci, vyučuje ho na MFF UK a vede odborná školení. Poznámky si zapisuje na weblog PHP triky.

Ohodnoťte jako ve škole:
Průměrná známka 2,81
Tweetni to Odměnte autora  Jak to funguje?

Školení: Mobile - web, aplikace nebo responsivní design?

DW - Školení použitelnosti
  • Proč vůbec řešit uživatele mobilních zařízení.
  • Jak přistupovat k návrhu a správě obsahu pro mobilní digitální produkty.
  • Pochopíte, že mobile je příležitost a ne omezení.

Chcete pro svůj byznys využit mobilní web, responsivní web nebo mobilní aplikaci? Pomůžeme vám se správně rozhodnout!

Další informace o školení Mobile - web, aplikace nebo responsivní design?

       

Přehled názorů

Chyba v nadpisu
Kit 27. 6. 2005 07:41
Nový
└ 
Re: Chyba v nadpisu
NewDS 3. 7. 2005 00:24
Nový
článek se mi nelíbí :)
dogmatix 27. 6. 2005 08:32
Nový
└ 
Re: článek se mi nelíbí :)
Jakub Vrána 27. 6. 2005 09:09
Nový
Je nezbytne po vykonani SQL dotazu pouzit mysql_free_result($r esult) ?
Pitrsonek 27. 6. 2005 09:29
Nový
├ 
Re: Je nezbytne po vykonani SQL dotazu pouzit mysql_free_result($r esult) ?
Jan Blaha 27. 6. 2005 09:43
Nový
└ 
Re: Je nezbytne po vykonani SQL dotazu pouzit mysql_free_result($r esult) ?
anonymní uživatel 18. 6. 2008 11:31
Nový
tak to je maso...
jkt 27. 6. 2005 14:02
Nový
└ 
Re: tak to je maso...
Michal Molhanec 27. 6. 2005 15:22
Nový
 
└ 
Re: tak to je maso...
Laco 27. 6. 2005 18:30
Nový
 
 
├ 
Re: tak to je maso...
Michal Molhanec 27. 6. 2005 20:23
Nový
 
 
│
└ 
Re: tak to je maso...
HKMaly 8. 7. 2005 13:08
Nový
 
 
├ 
Re: tak to je maso...
radim 27. 6. 2005 20:27
Nový
 
 
└ 
Re: tak to je maso...
radim 27. 6. 2005 20:29
Nový
mimo mísu
Bronx 27. 6. 2005 22:02
Nový
├ 
Re: mimo mísu
anonymní uživatel 27. 6. 2005 23:46
Nový
│
├ 
Re: mimo mísu
Prasopes 28. 6. 2005 09:51
Nový
│
└ 
Re: mimo mísu
Julda 28. 6. 2005 19:51
Nový
├ 
Re: mimo mísu
anonymní uživatel 27. 6. 2005 23:47
Nový
└ 
Re: hosting u banan.cz bych si nikdy neobědnal!
Vojtěch 6. 7. 2005 10:42
Nový
 
├ 
Re: hosting u banan.cz bych si nikdy neobědnal!
Banán 6. 7. 2005 11:14
Nový
 
│
└ 
Re: hosting u banan.cz bych si nikdy neobědnal!
Job 17. 7. 2005 18:12
Nový
 
├ 
Re: hosting u banan.cz bych si nikdy neobědnal!
Javik 11. 7. 2005 00:33
Nový
 
└ 
Re: hosting u banan.cz bych si nikdy neobědnal!
Aleš 18. 8. 2005 17:38
Nový
 
 
└ 
Re: hosting u banan.cz bych si nikdy neobědnal!
anonymní uživatel 23. 9. 2006 15:23
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem