popolare tabella da mysql

valerio matrix

Nuovo Utente
7 Mag 2015
33
0
6
come da titolo avrei la necessita di stampare a video una tabella contente i turni di lavoro. la prima riga contiene tutte le date del mese, una per ogni cella. La prima colonna invece tutti i nomi dei turni da me chiamati etichette (turno mattina diventa come etichetta MT) e nel mezzo i nomi delle persone. ho provato e riprovato ma ciò che riesco a fare in maniera logica su carta come algoritmo non riesco a riprodurlo in codifica.
posto anche il codice. Mi sarebbe opportuno un suggerimento anche se dovessi rifare da capo tutto.
PHP:
<?php
    setlocale(LC_TIME,"it_IT");
    require "../includes/connect_config.php";

    $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD)
        or die("<p> Errore di Connessione al DB: " . mysqli_error() . "</p>");

  

    $db_selec = mysqli_select_db($conn, DB_NAME)
        or die("<p>Errore di selezione DB: " . mysqli_error() . "</p>");

//query estrapolazione matrice turni

$get_turnazione_query = "SELECT turnazione.turnazione_data, lavoratore.lav_nome as id_lavoratore, orario_turno.orturno_etichetta as id_orario_turno
                                FROM turnazione
                                    INNER JOIN lavoratore ON turnazione.id_lavoratore = lavoratore.id_lavoratore
                                        INNER JOIN orario_turno ON turnazione.id_orario_turno = orario_turno.id_orario_turno";

$risultato = mysqli_query($conn, $get_turnazione_query);
    if (!$risultato) {
        die ("<p> Errore nella Query: " . mysqli_error() . "</p>");
    }

//query estrapolazione array con etichette turni

$get_turni_query = "SELECT orario_turno.orturno_etichetta
                                FROM orario_turno
                                    ORDER BY `orario_turno`.`orturno_livello` ASC";


$etichetta = mysqli_query($conn, $get_turni_query);
    if (!$etichetta) {
        die ("<p> Errore nella Query: " . mysqli_error() . "</p>");
    }

//estrapolazione dati query in array con valori turnazione

    $i="0";
    while ($row = mysqli_fetch_array($risultato)) {
        $data[$i] = $row['turnazione_data'];
        $lavoratore[$i] = $row['id_lavoratore'];
        $ora[$i] = $row['id_orario_turno'];
        $i++;
    }
//estrapolazione dati query in array con valori etichette turni

    $i="0";
    while ($row = mysqli_fetch_array($etichetta)) {
        $baseore[$i] = $row['orturno_etichetta'];
        $i++;
    }

      
//conteggio indici

$contdata= count($data);
$contlav = count($lavoratore);
$contora = count($ora);
$contetichetta = count($baseore);
$giorno = "01";
$mese = "01";
$anno = "2019";
$totgiornimese = date("t", strtotime($mese . "/" . $giorno . "/" . $anno));
$z=0;
$x = 0;
echo "<br>";
//inizio tabella
echo "<table class='tab-turnazione'><tr><td> TURNI </td>";

//inizio ciclo data prima riga
$prog =0;
for ($i=0; $i < $totgiornimese; $i++ ){
    echo "<td>" . date("d D", mktime(0,0,0,$mese, $giorno + $prog, $anno)) . "</td>";
    $prog++;
}
echo "</tr>";
$prog =0;
$bool=0;


//inizio ciclo prima colonna  etichette
for ($y=0; $y < $contetichetta; $y++){
    echo "<tr>";
    echo "<td>" . $baseore[$y] . "</td>";
    $check_etichetta = $baseore [$y];
    echo "ciclo etichetta " . $y . "<br>";
//inizio ciclo date da indice 0 a tot giorni mese
        for($j=0; $totgiornimese >= $j; $j++){
            $datatop = date("Y/m/d", mktime(0,0,0,$mese, $giorno + $prog, $anno));
           echo "ciclo data " . $j . "<br>";
          
        
//inizio ciclo da indice 0 a tot lavoratori
                for($x=0; $contlav >= $x; $x++){
                    echo " ciclo lav " . $x . "<br>";
                    if($ora[$x] == $check_etichetta){
//inizo ciclo da indice 0 a tot lavoratori con operatore logico per controllo etichetta e data
                        while($z < $contlav  && $bool == 0 ){
                            echo " - while " . $z . "<br>";
                            $check_data = date("Y/m/d", strtotime($data[$z])); // da vedere
                            echo " " . $check_data . " = " . $datatop . " <br>";
                            if($check_data == $datatop){
                                echo "<td>" . $lavoratore[$x] . "</td>";
                                    $bool = 1;
                                        $prog + 1;
                                          
                              
                                          echo "ciclo stampa " . $x . " <br>";
                              
                            } else{
                                echo "else " . $z . "<br>";
                              
                            }
                    }
                      
                } else {
                    $x++;
                }
            }
      
          
        }
    //$j++;
    echo "</tr>";
    $bool = "0";
}

?>
questo codice stampa la prima riga e le prime due colonne quindi sicuramente è un problema di indici perche dovrebbe stampare una riga completa per chiuderla e passare alla seguente
 
Ultima modifica di un moderatore:

macus_adi

Utente Attivo
5 Dic 2017
1.141
65
48
IT/SW
Non avendo idea di come vengono trattati i dati, l'esempio più banale è questo che puoi tranquillamente provare flat:
PHP:
<?php
/**
* MAKE FAKER DATA
* @param string $user Utente corrente passato dal foreach
* @param array $max_days Giorni del mese
* @param array $turnazione Turnazioni disponibili
* @param array $data
*/
function popola_dati_giorni($user,$max_days,$turnazione,&$data){
   $a_ks=array_keys($turnazione);

   for($i=$max_days[0];$i<=$max_days[count($max_days)-1];$i++){
      $turno_giorno=$a_ks[rand(0,count($a_ks)-1)];
      $init_end=rand(0,2);

      $data[$turno_giorno][]=
         [
            'user'=>$user,
            'giorno'=>$i,
            'inizio'=>$turnazione[$turno_giorno]['inizio'][$init_end],
            'fine'=>$turnazione[$turno_giorno]['fine'][$init_end]
         ];

   }
}


$utn=['Marco','Nino','Giuseppe','Paolo'];
$turnazioni=
   [
      'Turno Mattina'=>['inizio'=>range(6,9),'fine'=>range(13,17)],
      'Turno Pomeriggio'=>['inizio'=>range(14,17),'fine'=>range(22,0)],
      'Turno Sera'=>['inizio'=>range(22,0),'fine'=>range(6,9)],
      'Riposo'=>['inizio'=>[0,0,0],'fine'=>[0,0,0]]
   ];
$giorni_mese=range(1,date('t',time()));

$data=['Turno Mattina'=>[],'Turno Pomeriggio'=>[],'Turno Sera'=>[],'Riposo'=>[]];
foreach ( $utn as $utente ) {
   popola_dati_giorni($utente,$giorni_mese,$turnazioni,$data);
}


?>
<link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet" type="text/css">
<table class="table table-bordered">
   <thead>
   <tr>
      <th>Turnazione</th>
      <th colspan="<?=$giorni_mese[count($giorni_mese)-1]?>">Giorni</th>
   </tr>
   </thead>
   <tbody>
  
<?php

echo '<tr><td></td>';
foreach ($giorni_mese as $items){
   echo '<td>'.$items.'</td>';
}
echo '<tr>';
foreach ($data as $k=>$v){
   //qui stampo la Turnazione
   echo '<tr><td>'.$k.'</td>';
   foreach ($giorni_mese as $giorni){
      echo '<td>';
      //Cerco e stampo gli utenti che si trovano in quella turnazione in quel giorno
      array_walk($v,function($v,$k,$giorni){
         if($v['giorno']==$giorni)echo $v['user'].' - ('.$v['inizio'].' - '.$v['fine'].')<br>';
      },$giorni);
      echo '</td>';

   }
   echo '</tr>';
}
?>
   </tbody>
</table>
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.086
299
83
@valerio matrix
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
o il tag
per il PHP, quando posti del codice, oppure la funzione codice dalla barra degli strumenti

Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro
 

valerio matrix

Nuovo Utente
7 Mag 2015
33
0
6
@valerio matrix
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
o il tag
per il PHP, quando posti del codice, oppure la funzione codice dalla barra degli strumenti

Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro
ciao. Sono convinto di aver postato il codice fra i tag "
Codice:
" non capisco dove ho sbagliato.
 

valerio matrix

Nuovo Utente
7 Mag 2015
33
0
6
Non avendo idea di come vengono trattati i dati, l'esempio più banale è questo che puoi tranquillamente provare flat:
PHP:
<?php
/**
* MAKE FAKER DATA
* @param string $user Utente corrente passato dal foreach
* @param array $max_days Giorni del mese
* @param array $turnazione Turnazioni disponibili
* @param array $data
*/
function popola_dati_giorni($user,$max_days,$turnazione,&$data){
   $a_ks=array_keys($turnazione);

   for($i=$max_days[0];$i<=$max_days[count($max_days)-1];$i++){
      $turno_giorno=$a_ks[rand(0,count($a_ks)-1)];
      $init_end=rand(0,2);

      $data[$turno_giorno][]=
         [
            'user'=>$user,
            'giorno'=>$i,
            'inizio'=>$turnazione[$turno_giorno]['inizio'][$init_end],
            'fine'=>$turnazione[$turno_giorno]['fine'][$init_end]
         ];

   }
}


$utn=['Marco','Nino','Giuseppe','Paolo'];
$turnazioni=
   [
      'Turno Mattina'=>['inizio'=>range(6,9),'fine'=>range(13,17)],
      'Turno Pomeriggio'=>['inizio'=>range(14,17),'fine'=>range(22,0)],
      'Turno Sera'=>['inizio'=>range(22,0),'fine'=>range(6,9)],
      'Riposo'=>['inizio'=>[0,0,0],'fine'=>[0,0,0]]
   ];
$giorni_mese=range(1,date('t',time()));

$data=['Turno Mattina'=>[],'Turno Pomeriggio'=>[],'Turno Sera'=>[],'Riposo'=>[]];
foreach ( $utn as $utente ) {
   popola_dati_giorni($utente,$giorni_mese,$turnazioni,$data);
}


?>
<link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet" type="text/css">
<table class="table table-bordered">
   <thead>
   <tr>
      <th>Turnazione</th>
      <th colspan="<?=$giorni_mese[count($giorni_mese)-1]?>">Giorni</th>
   </tr>
   </thead>
   <tbody>
 
<?php

echo '<tr><td></td>';
foreach ($giorni_mese as $items){
   echo '<td>'.$items.'</td>';
}
echo '<tr>';
foreach ($data as $k=>$v){
   //qui stampo la Turnazione
   echo '<tr><td>'.$k.'</td>';
   foreach ($giorni_mese as $giorni){
      echo '<td>';
      //Cerco e stampo gli utenti che si trovano in quella turnazione in quel giorno
      array_walk($v,function($v,$k,$giorni){
         if($v['giorno']==$giorni)echo $v['user'].' - ('.$v['inizio'].' - '.$v['fine'].')<br>';
      },$giorni);
      echo '</td>';

   }
   echo '</tr>';
}
?>
   </tbody>
</table>
Fantastico. Anche come codice molto più pulito del mio. Sono alle basi con questo linguaggio e cerco di imparare creando un piccolo gestionale, e studiando su un libro della Hops e un video corso. grazie mille per l'aiuto. Cerco di studiare questo codice visto che alcuni comandi non li avevo mai usati e cerco di adattarlo al mio lavoro.

un'ultima domanda, credo che ovviamente dovrò cambiare query. nella variabile data, 'inizio' e 'fine' non sono nel db numeri int ma il tipo di dato è time, li posso ugualmente prelevare dal db così ? o li devo modificare subito dopo e farli diventare numeri int?
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.086
299
83
ciao. Sono convinto di aver postato il codice fra i tag "
Codice:
" non capisco dove ho sbagliato.
Si! Ma hai usato il tag
code.gif
invece del tag
php.png
!
Quando si posta del codice PHP bisogna usare il tag
PHP:
.
Mi sono spiegato ora?
 
  • Like
Reactions: valerio matrix

Noa

Nuovo Utente
25 Gen 2020
1
0
1
Ciao gente. Ho un problema simile e vedendo questo post mi sono registrata per chiedere. Max potresti spiegarmi come funziona il tuo codice? devo creare una tabella con dei dati incrociati e vorrei provare ad adattare questo codice che funziona meglio del mio.