Visualizzazione risultati 1 fino 15 di 15

Discussione: Dividere in pagina in base alla data

  1. #1
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito Dividere in pagina in base alla data

    Ciao ragazzi, faccio una domanda probabilmente scema.

    Ho una tabella chiamata dati, all'interno della quale presenta un campo datetime chiamato data_ora.

    chiarito questo framework, ho una pagina che raccoglie tutti i dati, strutturata in questo modo:

    [data | ora] DETTAGLIO DATI
    [data | ora] DETTAGLIO DATI
    [data | ora] DETTAGLIO DATI
    [data | ora] DETTAGLIO DATI
    [data | ora] DETTAGLIO DATI
    Siccome per verificare è un po' scomodo, vorrei creare una formattazione di questo stampo

    DATA

    (tutti i dati di questa data)

    [ora] DETTAGLIO DATI
    [ora] DETTAGLIO DATI
    [ora] DETTAGLIO DATI
    [ora] DETTAGLIO DATI
    [ora] DETTAGLIO DATI

    _______________

    DATA

    (tutti i dati di questa data)

    [ora] DETTAGLIO DATI
    [ora] DETTAGLIO DATI
    [ora] DETTAGLIO DATI
    [ora] DETTAGLIO DATI
    [ora] DETTAGLIO DATI

    ecc
    La cosa (elementare) che mi domando è come creare la parte in grassetto (dunque racchiudere tutti i dati in base alla data in ordine DECRESCENTE) e che tipo di query devo fare in fase di SELECT.

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,806

    Predefinito

    Molto probabilmente dovrai fare un GROUP BY per la data con un ORDER BY DESC per ordinarli.
    Per il group by, vedi qui.

    Per scrivere la parte in grassetto, dovrai controllare nel ciclo di scrittura se è cambiata la data; una cosa del tipo:

    Codice PHP:
    $current_data = '';

    while(
    $row = nuova_riga())
    {
    if(
    $row['campo_data'] != $current_data)
    {
    $current_data = $row['campo_data'];

    //scrivi data
    echo funzione_formattazione($current_data);
    }

    //scrivi dati "normalmente"

    }
    Ciao!
    Ultima modifica di alemoppo : 15-07-2022 alle ore 19.32.38

  3. #3
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Mi sa che in questo caso il GROUP BY non lo aiuta, perché non vuole aggregare righe del database, ma soltanto cambiare il modo in cui visualizzarle. Il resto del codice suggerito ha comunque senso.

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Per forzare usare la funzione DATE_FORMAT altresi usa
    Codice:
    SELECT DATE_FORMAT(data_ora, '%h:%i') ORDER BY DESC data_ora;
    e non su alias ma nel formato nativo del valore originale (significa del campo date_ora o qualsiasi 2022-07-15 21:00:00 predefinito mysql, non 15-07-2022 21:00:00 formato Europeo tra cui anche Italia), altrimenti i resultset potrebbero non essere ordinati da come li desideri.
    È uno pseudo codice per l'istruzione SQL il che significa da adattare per una stringa php valida (poiché scritta e interpretata dentro un file php).
    Non preoccuparti nulla di così difficile significa
    Codice PHP:
    //stringa php racchiusa da apice singolo
    $SQL_PHP = 'SELECT DATE_FORMAT(data_ora, \'%h:%i\') ORDER BY DESC data_ora;';
    Ultima modifica di darbula : 15-07-2022 alle ore 21.30.29

  5. #5
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Molto probabilmente dovrai fare un GROUP BY per la data con un ORDER BY DESC per ordinarli.
    Per il group by, vedi qui.

    Per scrivere la parte in grassetto, dovrai controllare nel ciclo di scrittura se è cambiata la data; una cosa del tipo:

    Codice PHP:
    $current_data = '';

    while(
    $row = nuova_riga())
    {
    if(
    $row['campo_data'] != $current_data)
    {
    $current_data = $row['campo_data'];

    //scrivi data
    echo funzione_formattazione($current_data);
    }

    //scrivi dati "normalmente"

    }
    Ciao!

    Ho provato a fare come suggerito, e mi esce un risultato parziale.
    Lo visualizzo in questo modo:

    data data data data data data data data data data

    DATI
    Dunque le date me le mette in modo corretto, ma queste restano tutte su una riga - una vicino all'altra - e sotto mi dà tutti i dati, senza però che essi vengano "raggruppati" sotto la data giusta.

    Codice PHP:
    //estraggo dati
    $result = site_query("SELECT dati.*, user.nome FROM dati LEFT JOIN user ON dati.stanza=user.id WHERE (dati.tipo = 'P' || dati.tipo = 'C') GROUP BY dati.ora ORDER by id DESC LIMIT 0,1000", 'result');
    $current_data = '';

    while (
    $row = gdrcd_query($result, 'fetch'))



    {
    if(
    $row['ora'] != $current_data)
    {
    $current_data = $row['ora'];

    //scrivi data
    echo site_format_date($current_data);
    }
    //stampiamo la pagina chat

    //STAMPO DATI

    }//fine while

  6. #6
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Se i tuoi dati sono in una tabella, e stampi le date senza metterle in una riga della tabella, appariranno sopra di essa. Ad esempio
    Codice HTML:
      <table>
        <tr><td>A</td><td>B</td></tr>
        Questo appare sopra la tabella
        <tr><td>C</td><td>D</td></tr>
        <tr><td>E</td><td>E</td></tr>
      </table>
    Tutto il contenuto di una tabella dev'essere dentro a tag:
    Codice HTML:
      <table>
        <tr><td>A</td><td>B</td></tr>
        <tr><th colspan=2>Questo occupa due colonne</th></tr>
        <tr><td>C</td><td>D</td></tr>
        <tr><td>E</td><td>E</td></tr>
      </table>

  7. #7
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Grazie della risposta, ma no: non c'è nessuna tabella nella mia pagina.

    Allo stato attuale è stampata così:

    12/07/2022 12.27 Dato
    12/07/2022 12:00 Dato
    12/07/2022 10:56 Dato

    11/07/2022 23:12 Dato
    11/07/2022 11:12 Dato
    Quello che vorrei fare è:

    12/07/2022

    12.27 Dato
    12:00 Dato
    10:56 Dato

    11/07/2022

    23:12 Dato
    11:12 Dato
    Nello specifico, ho questo:

    Codice PHP:
    //estraggo dati
    $result = site_query("SELECT dati.*, user.nome FROM dati LEFT JOIN user ON dati.stanza=user.id WHERE (dati.tipo = 'P' || dati.tipo = 'C') GROUP BY dati.ora ORDER by id DESC LIMIT 0,1000", 'result');
    $current_data = '';

    while (
    $row = gdrcd_query($result, 'fetch'))



    {
    if(
    $row['ora'] != $current_data)
    {
    $current_data = $row['ora'];

    //scrivi data
    echo site_format_date($current_data);
    }
    //stampiamo la pagina dati

    echo '<li>';
    echo
    '<span class="time">'. site_format_time($row['ora']).'</span>';
    echo
    '<span class="dato">'. $row['dato']).'</span>';
    echo
    '</li>';

    }
    //fine while
    Ultima modifica di personalthings : 16-07-2022 alle ore 00.13.27

  8. #8
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Il ciclo mi sembra corretto, ma secondo me quel GROUP BY dati.ora è incorretto

    Se vuoi stampare gli elementi in una lista, devi scegliere: o la data è un elemento <li> della lista, oppure apri e chiudi la lista attorno ad ogni data, come sotto:
    Codice PHP:
    <?php
    // estraggo dati
    $result = site_query(
    "SELECT dati.*, user.nome
    FROM dati LEFT JOIN user ON dati.stanza=user.id
    WHERE (dati.tipo = 'P' || dati.tipo = 'C')
    ORDER BY id DESC LIMIT 0,1000"
    ,
    'result'
    );

    $data_corrente = '';
    while (
    $row = gdrcd_query($result, 'fetch')) {

    // prendiamo solo la data: "2022-01-01 23:59:59" -> "2022-01-01"
    $data = substr($row['ora'], 0, 10);

    if (
    $data != $data_corrente) {

    // chiude la lista precedente, stampa la data, apre una nuova lista
    if ($data_corrente) { echo "</ul>"; }
    echo
    "<h2>" . site_format_date($data) . "</h2>";
    echo
    "<ul>";

    $data_corrente = $data;
    }

    // stampiamo la pagina dati
    echo '<li>';
    echo
    '<span class="time">' . site_format_time($row['ora']) . '</span>';
    echo
    '<span class="dato">' . $row['dato'] . '</span>';
    echo
    '</li>';
    }
    // fine while

    echo "</ul>";

  9. #9
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Niente, purtroppo continua a non raggrupparmi il contenuto.
    La visualizzazione è sempre la stessa: prima tutte le date, dalla più recente alla più vecchia, e poi, una volta finita la lista di date, tutti i dati.

    07/07/2022
    05/07/2022
    04/07/2022
    03/07/2022
    29/06/2022
    21/06/2022
    20/06/2022
    16/06/2022
    15/06/2022
    14/06/2022
    13/06/2022
    09/06/2022
    08/06/2022

    23:12 Dato
    22:30 Dato
    21:44 Dato
    ecc ecc
    Ma perchè?

  10. #10
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Difficile a dirsi senza vedere l'intera pagina: magari c'è del CSS che sposta le cose. Se nel browser guardi il sorgente HTML, in che ordine appaiono li?

  11. #11
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Credo di aver capito l'errore. E' che lo stamp del dato lo metto FUORI dal while, quindi giustamente mi sfarfalla. Se lo metto dentro, però, fa ciò che chiedo, ma i risultati si ripetono (giustamente) 100 volte. come posso evitare questo loop?

    (Ho modificato un po' l'assetto grafico, sostituendo UL con un hr)

    Codice PHP:
    //Lettura record
    $result = site_query("SELECT dati.*, user.nome FROM dati LEFT JOIN user ON dati.stanza=user.id WHERE (dati.tipo = 'P' || dati.tipo = 'C') ORDER by id DESC LIMIT 0,1000", 'result');
    $data_corrente = '';



    while (
    $row = site_query($result, 'fetch'))
    {
    // prendiamo solo la data: "2022-01-01 23:59:59" -> "2022-01-01"
    $data = substr($row['ora'], 0, 10);

    if (
    $data != $data_corrente) {

    // chiude la lista precedente, stampa la data, apre una nuova lista
    if ($data_corrente) { echo "<hr>"; }
    echo
    "<h2>" . site_format_date($data) . "</h2>";

    $data_corrente = $data;
    }

    switch (
    $row['tipo'])
    {
    case
    'P':
    $add_dati.= '<div align="justify">';


    $add_dati.= '<span class="time">'.site_format_time($row['ora']).'</span>';
    $add_dati.= '<b>'.$row['mittente'].'</b>';
    $add_dati.= '<span class="dato">'.$row['testo']).'</span>';
    $add_dati.= '</div>';
    break;

    case
    'C':
    $add_dati.= '<div class="row_'.$row['tipo'].'" align="justify">';
    $add_dati.= '<span class="time">'.site_format_datetime($row['ora']).'</span>';
    $add_dati.= '<span class="dato">'.$row['testo_dato_completo'].'</span>';
    $add_dati.= '</div>';
    break;
    }
    //switch


    } //while
    echo $add_dati;
    site_query($result, 'free');

  12. #12
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Se il campo data_ora contiene DateTime cioè data e parte temporale mi chiedo se effettivamente il campo ora abbia solo parte temporale? Altrimenti non prelevi la parte data con substr('00:00', 0, 10); //Sempre parte temporale invece del voluto data 2022-01-01 appunto da 0 caratteri e con 10 caratteri recuperati.
    Ultima modifica di darbula : 16-07-2022 alle ore 08.20.48

  13. #13
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Se il campo data_ora contiene DateTime cioè data e parte temporale mi chiedo se effettivamente il campo ora abbia solo parte temporale? Altrimenti non prelevi la parte data con substr('00:00', 0, 10); //Sempre parte temporale invece del voluto data 2022-01-01 appunto da 0 caratteri e con 10 caratteri recuperati.
    Ciao Darbula, grazie della risposta.
    In realtà il codice che mi ha suggerito dreadnaut funziona.
    Il mio unico problema è quando vado a stampare i dati con echo $add_dati;

    Se lo metto dentro il ciclo while, ottengo il risultato, ma i dati vengono ripetuti in loop

    Se io lo metto fuori dal while, non ho la ripetizione, ma non ho la suddivisione per data.

  14. #14
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,306

    Predefinito

    Ah! Adesso che hai postato il codice vero e proprio, si capisce il problema

    Il blocco switch accumula l'output dentro $add_dati, ed il contenuto viene stampato una volta sola dopo il ciclo. La riga che hai aggiunto invece stampa la data immediatamente.
    Codice PHP:
    echo "<h2>" . site_format_date($data) . "</h2>";
    Risultato: tutte le date, seguite dall'output "accumulato".

    Ci sono due opzioni qua: puoi concatenare la data ad $add_dati, con il resto
    Codice PHP:
    $add_dati .= "<h2>" . site_format_date($data) . "</h2>";
    oppure stampare tutto immediatamente senza usare $add_dati
    Codice PHP:
    <?php

    switch ($row['tipo']) {
    case
    'P':
    ?>
    <div align="justify">
    <span class="time"><?= site_format_time($row['ora']) ?></span>
    <b><?= htmlspecialchars($row['mittente']) ?></b>
    <span class="dato"><?= htmlspecialchars($row['testo']) ?></span>
    </div>
    <?php
    break;

    case
    'C':
    ?>
    <div class="row_C" align="justify">
    <span class="time"><?= site_format_datetime($row['ora']) ?></span>
    <span class="dato"><?= htmlspecialchars($row['testo_dato_completo']) ?></span>
    </div>
    <?php
    break;
    }
    //switch
    (bonus: htmlspecialchars() per evitare che codice infilato nei messaggi faccia danni)


    A parte: l'indentazione del tuo codice è assai disordinata, e può causarti confusione. A seconda dell'editor che usi, puoi attivare l'indentazione automatica — o cambiare editor
    Ultima modifica di dreadnaut : 16-07-2022 alle ore 17.20.55

  15. #15
    personalthings non è connesso Utente giovane
    Data registrazione
    10-08-2013
    Messaggi
    73

    Predefinito

    Grazie mille.
    Risolto tutto :D

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •