• User Attivo

    LIMIT basato su variabile

    Ho un problemino

    Dovrei popolare una lista tramite SELECT e vorrei che mi mostrasse solo gli articoli "new entry".
    Per definire un articolo come "new entry" ho usato un calcolo tra date.
    Nel DB ho il campo "added" che mi segna la data di creazione dell'articolo da lì, sapendo la data odierna, faccio la differenza e se il risultato è minore o uguale a 15 giorni l'articolo è considerato "new entry" se invece siamo oltre al 15° giorno no.

    Questo il mio calcolo

    [PHP]
    $today1 = strtotime('now');
    $today=date("d.m.Y",$today1);
    $f_date1 = ($data[added]);
    $f_date=date("d.m.Y",$f_date1);
    $difference = intval(($today1 - $f_date1)/86400+1);
    if ($difference <= 15) {$nuovo = "NEW ENTRY";}
    else {$nuovo = " ";}
    [/PHP]

    Ora vorrei che la lista generata mi mostrasse SOLO i "new enrty".. ma, ignoranza mia, non riesco in nessun modo a fare un WHERE basato sulla variabile $difference (o anche $nuovo mi andrebbe bene). Sono riuscita solamente a ordinare i risultati ORDER BY added ma così, dopo le "new entry" mi mostra anche quelli NON "new entry".

    Ho pensato allora di usare LIMIT e come parametro sapere esattamente quanti sono i "new entry", Forse è un costrutto un po' pesante ma a rigor di logica dovrebbe funzionare: limito la query (ordinata dalla data di immissione) al numero di articoli "new entry".

    La domanda è: come posso contare quanti sono gli articoli che hanno $difference <=15 oppure $nuovo="NEW ENTRY" ?
    Le ho provate tutte ma non ci riesco :bho:❌x

    Avete una dritta per me? :mmm:

    Grazie! 💋

    Sara


  • User Attivo

    Ciao,
    secondo me hai 3 scelte, poi ognuno ha il suo modo di programmare:

    1. memorizzare la data in formato timestamp (tramite php è time(), tramite MySQL dovrebbe essere NOW() ) durante l'inserimento ed effettuare una semplice differenza tra date;
    2. trasformare ogni volta le date che hai nel DB in timestamp ed effettuare, quindi, una differenza;
    3. applicando la tua soluzione del LIMIT (che però, a mio avviso, è una soluzione non molto "pulita", per calcolarti quanti articoli hanno $differenze <= 15 ti basta fare una query del genere:
    
    $sql = "SELECT count(*) AS totale FROM $table WHERE $difference <= 15";
    
    

    Fammi sapere!


  • User Attivo

    @Tarab said:

    Ciao,
    secondo me hai 3 scelte, poi ognuno ha il suo modo di programmare:

    1. memorizzare la data in formato timestamp (tramite php è time(), tramite MySQL dovrebbe essere NOW() ) durante l'inserimento ed effettuare una semplice differenza tra date;
    2. trasformare ogni volta le date che hai nel DB in timestamp ed effettuare, quindi, una differenza;
    3. applicando la tua soluzione del LIMIT (che però, a mio avviso, è una soluzione non molto "pulita", per calcolarti quanti articoli hanno $differenze <= 15 ti basta fare una query del genere:
    
    $sql = "SELECT count(*) AS totale FROM $table WHERE $difference <= 15";
    
    

    Fammi sapere!

    Ciao,
    grazie della risposta.
    La SELECT come posso farla visto che $difference non è un valore nel DB ?
    Posso farla comunque??? :mmm:

    Comunque l'ho risolta così, forse un metodo un po' barbaro, ma funziona.. che ne dici?

    [PHP]
    $today1 = strtotime('now');
    $today=date("d.m.Y",$today1);
    $f_date1 = ($data[added]);
    $f_date=date("d.m.Y",$f_date1);
    $difference = intval(($today1 - $f_date1)/86400+1);
    if ($difference <= 15) {$nuovo = "NEW ENTRY";}
    else {$nuovo = " ";}
    $newentry = ($today1 - 1296000);
    [/PHP]

    e poi

    [PHP]
    SELECT * FROM table WHERE added >= $newentry
    [/PHP]


  • User Attivo

    Ah! Pensavo che $difference fosse un valore. Allora no, non va bene se gli passi $difference.
    Conviene a questo punto che trasformi le date che hai attualmente, in un formato "timestamp". Una volta trasformate in timestamp potrai effettuare delle normali operazioni matematiche come somma e differenze.
    Usa questa funzione qui sotto per trasformare una data nel formato giorno/mese/anno in timestamp.

    
            function data2Timestamp($data)
            {
                $d = explode("/", $data);
                $giorno = $d[0];
                $mese = $d[1];
                $anno = $d[2];
                
                $timestamp = mktime(0, 0, 0, $mese, $giorno, $anno);
                return $timestamp;
            }
    
    

    Fammi sapere!


  • User Attivo

    @Tarab said:

    Ah! Pensavo che $difference fosse un valore. Allora no, non va bene se gli passi $difference.
    Conviene a questo punto che trasformi le date che hai attualmente, in un formato "timestamp". Una volta trasformate in timestamp potrai effettuare delle normali operazioni matematiche come somma e differenze.
    Usa questa funzione qui sotto per trasformare una data nel formato giorno/mese/anno in timestamp.

    
           function data2Timestamp($data)
           {
               $d = explode("/", $data);
               $giorno = $d[0];
               $mese = $d[1];
               $anno = $d[2];
               
               $timestamp = mktime(0, 0, 0, $mese, $giorno, $anno);
               return $timestamp;
           }
    
    

    Fammi sapere!

    Ma della mia soluzione arzigogolata (ma che funziona!) che ne pensi?
    Grazie!


  • User Attivo

    Ciao,
    purtroppo non ho modo di testarla in questo momento.
    Comunque se dici che funziona allora ok.
    Di sicuro, come ti dicevo, esistono tecniche più valide: spetta a te decidere cosa vuoi. Cioè se ti basta che funzioni allora ok.


  • User Attivo

    @Tarab said:

    Ciao,
    purtroppo non ho modo di testarla in questo momento.
    Comunque se dici che funziona allora ok.
    Di sicuro, come ti dicevo, esistono tecniche più valide: spetta a te decidere cosa vuoi. Cioè se ti basta che funzioni allora ok.

    Ciao!
    Per funzionare funziona ma credo che, conoscendo bene il php, si possa sicuramente fare una cosa pulita... Per ora mi accontento che funzioni ma se fosse anche una cosa lineare sarei anche più contenta 😉