[PHP] Creazione tabelle dinamiche

AlP

Nuovo Utente
18 Mar 2018
7
0
1
35
Ciao a tutti,
ho un problema che non riesco a risolvere... ora vi spiego...
Ho 2 tabelle in un db:
Categoria
Scadenze

In pratica creo delle categorie per poi popolarle con le scadenze, tipo: categoria Bollo, scadenza Auto 01-01-2018. Fin qui tutto ok!

In pratica creo la mia pagina html con delle tabelle, n tabelle per n categorie attive, qui viene il bello... devo popolare le singole tabelle con le vere scadenze... il codice è questo ( si tratta di una bozza da rivisitare)

Codice:
$query = "SELECT count(*) as tot FROM categoria WHERE categoria_eliminata='0' ; ";
$rs =$mysqli->query($query);
$modifica = $rs->fetch_assoc();

$query1 = "SELECT * FROM scadenza  WHERE scadenza_eliminata='0' ; ";
$rs1 =$mysqli->query($query1);

$num=3; //numero colonne

$lunghezza=$modifica['tot']; //numero di categorie presenti

echo "<table width=\"1250\" border=\"1\" bordercolor=\"#000000\" cellpadding=\"5\">";

$x=0;

while($x<$lunghezza){
    echo "<tr>";

for($i=0;$i<$num;$i++){
    $riga = $rs1->fetch_assoc();
if($x<$lunghezza)
{
    
echo "<td>".$riga['nome_scadenza']."  ".$riga['data']."</td>";
}
$x++;                }

echo "</tr>";
                    }

echo "</table>";
Qualcuno ha una dritta da darmi?
Grazie in anticipo!!!
 

macus_adi

Utente Attivo
5 Dic 2017
1.312
88
48
IT/SW
Cicla sulle intestazioni dell'array senza fare query e controlli inutili...
Ti invito a leggere un questi due articoli che ho scritto per effettuare le connessioni al DB e recuperare i dati.
Parte1, Parte2

PHP:
echo "<table width=\"1250\" border=\"1\" bordercolor=\"#000000\" cellpadding=\"5\">";
foreach ($rs1 as $k=>$v){
    echo '<tr>';
    foreach ($v as $kk=>$vv){
        echo '<td>'.$vv.'</td>';
    }
    echo '</tr>';
}
echo '</table>';
 

macus_adi

Utente Attivo
5 Dic 2017
1.312
88
48
IT/SW
"Controlli inutili" sarebbe creare una seconda query per ottenere il numero di righe.... non si sembra corretto....
 

macus_adi

Utente Attivo
5 Dic 2017
1.312
88
48
IT/SW
Il consiglio che sento di darti, sarebbe "tipizzare" l'unica tabella in output con all'interno categoria...
Onestamente non hai spiegato il tuo problema.....
Vorresti raggruppare per tipologia? Se vuoi farlo in questo modo, la soluzione sarebbe molto facile con una query e group by...
Mi spiego...
Estrazione dati attuale con
$query1 = "SELECT * FROM scadenza WHERE scadenza_eliminata='0' ; ";
Scrivendo la tabelle più o meno come intendi tu.....
Codice:
CREATE TABLE scadenza_cat (
  id int(11) NOT NULL AUTO_INCREMENT,
  category varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB

CREATE TABLE scadenza (
  id int(11) NOT NULL AUTO_INCREMENT,
  cat_id int(11) DEFAULT NULL,
  voce varchar(255) DEFAULT NULL,
  valore float(10, 2) DEFAULT NULL,
  scadenzaa date DEFAULT NULL,
  PRIMARY KEY (id)
)
ENGINE = INNODB
Successivamente l'unica query che dovrai fare è questa:
Codice:
SELECT
  scadenza.id,
  scadenza_cat.category,
  scadenza.voce,
  SUM(scadenza.valore) AS totale
FROM scadenza
  INNER JOIN scadenza_cat
    ON scadenza.cat_id = scadenza_cat.id
WHERE scadenza.scadenzaa > CURDATE()
GROUP BY scadenza_cat.category
Mi spiego.... Hai la tabella categorie, e poi la tabella scadenza.... Effettui un join tra le due, e recuperi solo i valori che attualmente sono maggiori di CURDATE() (praticamente oggi), questi vengono sommati e raggruppati in base alla categoria, che per semplicità in questo modellino sono testuali e non numerici...
Spero sia utile....
 

macus_adi

Utente Attivo
5 Dic 2017
1.312
88
48
IT/SW
Allora devi lavorare in maniera differente:
  1. Recuperi tutti i dati senza group by
  2. Quando scorri l'array raggruppi per tipologia
  3. memorizzi una variabile temporanea per il totale e la stampi dove ti serve...
Mi spiego:
Ipotizza di avere un'array associativo.... Semplificando all'osso, anche se poco performante, uscirebbe così:
  • Recupero le categorie di tutti gli items (e creo un'altro array unico)
  • Inizio a scorrere l'array creato del punto sopra
    • Inizializzo una variabile del tipo totale = 0
    • Inizio a iterare l'array della query e stampo solo i dati con vincolo item.categoria == array_del_punto_sopra.valore
    • Stampo i dati correnti
    • Sommo a totale+=item.valore
  • Stampo il totale di categoria
PHP:
//popolato con i dati della query
$array_query=[];

//inizializzo array categorie a vuoto
$array_categorie=[];
//popolo array categorie
foreach ($array_query as $items){
    if(!in_array($items['categoria'],$array_categorie))$array_categorie[]=$items['categoria'];
}
//ipotizzo i dati che dovrai stampare per comodità
$define_stamp=['nome','scadenza','valore'];

foreach ($array_categorie as $item){

    echo '<tr><th colspan="'.(count($define_stamp)).'">'.$item.'</th></tr>';
    $sum_cat=0;
    foreach ($array_query as $k=>$v){
        echo '<tr>';
        foreach ($define_stamp as $vstampa){
            echo '<td>'.$v[$vstampa].'</td>';
        }
         echo '</tr>';
        $sum_cat+=$v['valore'];
    }
    echo '<tr><th></th><th>Totale Categoria</th><th>'.$sum_cat.'</th></tr>';
}
Utilizzando questa metodologia senza dover riscrivere codice per le intestazioni puoi spostare esattamente in posizione n+1 / n-1 gli item da stampare....
Spero sia utile
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.927
166
63
Lombardia
@Marco
Ti invito a leggere un questi due articoli che ho scritto per effettuare le connessioni al DB e recuperare i dati.
Parte1, Parte2
dovresti controllare il codice nelle pagine, ci sono errori ortografici e omissioni, mancano anche metodi
se qualche persona volesse utilizzare il tuo codice, incontra errori

se lo pubblichi, il codice dovrebbe essere funzionante senza interventi

saluti
 

macus_adi

Utente Attivo
5 Dic 2017
1.312
88
48
IT/SW
@marino51, intanto ti ringrazio, per fretta e/o trascrizione gli orrori ortografici possono esserci (nessuno è perfetto come ...).
Riguardo a
dovresti controllare il codice nelle pagine, ci sono errori ortografici e omissioni, mancano anche metodi
se qualche persona volesse utilizzare il tuo codice, incontra errori
forse non hai focalizzato l'attenzione su un qualcosa di veramente importante....
Nella aside dx trovi questo: "Non vuol essere un mini tutorial né un mini forum, ma l'intento sarà quello di offrire piccoli spunti sul quale approfondire argomenti."
Altra nota, illuminami sui metodi che mancherebbero, perchè non ne mancano, o meglio, 2 metodi che mancano sono stati omessi volutamente, per via del punto sopra e non di vitale importanza... Poi se si è abituati al copia/incolla quello non è il posto giusto...

Da nessuna parte ho scritto che il codice è completamente funzionante...
Piccola modifica....
Nota in basso che esistono solo metodi presenti e non fuffoli...
 

marino51

Utente Attivo
28 Feb 2013
2.927
166
63
Lombardia
Da nessuna parte ho scritto che il codice è completamente funzionante...
senza polemica, non mi sembra abbia molto senso pubblicare codice non funzionante
soprattutto quando la pubblicazione ha scopo divulgativo

ho notato che hai disattivato "APRI APPROFONDIMENTO" per cui è sparito il relativo codice
in ogni caso un metodo mancante é "set_table"
chi volesse trarre conoscenze dal codice, potrebbe trovare difficoltà

saluti
 

macus_adi

Utente Attivo
5 Dic 2017
1.312
88
48
IT/SW
ho notato che hai disattivato "APRI APPROFONDIMENTO" per cui è sparito il relativo codice
in ogni caso un metodo mancante é "set_table"
No in aggiornamento mancava un pezzo...
in ogni caso puoi copiarlo adesso l'ho rimesso!

Trovi il metodo che manca
PHP:
/**
     * Metodo per settare la tabella sulla quale effettuare le operazioni
     * @param string $table
     *
     * @return $this
     */
    public function set_table($table=''){
        if(!empty($table))$this->table=$table;
        return $this;
    }
 

macus_adi

Utente Attivo
5 Dic 2017
1.312
88
48
IT/SW
Ripeto,
  1. Scopo divulgativo non vuol dire fare tutto per filo e per segno
  2. Il codice non è su questo forum
  3. Ti stai intromettendo in questioni non tue
ribadisco, non è un copia/incolla se a te non funziona fallo funzionare... Se necessiti d'aiuto fammi sapere, ma non è qui né il luogo, né il momento, sei andato off topic. Chiudo
 

marino51

Utente Attivo
28 Feb 2013
2.927
166
63
Lombardia
Scopo divulgativo non vuol dire fare tutto per filo e per segno
ho poco rispetto per chi lavora in modo approssimativo, fa un danno a tutti

Il codice non è su questo forum
errore, vi si accede al post numero 2, quindi è su questo forum, fisicamente può essere anche in "Beciuania" ma qui è

Ti stai intromettendo in questioni non tue
il forum è aperto alla collaborazione di tutti e aiutare con un codice sbagliato, non è il massimo,
mi sono permesso di segnalarlo per aiutare chi ne fosse interessato

saluto e chiudo
 

macus_adi

Utente Attivo
5 Dic 2017
1.312
88
48
IT/SW
Marino, ripeto, controlla il codice, e poi parla... Mi meraviglio, che tu non abbia controllato.... Mi meraviglio che quel codice è di un progetto in produzione... Mi meraviglio, perchè .... lascia perdere...
Ora mandami il tuo errore... Sono curioso!....
Noto con piacere che sei molto poco attento......
PHP:
/**
     * Metodo per la creazione delle opzioni passate al costrutture
     * @param $opt
     */
    private function set_cparam($opt){
        foreach ($opt as $k=>$v){
            if(property_exists($this,$k))$this->$k=$v;
        }
    }
Mi dici cosa caspita fa questa.... Mi pare che esisteva sull'articolo... vabbè dai fa nulla... Continua... Ti ignoro io questa volta, e per sempre.... Ciao!
 
Ultima modifica:

maxbossi

Amministratore
Membro dello Staff
ADMIN
MOD
25 Feb 2003
2.007
39
48
www.ikiweb.it
Mi intrometto nella discussione invitando, amichevolmente, Marino51 e Marcus_adi a chiudere il "battibecco": siete, entrambi, due membri preziosi di questa comunità, quindi mi auguro che riusciate a risolvere questa discussione privatamente e nel migliore dei modi, come si addice a due persone intelligenti (e se non lo foste non sareste qui a parlare di codici ;)). Grazie.
 

macus_adi

Utente Attivo
5 Dic 2017
1.312
88
48
IT/SW
Allora devi lavorare in maniera differente:
  1. Recuperi tutti i dati senza group by
  2. Quando scorri l'array raggruppi per tipologia
  3. memorizzi una variabile temporanea per il totale e la stampi dove ti serve...
Mi spiego:
Ipotizza di avere un'array associativo.... Semplificando all'osso, anche se poco performante, uscirebbe così:
  • Recupero le categorie di tutti gli items (e creo un'altro array unico)
  • Inizio a scorrere l'array creato del punto sopra
    • Inizializzo una variabile del tipo totale = 0
    • Inizio a iterare l'array della query e stampo solo i dati con vincolo item.categoria == array_del_punto_sopra.valore
    • Stampo i dati correnti
    • Sommo a totale+=item.valore
  • Stampo il totale di categoria
PHP:
//popolato con i dati della query
$array_query=[];

//inizializzo array categorie a vuoto
$array_categorie=[];
//popolo array categorie
foreach ($array_query as $items){
    if(!in_array($items['categoria'],$array_categorie))$array_categorie[]=$items['categoria'];
}
//ipotizzo i dati che dovrai stampare per comodità
$define_stamp=['nome','scadenza','valore'];

foreach ($array_categorie as $item){

    echo '<tr><th colspan="'.(count($define_stamp)).'">'.$item.'</th></tr>';
    $sum_cat=0;
    foreach ($array_query as $k=>$v){
        echo '<tr>';
        foreach ($define_stamp as $vstampa){
            echo '<td>'.$v[$vstampa].'</td>';
        }
         echo '</tr>';
        $sum_cat+=$v['valore'];
    }
    echo '<tr><th></th><th>Totale Categoria</th><th>'.$sum_cat.'</th></tr>';
}
Utilizzando questa metodologia senza dover riscrivere codice per le intestazioni puoi spostare esattamente in posizione n+1 / n-1 gli item da stampare....
Spero sia utile
Bando a quanto detto nella disputa tra me e marino51, utilizzando la query unica dovresti risolvere così!