štatistika aktivita hodnotitelov – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

štatistika aktivita hodnotitelov – PHP – Fórum – Programujte.comštatistika aktivita hodnotitelov – PHP – Fórum – Programujte.com

 

pepko1430
Newbie
23. 7. 2019   #1
-
0
-

Ahojte

Chcel by som Váš požiadať o názor na tento kód.

Vytvoril som stránku, kde sa bodujú výrobky... na stránke, kde sa zobrazujú štatistické hodnoty je tabuľka, kde je zobrazená aktivita hodnotiteľov za posledných 12 mesiacov. Teda koľkokrát hodnotili za daný mesiac. Funguje to, ale ten kód sa mi nezdá byť ani trochu dobrý. Príde mi veľmi dlhý a neohrabaný. Vedeli by ste mi povedať, naviesť ma, ako ho zmenšiť? Poprípade zacykliť? 

Výsledok vyzerá takto:

Připojen obrázek.

No a toto je ten kód:



<!-- 
	----------------------------------------------------------------------------
	Aktivita hodnotiteľov za posledných 12 mesiacov
	----------------------------------------------------------------------------
-->

<h2 class="popis_tabuliek">Aktivita enológov (počet bodovaní) za posledných 12 mesiacov</h2>

<table class="statistika_aktivita">


<?php

function mesiac($datum) {
if     ($datum == '01') {echo 'jan';}
elseif ($datum == '02') {echo 'feb';}
elseif ($datum == '03') {echo 'mar';}
elseif ($datum == '04') {echo 'apr';}
elseif ($datum == '05') {echo 'máj';}
elseif ($datum == '06') {echo 'jún';}
elseif ($datum == '07') {echo 'júl';}
elseif ($datum == '08') {echo 'aug';}
elseif ($datum == '09') {echo 'sep';}
elseif ($datum == '10') {echo 'okt';}
elseif ($datum == '11') {echo 'nov';}
elseif ($datum == '12') {echo 'dec';}	
elseif ($datum == '0') {echo 'dec';}
elseif ($datum == '-1') {echo 'jan';}
elseif ($datum == '-2') {echo 'feb';}
elseif ($datum == '-3') {echo 'mar';}
elseif ($datum == '-4') {echo 'apr';}
elseif ($datum == '-5') {echo 'máj';}
elseif ($datum == '-6') {echo 'jún';}
elseif ($datum == '-7') {echo 'júl';}
elseif ($datum == '-8') {echo 'aug';}
elseif ($datum == '-9') {echo 'sep';}
elseif ($datum == '-10') {echo 'okt';}
elseif ($datum == '-11') {echo 'nov';}												
}
?>

<tr>	
	<th>Meno</th>
	<th><?php mesiac(date("m")); ?></th>
	<th><?php mesiac(date("m")-1); ?></th>
	<th><?php mesiac(date("m")-2); ?></th>
	<th><?php mesiac(date("m")-3); ?></th>
	<th><?php mesiac(date("m")-4); ?></th>
	<th><?php mesiac(date("m")-5); ?></th>
	<th><?php mesiac(date("m")-6); ?></th>
	<th><?php mesiac(date("m")-7); ?></th>
	<th><?php mesiac(date("m")-8); ?></th>
	<th><?php mesiac(date("m")-9); ?></th>
	<th><?php mesiac(date("m")-10); ?></th>
	<th><?php mesiac(date("m")-11); ?></th>
	<th>Priemer</th>
</tr>


<?php  


	$db = DB();
	$dvanastmesiace = $db->query("
SELECT user_id, name, 
IFNULL(tento.pocet,0) as tento, 
IFNULL(minusjeden.pocet,0) as minusjeden,
IFNULL(minusdva.pocet,0) as minusdva,
IFNULL(minustri.pocet,0) as minustri,
IFNULL(minusstyri.pocet,0) as minusstyri,
IFNULL(minuspat.pocet,0) as minuspat,
IFNULL(minussest.pocet,0) as minussest,
IFNULL(minussedem.pocet,0) as minussedem,
IFNULL(minusosem.pocet,0) as minusosem,
IFNULL(minusdevat.pocet,0) as minusdevat,
IFNULL(minusdesat.pocet,0) as minusdesat,
IFNULL(minusjedenast.pocet,0) as minusjedenast,
IFNULL(minusdvanast.pocet,0) as minusdvanast,

(
IFNULL(tento.pocet,0) + 
IFNULL(minusjeden.pocet,0) +
IFNULL(minusdva.pocet,0) +
IFNULL(minustri.pocet,0) +
IFNULL(minusstyri.pocet,0) +
IFNULL(minuspat.pocet,0) +
IFNULL(minussest.pocet,0) +
IFNULL(minussedem.pocet,0) +
IFNULL(minusosem.pocet,0) +
IFNULL(minusdevat.pocet,0) +
IFNULL(minusdesat.pocet,0) +
IFNULL(minusjedenast.pocet,0) +
IFNULL(minusdvanast.pocet,0)/13
) as priemer 
FROM users


LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())
GROUP BY id_uzivatela ) tento on tento.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-1
GROUP BY id_uzivatela ) minusjeden on minusjeden.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-2
GROUP BY id_uzivatela ) minusdva on minusdva.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-3
GROUP BY id_uzivatela ) minustri on minustri.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-4
GROUP BY id_uzivatela ) minusstyri on minusstyri.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-5
GROUP BY id_uzivatela ) minuspat on minuspat.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-6
GROUP BY id_uzivatela ) minussest on minussest.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-7
GROUP BY id_uzivatela ) minussedem on minussedem.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-8
GROUP BY id_uzivatela ) minusosem on minusosem.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-9
GROUP BY id_uzivatela ) minusdevat on minusdevat.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-10
GROUP BY id_uzivatela ) minusdesat on minusdesat.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-11
GROUP BY id_uzivatela ) minusjedenast on minusjedenast.id_uzivatela = user_id

LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie 
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-12
GROUP BY id_uzivatela ) minusdvanast on minusdvanast.id_uzivatela = user_id

WHERE
(
IFNULL(tento.pocet,0) + 
IFNULL(minusjeden.pocet,0) +
IFNULL(minusdva.pocet,0) +
IFNULL(minustri.pocet,0) +
IFNULL(minusstyri.pocet,0) +
IFNULL(minuspat.pocet,0) +
IFNULL(minussest.pocet,0) +
IFNULL(minussedem.pocet,0) +
IFNULL(minusosem.pocet,0) +
IFNULL(minusdevat.pocet,0) +
IFNULL(minusdesat.pocet,0) +
IFNULL(minusjedenast.pocet,0) +
IFNULL(minusdvanast.pocet,0)
) != 0


");

foreach ($dvanastmesiace as $mesiace) {
		echo '<tr>
				  
				  <td>'.$mesiace[1].'</td>'.
				 '<td>'.$mesiace[2].'</td>'.
				 '<td>'.$mesiace[3].'</td>'.
				 '<td>'.$mesiace[4].'</td>'.
				 '<td>'.$mesiace[5].'</td>'.
				 '<td>'.$mesiace[6].'</td>'.
				 '<td>'.$mesiace[7].'</td>'.
				 '<td>'.$mesiace[8].'</td>'.
				 '<td>'.$mesiace[9].'</td>'.
				 '<td>'.$mesiace[10].'</td>'.
				 '<td>'.$mesiace[11].'</td>'.
				 '<td>'.$mesiace[12].'</td>'.
				 '<td>'.$mesiace[13].'</td>'.
				 '<td>'.$mesiace[13].'</td>
			 </tr>';
		
		
	}
	
	?>

	
</table>
Nahlásit jako SPAM
IP: 213.151.235.–
MilanL+1
Grafoman
25. 7. 2019   #2
-
+1
-
Zajímavé

vidím tam jeden problémek, až to bude déle než rok, budou se ti sčítat měsíce více let. začátek máš v únoru, za rok v únoru ti to do měsíce únor započte jak letošní tak i aktuální únor.

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
25. 7. 2019   #3
-
+1
-
Zajímavé

narazil jsem na další věc máš tam blbě tu tabulku měsíců

..Feb-Jan-Dec-Jan-Feb..

ta funkce by šla zjednodušit 

function mesiac($datum) {
$datum=($datum + 12) % 12
if     ($datum == 1) {echo 'jan';}
elseif ($datum == 2) {echo 'feb';}
elseif ($datum == 3) {echo 'mar';}
elseif ($datum == 4) {echo 'apr';}
elseif ($datum == 5) {echo 'máj';}
elseif ($datum == 6) {echo 'jún';}
elseif ($datum == 7) {echo 'júl';}
elseif ($datum == 8) {echo 'aug';}
elseif ($datum == 9) {echo 'sep';}
elseif ($datum == 10) {echo 'okt';}
elseif ($datum == 11) {echo 'nov';}
elseif ($datum == 0) {echo 'dec';}											
}

A JEŠTĚ 1 MOŽNOST PŘES funkce

function mesiac($datum) {
echo substr(date("F", mktime(null, null, null, $datum)),0,3); 
}
-- date vrátí celý název měsíce, fungují správně i mínusové měsíce  
-- substr zkrátí na 3 znaky 

na to SQL se ještě podívám, myslím že by mělo jít zjednodušit máš tam příliš těch podmínek a subquery

teď jsem ještě něco hledal a zjistil jsem, že není třeba ten substr, pokud se do formátu date místo 'F' dá 'M' takže stačí

echo date("M", mktime(null, null, null, $datum));

Nahlásit jako SPAM
IP: 91.139.9.–
pepko1430
Newbie
25. 7. 2019   #4
-
0
-

Ďakujem Milan, že si si našiel znova na mňa čas. Pozriem sa na to.

Nahlásit jako SPAM
IP: 213.151.235.–
gna
~ Anonymní uživatel
1851 příspěvků
25. 7. 2019   #5
-
+1
-
Zajímavé

Než tu hromadu ifů, to bych raději použil pole. Teď nejde o to, jak zjistit název měsíce, ale obecně o podobné mapování. 

function mesiac($num) {
    $nazvy = ['jan','feb','mar','apr','máj','jún',
              'júl','aug','sep','okt','nov','dec'];
    $idx = (11 + $num) % 12;
    return $nazvy[$idx];
}

Opakující se kód jde samozřejmě hodit do cyklu.

$curmonth = date('n');
for ($i = 0; $i < 12; $i++)
	echo '<th>' . mesiac($curmonth - $i) . '</th>';

Nad tím SQL se mi nechce přemýšlet (hlavně nad náročností toho, co jsem vyplodil). Nějak nevidím potřebu těch joinů (rozhodně tam nepotřebuješ ještě tabulku vina). Když už to chceš namastit do jednoho řádku, tak bych asi zkusil nějak takhle: 

SELECT name,
       m1, m2, m3 ... m12,
       (m1 + m2 + m3 ... m12) / 12 avg
FROM   users
       LEFT JOIN (SELECT user_id,
                         Sum(Month(datum) = 1) m1,
                         Sum(Month(datum) = 2) m2,
                         Sum(Month(datum) = 3) m3,
                         ...
                  FROM   bodovanie
                  GROUP  BY uid) pocty
              ON pocty.user_id = user_id;
Nahlásit jako SPAM
IP: 213.211.51.–
MilanL+1
Grafoman
26. 7. 2019   #6
-
0
-

#5 gna
ahoj, je vidět že v php děláš víc než já, to tvoje použití pole na měsíce vypadá vizuálně lépe, o tom cyklu na výpis měsíců jsem také uvažoval, já to radil z práce furt někdo rušil takže jsem nahodil jen takové první nápady.

hm u toho tvého SQL mi chvilku trvalo než jsem pochopil, že sčítáš výsledek vyhodnocení True=1, jen si to pak musí správně spárovat do té tabuky, tam by měl stačit posun indexu, na celkový počet bych do subquery přidal Sum(1) celkem

ještě by tam měl mít limit na datum, buď poslední den aktuálního měsíce - rok, nebo Aktuální rok or ((Akt.rok-1) and měsíc>aktuální)

průměr by měl být jen z měsíců kdy bylo hodnoceno, to bych udělal až v php ve foreach 

foreach ($dvanastmesiace as $mesiace) {
		$count=0;
		for ($i = 2; $i < 14; $i++)
			if ($mesiace[i] > 0) $count++;
		echo '<tr>				  
			<td>'.$mesiace[1].'</td>';
			$curmonth = date('n');
			for ($i = 0; $i < 12; $i++)
				$month = ($curmonth +11 - $i) % 12;
				 echo '<td>'.$mesiace[$month+2].'</td>';
			echo '<td>'.$mesiace[14]/$count.'</td>
			 </tr>';
		
	}
Nahlásit jako SPAM
IP: 193.165.115.–
pepko1430
Newbie
11. 9. 2019   #7
-
0
-

Ahojte, 

Ďakujem Vám za reakcie.

Dostal som sa k tomu až teraz a už nerozumiem ani tomu svojmu kódu :D

Pozriem sa na Vaše rady a aplikujem ich.

Nahlásit jako SPAM
IP: 213.151.235.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Podobná vlákna

Php skript nonstop aktivita — založil Mishsuli

Statistika — založil liborb

Statistika — založil Pepa

Fotbalová statistika — založil Paja2

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý