[risolto] Mostrare a video il risultato di una query con stesso anno e mesi diversi

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
Buongiorno a tutti, rieccomi...
Il titolo non e' chiarissimo, lo so.
Si tratta di questo:
Ho una tabella calendario che raduna tutte le lezioni e per ciascuna lezione è memorizzata la data con ciascun dato in campi separati: giorno, mese, anno, giorno della settimana.
Per mostrare a video il calendario devo ottenere:
- L'anno
poi - il mese
e per ciascun mese le lezioni del periodo.
Poi passare al mese successivo della selezione, scriverlo, e poi tutte le lezioni.
Tipo:
2014
GENNAIO
lezione 1
lezione 2
...
FEBBRAIO
lezione 1
lezione 2

Naturalmente la selezione non partirà sempre da gennaio...
Pensavo a un ciclo FOREACH, ma non riesco a ottenere il calendario come mi serve.
Non riesco a effettuare il ragionamento corretto per ottenere questo risultato.
Qualcuno puo' darmi una mano?
Grazie
 

html5today

Nuovo Utente
17 Feb 2014
9
0
0
HTML5
www.html5today.it
Ciao! Sebbene non abbia proprio chiarissima la tua domanda, penso che basti che tu faccia prima una query con l'anno, poi nella pagina di ogni anno metti una lista dei mesi linkata alla pagina di ogni singolo mese che mostra le lezioni di quel mese.

Insomma una roba del genere:

PHP:
<?php

  $mesi = array('gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio',  'agosto', 'settembre', 'ottobre', 'novembre','dicembre');

  // facciamo una lista con sottoliste
  echo '<ul>';

  // parti da questo anno e mostra i prossimi 5 anni  
  for ($anno = date('Y'); $anno <= date('Y') + 5; $anno++)
  {
    echo '<li>Anno ' . $anno;
    echo '<ul>
    foreach ($mesi as $mese)
    {
      // qui puoi mettere il link alla pagina di ogni singolo mese, oppure fare direttamente la query per le lezioni di quel mese
      echo '<li>' . $mese . '</li>';
    }
    echo '</ul>';
    echo '</li>';
  }
  echo '</ul>';

?>
Bah, facci sapere se questa soluzione ha senso... ;)
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
si, ha senso...
Alla query per anno ci ero arrivato, non ero arrivato a pensare di creare un array con i mesi e quindi il FOREACH.
Mi si era grippato il cervello...
Intanto grazie, poi vi faccio sapere.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
se non ho capito male tu hai una tabella del tipo (metto i nomi a caso)
Codice:
id
anno
mese
giorno
lezione
potresti provare a fare cosi
PHP:
<?php
//dati ci connessione
$q1=mysqli_query("SELECT anno FROM tabella GROUP BY anno ORDER BY anno");
$anni=mysqli_fetch_assoc($q1);//array degli anni
$q2=mysqli_query("SELECT mese FROM tabella GROUP BY mese ORDER BY mese");
$mesi=mysqli_fetch_assoc($q2);//array dei mesi
echo "<table>";
echo "<tr><td>anno</td><td>mese</td><td>giorno</td><td>lezione</td></tr>";
foreach($anni as $anno){
	echo "<tr><td>$anno</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>";
	foreach($mesi as $mese){
		echo "<tr><td>&nbsp;</td><td>$mese</td><td>&nbsp;</td><td>&nbsp;</td></tr>";
		$q3=mysqli_query("SELECT * FROM tabella WHERE anno='$anno' AND mese='$mese' ORDER BY giorno");
		while($riga=mysqli_fetch_assoc($q3)){
			$gg=$riga['giorno'];
			$lez=$riga['lezione'];
			echo "<tr><td>&nbsp;</td><td>&nbsp;</td><td>$gg</td><td>$lezione</td></tr>";
		}
	}
}
echo "</table>";
?>
guarda che l'ho buttato giu al volo, quindi tutto da verificare

ops: avevano già risposto
 
Ultima modifica:

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
Allora, ho applicato il ragionamento di cui sopra...
Questa è la funzione in questione:
PHP:
function anteprima1anno() {
	$anno = $_SESSION['annoStart'];
	include 'connect.php';
			$query = ("SELECT * FROM calendario WHERE pubblica = 1 && anno = $anno");
			$fatto = mysql_query($query);
			mysql_close();
			
			$num=mysql_numrows($fatto);
			if ($num == 0) {
				echo "Non ci sono lezioni abilitate alla pubblicazione nel $anno";
			}
			echo "<p align='center' class='h22b'>$anno</p>";
			
		$mesi = array('1', '2', '3', '4', '5', '6', '7',  '8', '9', '10', '11','12');

foreach ($mesi as $mese) {
	
	if ($mese == 1){$mese = "gennaio";}
	 if ($mese == 2){$mese = "febbraio";}
	 if ($mese == 3){$mese = "marzo";}
	 if ($mese == 4){$mese = "aprile";}
	 if ($mese == 5){$mese = "maggio";}
	 if ($mese == 6){$mese = "giugno";}
	 if ($mese == 7){$mese = "luglio";}
	 if ($mese == 8){$mese = "agosto";}
	 if ($mese == 9){$mese = "settembre";}
	 if ($mese == 10){$mese = "ottobre";}
	 if ($mese == 11){$mese = "novembre";}
	 if ($mese == 12){$mese = "dicembre";}
	echo "<p align = 'center' class'h22b'>$mese</p>";
?>
				
<table width="100%%" border="0" cellspacing="0" cellpadding="0" class="h7">
    
<?php

	/*visualizzo i dati delle lezioni */
	
	$i=0;
 	while ($i < $num) { 
     $id=mysql_result($fatto,$i,"id_lezione");
	 $giorno=mysql_result($fatto,$i,"giorno");
	 $weekday=mysql_result($fatto,$i,"weekday");
	 $t7invita=mysql_result($fatto,$i,"t7invita");
	 $chef=mysql_result($fatto,$i,"chef");
	 $titolo=mysql_result($fatto,$i,"titolo");
	 $sottotitolo=mysql_result($fatto,$i,"sottotitolo");
	 $dettagli=stripslashes(mysql_result($fatto,$i,"dettagli"));
	 $dettagli = str_replace("\n","<BR>",$dettagli);
	 $euro=mysql_result($fatto,$i,"euro");
	 $posti=mysql_result($fatto,$i,"posti");

?>

<tr>
    <td width="70" class="h5b">Cod.<br />lezione:<br /><? echo $id; ?></td>
    <td width="100" class="h5b"><? echo "$weekday, $giorno"; ?></td>
    <td colspan="3" class="h5b">Posti Disponibili: <? echo $posti; ?></td>
    </tr>
  <tr>
    <td>&nbsp;</td>
    <td colspan="4" class="h5b"><? echo $t7invita; ?></td>
    </tr>
  <tr>
    <td>&nbsp;</td>
    <td colspan="4" class="h7b">Chef: <? echo $chef; ?></td>
    </tr>
  <tr>
    <td>&nbsp;</td>
    <td colspan="4" class="h5b"><? echo $titolo; ?></td>
    </tr>
  <tr>
    <td>&nbsp;</td>
    <td colspan="4"><? echo $sottotitolo; ?></td>
    </tr>
  <tr>
    <td>&nbsp;</td>
    <td colspan="4" class="h7"><? echo $dettagli; ?></td>
    </tr>
  <tr>
    <td>&nbsp;</td>
    <td colspan="2" align="right" class="h5b">&nbsp;</td>
    <td width="244" colspan="2" align="right"  class="h5b">€ <? echo $euro; ?></td>
  </tr>
<?php
	 
     $i++;

	}
		
}
}

?>

</table>
Ma mi si stampa l'anno correttamente e poi prima dell'elenco delle lezioni mi mette sia gennaio che febbraio (che sono gli unici due mesi attualmente presenti nel 2014)
Se volete dare un occhiata dal vivo (al momento si puo' scegliere solo il 2014):
http://www.teatro7.com/backoffice/calendarioPubblicato.php

grazie...
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
sei sicuro che funzi?
Fatal error: Call to undefined function anteprimapiumesi() in /htdocs/public/www/backoffice/calendarioPubblicato.php on line 164
poi non capisco perche ti vuoi incasinare in quel modo soprattutto con i mesi.
es.
PHP:
<?php
//.....
$mesi = array('gen', 'feb', 'mar',ecc...);
foreach ($mesi as $mese){//così non devi fare tutta quella sfilza di if
echo "<p align = 'center' class'h22b'>$mese</p>"; 
//...

}
//...
?>
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
E comunque e' tutto sbagliato...
Selezionando l'anno 2014, mi mostra le stesse lezioni in tutti i dodici mesi...
Ci devo ripensare.
La serie di if serviva, nella mia testa, a richiamare funzioni e quindi ricerche diverse, a seconda di cio' che l'utente sceglie nel form: solo un anno, solo un mese di un anno, un periodo tra più mesi, o un periodo fra più anni.
Adesso è sviluppata solo la funzione che risponde alla selezione di un solo anno.
Comunque dovrei in qualche modo testare se nella selezione richiesta ci siano lezioni da pubblicare e QUALI mesi ci sono. E poi impaginarli nella mia tabella col ciclo WHILE.
Se avete qualche spunto di ragionamento, mi aiuterebbe...
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
prova una cosa del genere
PHP:
<?php
//dati ci connessione
function calendario($a1,$a2,$m1,$m2){
/* dove
$a1 -> $_POST['anno1']
$a2 -> $_POST['anno2']
$m1 -> $_POST['mese1']
$m2 -> $_POST['mese2']
*/
	//crei dinamicamente la querystringa in funzione degli anni che inputi
	$wh="";
	if($a1 !="==" && $a2 !="=="){//input entrambi
		$wh="WHERE anno BETWEN '$a1' AND '$a2'";
	}elseif($a1 !="==" && $a2 =="=="){//input solo anno partenza
		$wh="WHERE anno >= '$a1'";
	}elseif($a1 =="==" && $a2 !="=="){//input solo arriwo
		$wh="WHERE anno <= '$a2'";
	}
	$qa=mysqli_query("SELECT anno FROM talbella $wh GROUP BY anno ORDER BY anno");
	if(mysqli_num_rows($qa) == 0){
		echo "non trovata corrispondenza nell'intervallo cercato";
	}else{
		while($a=mysqli_fetch_array($qa)){
			$anni[]=$a['anno'];//estrae gli hanni che hai in tabella
		}
		//crei dinamicamente la querystringa dei mesi inputati per il periodo di anni inputato
		$wh="WHERE 1=1";
		if($m1 !="==" && $m2 !="=="){//input entrambi
			$wh="AND mese BETWEN '$m1' AND '$m2'";
		}elseif($m1 !="==" && $m2 =="=="){//input solo anno partenza
			$wh="AND mese >= '$m1'";
		}elseif($a1 =="==" && $a2 !="=="){//input solo arriwo
			$wh="AND mese <= '$m2'";
		}
		foreach($anni as $anno){
			$q=mysqli_query("SELECT mese FROM tabella $wh AND anno='$anno' GROUP BY mese ORDER BY mese");
			if(mysqli_num_rows($q > 0){
				$m=mysql_fetch_array($q);
				$periodo[$anno]=$m['mese'];
			}
		}
		if(!is_array($periodo)){
			echo "non trovata corrispondenza nell'intervallo cercato";
		}else{
			echo "<table>";//qui ti organizzi la tabella come vuoi io metto solo un campo a caso
			$mm=array('','gen','feb');//ecc... tutti i mesi, partendo con un posto vuoto
			foreach($periodo as $anno => $mese){
				$q=mysql_query("SELECT * FROM tabella WHERE anno='$anno' AND mese='$mese' ORDER BY giorno");
				$mese=(int)$mese;
				$mese_let=$mm[$mese];
				if(mysqli_num_rows($q)>0){
					while($riga=mysqli_fetch_assoc($q)){
						$giorno=$riga['giorno'];
						$titolo=$riga['titolo'];
						echo "<tr><td>$anno</td><td>$mese_let</td><td>$giorno</td><td>titolo</td></tr>";
					}
				}
			}
			echo "</table>";
		}
		
	}
	
}//fine function
//****TEST******
calendario($_POST['anno1'],$_POST['anno2'],$_POST['mese1'],$_POST['mese2']);
?>
attento al valore delle <select> per non selezianate ho messo ==
e non ho messo i controlli in caso di errore, es. anno di partenza maggiore di quello di arrivo, io metterei un controllo del genere
PHP:
<?php
//dentro la funzione all'inizio....
if($a1 > $ a2){
	$tr=$a1;
	$a1=$a2;
	$a2=$tr;//cioè inverto (swap)
}
//...analogo per il mese
?>
comunque da provare se funziona
 

html5today

Nuovo Utente
17 Feb 2014
9
0
0
HTML5
www.html5today.it
Non ho dato un'occhiata approfondita al codice, velocemente dico solo: occhio a controllare l'input
PHP:
/* dove 
$a1 -> $_POST['anno1'] 
$a2 -> $_POST['anno2'] 
$m1 -> $_POST['mese1'] 
$m2 -> $_POST['mese2'] 
*/
che poi usi nella query:
PHP:
$wh="WHERE anno BETWEN '$a1' AND '$a2'";
Apre la porta alla "SQL injection": http://www.html.it/pag/19638/sql-injection-cosa-sono-e-come-sfruttarle/
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao html5
se noti ho scritto che ho omesso i controlli
è evidente che tutti i dati devono essere controllati
ma qualcosina l'utente deve (dovrebbe) fare
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
grazie delle ooservazini.
Ora integro il mio codice (che avevo variato rispetto alla prima stesura) con il codice proposto sopra (o meglio il concetto).
Appena funziona tutto come voglio io, vi faccio sapere...
Non sono velocissimo, (per fortuna) ho anche un altro paio di cose da curare e non riesco mai a cominciare e finire una cosa senza interruzioni!
A presto, e se vi viene qualche altra idea, accetto ogni suggerimento.
 

gandalf1959

Utente Attivo
21 Nov 2013
203
1
18
e finalmente funziona tutto come mi serve.
Grazie per i suggerimenti. Integrando quello che mi avete suggerito con alcune variazioni richieste dal mio committente ho risolto.
Alla prossima e grazie di tutto.