• User Attivo

    Articolo programmato in php

    Salve a tutti,
    ho un sito dove inserisco articoli sempre aggiornati, però spesso capita che non ci sono a casa in giorni importanti per l'inserimento, quindi avrei pensato di fare un articolo programmato che si attivi ad una certa data/ora.

    Ho pensato che quando inserisco l'articolo la data e l'ora viene scelta da me con i dovuti controlli, e viene salvata nella tabella dove è presente l'articolo, però non riesco a capire a livello di database come strutturarlo.

    Quando eseguo la query, come faccio a far capire che determinato articolo lo devo stampare in una certa data/ora ?

    il campo data è un campo varchar e memorizzo così : 23/03/13 14:36:50

    Qualcuno mi aiuta ? grazie


  • User Attivo

    Se è un campo varchar non ci fai nulla lato MySQL, devi farlo leggere al PHP, convertirlo in un'entità temporale e poi ragionare.
    Rappresentare una data ed un ora in un varchar è sbagliato, non puoi consentire al MySQL di riconoscerle in quanto tali e quindi fargli fare i calcoli di confronto.
    Considera di avere tre campi, data_inserimento, data_inizio_pubblicazione e data_fine_pubblicazione tutti e tre di tipo DATETIME.
    La tua query di estrazione è:

    [php]
    <?php
    $adesso = date("Y-m-d H:i:s");
    $sql = "SELECT * FROM articoli WHERE data_inizio_pubblicazione <= '$adesso' AND data_fine_pubblicazione >= '$adesso'";
    ?>
    [/php]


  • User Attivo

    @Francesco Di Caprio said:

    Se è un campo varchar non ci fai nulla lato MySQL, devi farlo leggere al PHP, convertirlo in un'entità temporale e poi ragionare.
    Rappresentare una data ed un ora in un varchar è sbagliato, non puoi consentire al MySQL di riconoscerle in quanto tali e quindi fargli fare i calcoli di confronto.
    Considera di avere tre campi, data_inserimento, data_inizio_pubblicazione e data_fine_pubblicazione tutti e tre di tipo DATETIME.
    La tua query di estrazione è:

    [php]
    <?php
    $adesso = date("Y-m-d H:i:s");
    $sql = "SELECT * FROM articoli WHERE data_inizio_pubblicazione <= '$adesso' AND data_fine_pubblicazione >= '$adesso'";
    ?>
    [/php]

    Scusami io nel db ho 500 articoli salvati con il campo data di tipo varchar cioe cosi : 23/03/13 13:45 volendo cambiare strategia come faccio?

    P.s. se prendo l'articolo dalla query mysql e poi ci faccio il confronto in php? Cioe : se la data del db è uguale alla data di oggi allora esegui.....


  • User Attivo

    Ma la data che hai tu è la data di immissione nel db di quell'articolo. Io ti sto parlando di un nuovo campo, data_inizio_pubblicazione. Visto che devi farlo nuovo, fallo bene, e cioè fallo di tipo DATETIME.
    Se proprio non vuoi convertirlo, devi trasformare con il PHP la data e l'ora in un timestamp e poi confrontarla con il timestamp attuale.

    [php]
    <?php
    $sql = "SELECT * FROM articoli";
    $query = mysql_query($sql);
    $ts_adesso = time();
    while ($articolo = mysql_fetch_object($query)) {
    list($data, $orario) = explode(" ", $articolo->data_inizio_pubblicazione);
    list($giorno, $mese, $anno) = explode("/", $data);
    list($ora, $minuto) = explode(":", $orario);
    $ts_articolo = mktime($ora, $minuto, 0, $mese, $giorno, $anno);
    if ($ts_adesso >= $ts_articolo) {
    // stampa l'articolo
    }
    }
    ?>
    [/php]

    Rimane il fatto che un campo che contiene data ed ora contrassegnato come VARCHAR è una macchia che ti darà problemi con qualsiasi cosa tu voglia fare con quel campo.
    Se vuoi trasformarlo in un DATETIME, i dati in esso contenuti devono avere questo formato: YYYY-MM-DD HH:MM:SS (ovviamente nel tuo caso i secondi saranno sempre 00).


  • User Attivo

    Volendo cambiare il campo varchar che ho io nel db e farlo diventare datetime, come faccio ? non avrò problemi con le query dell'articolo che sn in formato varchar ?


  • User Attivo

    @infosicurezza said:

    Volendo cambiare il campo varchar che ho io nel db e farlo diventare datetime, come faccio ? non avrò problemi con le query dell'articolo che sn in formato varchar ?

    Dipende da come sono fatte le query. In ogni caso ti vorrei far presente ancora una volta che il campo data_inizio_pubblicazione è un nuovo campo, non faccio riferimento al tuo campo pre-esistente.


  • User Attivo

    A questo punto mi conviene aggiungere il campo nuovo come consigliato da te, e modificare leggermente le query aggiungendo un'altra condizione al where.

    P.s. se metto il campo datetime posso salvare la data e l'ora che mi restituisce l'utente ??