Autor | Zpráva | ||
---|---|---|---|
Manny Profil * |
#1 · Zasláno: 30. 12. 2009, 20:46:56
Ahojte, dlouho jsem se na nic neptal, takže:-)
Pomocí tohoto kódu: $prumernehodnoceni = $celkovehodnoceni/$pocethodnoceni; $prumer = Round($prumernehodnoceni,2); počítám průměrnou známku na 2 desetiná čísla, kterou bych rád uložil do databáze. A v tom je problém. Ačkoli jsem sloupec v databázi zkoušel nastavit na typ float, double nebo decimal, zapisuje se mi to vždy jen ve tvaru 0.20, 0.30. Nikdy ne třeba 2.35 apod. Kde je problém? |
||
Alphard Profil |
#2 · Zasláno: 30. 12. 2009, 20:59:27
Trocha teorie je na MySQL (7) - hrátky s čísly - Linux Software
Zkuste třeba float(5,2), nevím ale, jaká je maximální známka. Já bych ale asi zaokrouhloval a asi i počítal až při výpisu. Máte to promyšlené? Při každém novém hlasování přičítejte známku, inkrementujte počet hodnocení a při výpisu vypočítejte průměr. |
||
Manny Profil * |
#3 · Zasláno: 30. 12. 2009, 21:04:38
Alphard:
Ano, přesně tak to dělám. Při každém hlasování přičítám známku a zvyšuji o jednu počet hodnocení. I průměr jsem chtěl počítat až při výpisu, ale to mi nějak nejde. Tak jsem v databázi vytvořil další sloupec, do kterého bych rovnou zapisoval průměr (i ohledem pro pozdější snažší výpis nejlepších hodnocení). |
||
Alphard Profil |
#4 · Zasláno: 30. 12. 2009, 21:13:36
Manny:
„I průměr jsem chtěl počítat až při výpisu, ale to mi nějak nejde.“ select if(pocet>0, round(celkem/pocet, 2), null) prumer from tabulka |
||
Manny Profil * |
#5 · Zasláno: 30. 12. 2009, 21:25:22
Alphard:
Jenže já tímhle vypisuji v podstatě celý řádek while ($zaznam=MySQL_Fetch_Array($vysledek)) echo '<div class="polozky"><a href="komiksy/'.$zaznam["poradi"].'/komiks.php" target="_blank" ><img src="komiksy/'.$zaznam["poradi"].'/thumb.jpg"></a>'.'<h3>'.$zaznam["nazev"].'</h3><h4>'.$zaznam["popis"].'</h4><h5>Autor: '.$zaznam["autor"].' | Překlad: '.$zaznam["preklad"].' | Vloženo: '.$zaznam["vlozeno"].' | Známka: '.$zaznam["znamka"].'</h5></div>'; ?> |
||
Manny Profil * |
#6 · Zasláno: 30. 12. 2009, 21:27:14
A ještě jsem chtěl dodat, že před tímto cyklem jsem zkoušel nastavit ten průměr a to mi právě nešlo.
|
||
Alphard Profil |
#7 · Zasláno: 30. 12. 2009, 21:29:18
[#5]
To by nemělo vadit, průměr bude prostě další sloupec, tj. $zaznam['prumer'] |
||
Manny Profil * |
#8 · Zasláno: 30. 12. 2009, 21:39:08
Alphard:
Proto jsem chtěl ten průměr dostat už do databáze a pak ho jen vypsat tímhle polem. |
||
Alphard Profil |
#9 · Zasláno: 30. 12. 2009, 21:43:35
Manny:
„Proto jsem chtěl ten průměr dostat už do databáze a pak ho jen vypsat tímhle polem.“ Vy mě pořád nechápete. Nemusí existoval sloupec průměr, lze ho simulovat tím výpočtem. Ale rozhodně vám nechci vnucovat své řešení, jenom jste neposkytl potřebné informace pro řešení vašeho problému, co jsem k tomu mohl napsat, jsem napsal už v [#2]. |
||
Manny Profil * |
#10 · Zasláno: 30. 12. 2009, 22:00:46
Alphard:
Aha, tak to se omlouvám. Už mi to nějak nemyslí:-) Ten float jsem zkusil s parametry 3,2, protože známka bude od 1 do 5 na 2 desetinná čísla, ale nefunguje to. Pořád to ukládá jen 0.30 a tak. Pro dnešek toho asi nechám. Zatím díky. |
||
Manny Profil * |
#11 · Zasláno: 31. 12. 2009, 10:53:15
Ze zoufalství začátečníka sem dávám celý script, kterým stránkuju a vypisuju databázi a prosím Alpharda nebo někoho jiného, jak tam přidat [#4], tak aby mi to na konci vypisovalo průměr na 1 desetinné číslo ze sloupců pojmenovaných v db celkovaznamka a počethlasovani.
<?php define ("ROWS", 12); $id_spojeni=mysql_connect('localhost','root',''); if (!$id_spojeni) die ('Nezdařilo se spojení!'); $vysledek=mysql_select_db('inverso',$id_spojeni); if (!$vysledek) die ('Připojení se nepovedlo!'); mysql_query("SET NAMES 'utf8'"); if (!isset($_GET["celkem"])) //pokud nevíme, kolik bude záznamů tak to zjistíme... { $vysledek=mysql_query("select count(*) as pocet from komiksy"); $zaznam=mysql_fetch_array($vysledek); $celkem=$zaznam["pocet"]; } else { $celkem=$_GET["celkem"]; } ?> <div class="stranky"> <?php if ($celkem>ROWS) { if (!isset($_GET["od"])) $od=1; else $od=$_GET["od"]; $vysledek=mysql_query("select * from komiksy ORDER BY poradi DESC"." limit ".($od-1).", ".ROWS); echo "Zobrazené komiksy: ".$od."-"; echo (($od+ROWS-1)<=$celkem)?($od+ROWS-1):$celkem; echo " z celkem $celkem "; //začátek - vytvoř odkaz pouze pokud nejsme na začátku if ($od==1) echo " Začátek | "; else echo " <a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&od=1&str=".$str."\">Začátek</a> | "; //zpět - vytvoř odkaz pouze pokud nejsme v prvních ROWS if ($od<ROWS) echo "Předchozí | "; else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&od=".($od-ROWS)."&str=".$str."\">Předchozí</a> | "; //další - vytvoř, pouze pokud nejsme v posledních ROWS if ($od+ROWS>$celkem) echo "Další | "; else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&od=".($od+ROWS)."&str=".$str."\">Další</a> | "; //poslední - to je posledních (zbytek po dělení ROWS) záznamů if ($od>$celkem-ROWS) echo "Konec <BR>"; else echo "<a href=\"".$_SERVER["PHP_SELF"]."?celkem=$celkem&od=".($celkem-$celkem%ROWS+1)."&str=".$str."\">Konec</a><BR>"; } ?> </div> <?php while ($zaznam=MySQL_Fetch_Array($vysledek)) echo '<div class="polozky"><a href="komiksy/'.$zaznam["poradi"].'/komiks.php" target="_blank" ><img src="komiksy/'.$zaznam["poradi"].'/thumb.jpg"></a>'.'<h3>'.$zaznam["nazev"].'</h3><h4>'.$zaznam["popis"].'</h4><h5>Autor: '.$zaznam["autor"].' | Překlad: '.$zaznam["preklad"].' | Vloženo: '.$zaznam["vlozeno"].' | Známka: '.$zaznam["znamka"].'</h5></div>'; ?> |
||
AM_ Profil |
#12 · Zasláno: 31. 12. 2009, 13:13:56
$vysledek=mysql_query("SELECT poradi, nazev, popis, autor, preklad, vlozeno, if(pocet>0, round(celkem/pocet, 2), null) AS znamka FROM komiksy ORDER BY poradi DESC"." limit ".($od-1).", ".ROWS); ještě poznamenám, že sloupec známka (to je ten průměr?) nemusí existovat (dokonce ani nemá žádný smysl, aby existoval). Ukládat jej do databáze není dobrý postup, jedno dělení není operace, jejíž výsledek by stálo za to cachovat, proto je to plýtvání velikostí DB. |
||
Alphard Profil |
#13 · Zasláno: 31. 12. 2009, 13:20:02
$vysledek=mysql_query("select *, if(pocethlasovani>0, round(celkovaznamka/pocethlasovani, 1), 'nehodnoceno') znamka from komiksy ORDER BY poradi DESC"." limit ".($od-1).", ".ROWS); Teď vidím, že AM byl rychlejší. Tak ještě druhá verze, kde zachovávám *, ale lepší je sloupce vyjmenovat. AM: Manny chce nakonec jedno desetinné číslo. |
||
Manny Profil * |
#14 · Zasláno: 31. 12. 2009, 13:47:19
Alphard, AM:
Děkuju vám oběma, pánové. Hned to jdu vyzkoušet. Nenapadlo mě, že tu konstrukci můžu celou napsat do dotazu do db. Začal jsem s php a mysql nedávno a tohle je první pokus něco udělat. Nakonec jsem si taky uvědomil, že mi stačí jen jedno desetinné místo (hodnocení po půlkách). Přeju bouřlivého silvestra a do nového roku spoustu trpělivosti s takovými, jako já:-) |
||
Manny Profil * |
#15 · Zasláno: 31. 12. 2009, 18:06:53
Tenhle script mě stojí víc sil než jsem myslel.
Chtěl jsem ještě pole $zaznam["známka"] převést na obyčejnou proměnnou $známka a pak podle hodnot udělat podmínky a vypisovat grafické hodnocení. Ale ať ten převod proměnné strčím do cyklu nebo ven, nejede to. Je tohle v pořádku a kam s tím? $znamka = $zaznam["znamka"]; if ($znamka <= 1 ){$hodnoceni= "./img/45star.gif";} if ($znamka <= 0.5){$hodnoceni = "./img/5star.gif";} atd. |
||
Časová prodleva: 14 let
|
0