Archive for » Duben, 2009 «

Sobota, Duben 18th, 2009 | Author: Dundy

Na tento problém dříve nebo později narazí každý programátor webu, kde se něco hodnotí a podle hodnocení něco řadí. Jako příklad uvedu e-shop, kde uživatelé hodnotí produkty a jiní si je mohou podle hodnocení řadit. Předpokládejme, že každému produktu můžete udělit podle kvality jednu až pět hvězdiček.

Zmiňovaný problém však nastává, když se zamyslíme nad tím, zda-li chceme při seřazení jako první z produktů zařadit ten, který má z jednoho jediného hlasu pět hvězdiček, nebo ten, který má z padesáti hlasů průměr 4,8. Z hlediska důvěryhodnosti je rozumné zvýhodnit druhou možnost.

Jako první je třeba zjistit koeficient důvěryhodnosti hlasování. Pro vyjádření tohoto jsem zvolil logaritmickou funkci o základu, který je roven počtu očekávaných hlasujících.

1
2
3
4
5
6
7
$zaklad = 20; //počet očekávaných hlasujících
//zjištění počtu hlasujících
$dotaz = "SELECT COUNT(*) AS pocet FROM hlasovani WHERE id_produkt=$id_produkt;";
$hlasujici = mysql_fetch_array(mysql_query($dotaz));
$pocet = $hlasujici['pocet'];
 
$duveryhodnost = log($pocet, $zaklad);

Problém samozřejmě nastává, když odhlasoval pouze jeden člověk, protože poté je logaritmus roven nule a důvěryhodnost výsledku by tedy byla rovna nule. Tomuto problému je třeba se vyhnout, protože je nežádoucí a proto budeme jednoho hlasujícího člověka vydávat za 1,5 člověka.

1
2
3
if ($pocet == 1) {
  $duveryhodnost = log(1.5, $zaklad);
}

Důvěryhodnost není procentuální vyjádření, protože při počtu hlasujících větším než je základ hodnota přesáhne 1. Dále je třeba vypočítat průměrnou známku při hlasování.

1
2
3
4
5
6
7
8
9
10
if ($pocet!=0) {
  $dotaz2 = "SELECT SUM(hodnota) AS soucet FROM hlasovani WHERE id_produkt=$id_produkt;";
  $celkem = mysql_fetch_array(mysql_query($dotaz2));
  $soucet = $celkem['soucet'];
 
  $prumer = $soucet/$pocet;
}
 else {
  $prumer = 0;
 }

Obě hodnoty nakonec vynásobíme mezi sebou, abychom získali jakousi „oblíbenost produktu“.

1
2
3
4
5
6
7
8
if ($pocet != 0) {
  $oblibenost = $duveryhodnost * $prumer;
}
 else {
  $oblibenost = 0;
 }
 
echo "Oblíbenost produktu: ".$oblibenost." (průměrná známka ".$prumer." z celkem ".$pocet." hlasů)";

Uvítám vaše připomínky k tématu.

Category: programování |  Tags: , | Leave a Comment
Neděle, Duben 12th, 2009 | Author: Dundy

Nedávno jsem řešil problém, kdy jsem potřeboval zjistit příští auto_increment v MySQL tabulce. Nedalo se použít poslední id+1 a tak jsem trochu zagooglil a vyhledal, jak na to. Vzhledem k tomu, že se toto může hodit i někomu z vás, rozhodl jsem se tady zmíněný postup zveřejnit.
Základ všeho je v dotazu SHOW TABLE STATUS, jehož výsledkem je jeden řádek s různými sloupečky informujícími o stavu tabulky.

1
2
3
4
5
  $dotaz = "SHOW TABLE STATUS LIKE 'tabulka';
  $vysledek = mysql_query($dotaz);
  $radek = mysql_fetch_array($vysledek);
 
  echo "Příští hodnota auto_increment je: ".$radek['Auto_increment'];

Dotaz SHOW TABLE STATUS přináší i různé další informace o tabulce, je to de facto takové rychlé shrnutí včetně enginu tabulky, počtu řádek, ale i znakové sady tabulky nebo data a času vytvoření.

Category: programování |  Tags: , | Leave a Comment