Visualizzazione risultati 1 fino 13 di 13

Discussione: problema incompatibilità data

  1. #1
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito problema incompatibilità data

    Salve a tutti.
    Come da oggetto mi trovo alle prese con la data.
    In poche parole, ho un form con la richiesta della data. Una volta inserito il dato, devo visualizzare i dati di quel giorno.
    Il problema è che nel database la data è in formato americano e quindi non riesco ad estrarre niente.

    Avevo provato così, ma non funziona:
    $miadata = $_POST['miadata'];

    // converte la data inserita in formato americano per l'interrogazione sul db
    function conv_date ($miadata)
    {
    list ($d, $m, $y) = explode ("-", $miadata);
    return "$y/$m/$d";
    }

    // qui visualizza la data richiesta nel formato italiano. (Quindi probabilmente non la converte).
    echo '<div align="center"><h1>Visitatori del <b>' . $miadata . '</b></h1></div>';

    // qui dovrebbe invece selezionare i dati del giorno richiesto, ma non succede. Non visualizza nessun dato.
    $RI=mysql_query("SELECT cognome, nome, tipoDoc, nDoc, rilasciato, ora_e, ora_u FROM SalaStudio, elenco WHERE id_SalaStudio=SalaStudio and data_odierna = $miadata()");

    }

    Qualche suggerimento ? Grazie come sempre a tutti.

  2. #2
    zyro non è connesso Utente
    Data registrazione
    08-05-2010
    Messaggi
    105

    Predefinito

    Così come l'hai scritto non ti darà nessun risultato.

    Se non ho capito male la prima cosa che fai è salvare i dati, quindi convertiamo subito la data in formato americano:

    Codice PHP:
    $a=mktime(0,0,0,$_POST['miadata']); // richiama la data
    $dataEng=date('Y-m-d', $a); // con questa funzione esportiamo la data nel formato corretto per il database
    quindi aggiungi $dataEng al database. Questo passaggio è concluso.

    Ora passiamo alla visualizzazione:

    Codice PHP:
    $RI=mysql_query("SELECT cognome, nome, tipoDoc, nDoc, rilasciato, ora_e, ora_u FROM SalaStudio, elenco WHERE id_SalaStudio=SalaStudio and data_odierna = ".$dataEng.""); // ricordati che nel db è salvata la data in formato americano, devi usare lo stesso formato per la condizione

    // adesso convertiamo di nuovo la data in formato italiano

    $data1 = explode("-", $dataEng); // con explode creiamo un array dei dati
    $dataIta = $data1[2]."-".$data1[1]."-".$data1[0]; // e adesso li risistemiamo nell'ordine che vogliamo, 0=anno, 1=mese, 2=giorno
    Ora puoi inserire i dati richiamati.

    EDIT: ho aggiustato una porzione di codice che non aveva salvato quando ho pubblicato
    Ultima modifica di zyro : 30-07-2014 alle ore 14.26.19

  3. #3
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Grazie per la risposta. I dati però vengono già salvati in automatico nel db nel formato americano.
    Cioè senza che debba far niente.
    Il problema adesso è che voglio dare la possibilità agli utenti di scegliere una data per la ricerca delle informazioni.
    Ovviamente l'utente inserisce la data nel formato italiano, per cui non viene trovata nel database.
    La mia difficoltà è qui. Data in formato americano nel db e form di ricerca per data nel formato italiano.

    Per questo avevo pensato di convertire la data recuperata dal form:
    $miadata = $_POST['miadata'];
    nel formato americano, per fare poi la ricerca sul db.

    Però la tecnica usata non funziona. Ci dev'essere un errore nella conversione.

    Ciao e grazie per la pazienza

  4. #4
    zyro non è connesso Utente
    Data registrazione
    08-05-2010
    Messaggi
    105

    Predefinito

    La procedura è esattamente quella che ti ho postato.

    Col primo codice converti la data da italiano ad americano, poi interroghi il database usando la variabile $dataEng come ho scritto nel secondo codice.

  5. #5
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Ok, 1000 grazie. Ero io che non avevo capito.
    Ho ricopiato il tuo codice, ma stranamente non funziona. O meglio funziona, ma scrive una data non corretta.
    Verifica con la riga di controllo del giorno:
    Codice:
    echo '<div align="center"><h1>Visitatori del <b>' . $dataEng .  '</b></h1></div>';
    echo '<div align="center"><h1>Visitatori Italiana del <b>' . $dataIta . '</b></h1></div>';

    Ho provato nel form a mettere ad esempio il 28-07-2014 e mi viene fuori il 2016-05-01 e in Italiano 01-05-2016
    Cambiando di un giorno la data nel form la risposta non ci azzecca neanche con quella precedente.
    Data interrogazione 27/07/2014 risultato a vide, data inglese 2016-03-31 e in italiano 31-03-2016
    altra prova 25-7-14 viene fuori 2016-01-31, in ITA 31-01-2016
    Quindi sposta le cifre della data, ma le altera in maniera strana.
    Da cosa può dipendere ?

  6. #6
    zyro non è connesso Utente
    Data registrazione
    08-05-2010
    Messaggi
    105

    Predefinito

    Dipende dal formato con cui arriva $_POST['miadata']

    In che modo fai scegliere la data all'utente? Puoi postare il codice relativo alla data nel form?

    Se fai scrivere a mano la data dovresti aggiungere un filtro che interpreti il modo in cui viene scritta e vagliare tutte le possibilità, ma io personalmente ti consiglio più facilmente di aggiungere delle select al form con giorno, mese e anno in modo che non possa sbagliare formato.

    Se non hai capito ciò che intendo posta il codice del form

  7. #7
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Penso di aver capito cosa intendi, ma ti mostro il form di partenza. Molto esenziale.
    Magari l'errore è una banalità. Grazie

    Codice:
     
    <form action="riepilogo.php" method="POST">
     		 <label>Scrivi la data desiderata
       		 <input type="datetime" name="miadata">
     		 </label>
     		 <input type="submit" value="Invia">
    			</form></div>

  8. #8
    zyro non è connesso Utente
    Data registrazione
    08-05-2010
    Messaggi
    105

    Predefinito

    Citazione Originalmente inviato da portier Visualizza messaggio
    Penso di aver capito cosa intendi, ma ti mostro il form di partenza. Molto esenziale.
    Magari l'errore è una banalità. Grazie

    Codice:
     
    <form action="riepilogo.php" method="POST">
     		 <label>Scrivi la data desiderata
       		 <input type="datetime" name="miadata">
     		 </label>
     		 <input type="submit" value="Invia">
    			</form></div>
    Come previsto il problema è esattamente nel formato con cui viene passata la data.
    Se non ricordo male datetime passa i valori in quest'ordine: Y-d-m.

    Come prima cosa devi "distruggere" quel formato usando explode per eliminare i trattini, poi ti puoi gestire l'array risultante e convertirlo come più ti piace, nel tuo caso nella versione puramente americana del DB:

    Codice PHP:
    $Arraymiadata = explode("-", $miadata); // dividiamo questo brutto formato
    $dataEng = $Arraymiadata[0]."-".$Arraymiadata[2]."-".$Arraymiadata[1]; // ricomponiamolo come chiede il DB
    Ora hai $dataEng da usare come ti ho mostrato prima, lo richiami nel where della select e lo puoi riconvertire con la stessa formula in italiano.

    Comunque ti do un mio parere: per quanto datetime sia molto più elegante graficamente e in linea con i canoni dell'html5, tieni presente che a oggi sono ancora pochi i browser che lo supportano (di quelli grandi mi pare solo Opera e Safari). Se qualcuno visita la pagina che stai costruendo con altri browser vedrà solo un campo di input di tipo text e in quel caso se non saprà di dover inserire la data nel formato richiesto non avrà mai i risultati desiderati.
    TIeni anche in mente che datetime implementa anche l'ora, se non hai bisogno di questa precisione usa solo l'input date che almeno è supportato anche da chrome.
    In ogni caso torno a suggerirti le select se vuoi evitarti ogni pensiero ;)

  9. #9
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Ciao, grazie ancora per i suggerimenti.
    Ancora non mi funziona correttamente.
    Ho messo il tuo ultimo codice prima, così:

    Codice PHP:
    $Arraymiadata = explode("-", $miadata); // dividiamo questo brutto formato
    $dataEng = $Arraymiadata[0]."-".$Arraymiadata[2]."-".$Arraymiadata[1]; // ricomponiamolo come chiede il DB

    echo '<div align="center"><h1>Visitatori del <b>' . $dataEng . '</b></h1></div>';

    $RI=mysql_query("SELECT cognome, nome, tipoDoc, nDoc, rilasciato, ora_e, ora_u FROM SalaStudio, elenco WHERE id_SalaStudio=SalaStudio and data_odierna = ".$dataEng.""); // ricordati che nel db è salvata la data in formato americano, devi usare lo stesso formato per la condizione

    // adesso convertiamo di nuovo la data in formato italiano

    $data1 = explode("-", $dataEng); // con explode creiamo un array dei dati
    $dataIta = $data1[2]."-".$data1[1]."-".$data1[0]; // e adesso li risistemiamo nell'ordine che vogliamo, 0=anno, 1=mese, 2=giorno

    echo '<div align="center"><h1>Visitatori (data Italianizzata) del <b>' . $dataIta . '</b></h1></div>';
    Oppure se hai pazienza e non ti disturbo troppo, mi manderesti un esempio come mi indicavi usando il select ?
    Ti ringrazio veramente molto
    Ultima modifica di portier : 01-08-2014 alle ore 06.58.35

  10. #10
    zyro non è connesso Utente
    Data registrazione
    08-05-2010
    Messaggi
    105

    Predefinito

    A che ti serve scrivere a video la data in inglese per il titolo e poi in italiano nel div successivo?

    Almeno la variabile $dataIta è uguale a quella che richiami dal form?

    Più tardi se riesco ti posto un esempio della select con convalidazione, ciao.

  11. #11
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Ok grazie.
    In effetti non mi serve avere la data nei due formati a video.
    Lo faccio solo per verificare il risultato, poi ovviamenete lascerò solo la modalità in italiano.
    Così ho visto che la data, una volta convertita nel formato americano, poi viene riconvertita nel formato italiano, ma con i dati alterati.
    Cioè come vengono estrapolati dal convertitore. Quindi la variabile $dataIta non è uguale a quella del form.
    Ti avevo messo l'esempio che ottenevo nei precedenti messaggi. Te lo rimetto.

    Se inserisco ad esempio nel form questa data= 28-07-2014, nella stampa a video di $dataEng mi viene fuori il 2016-05-01 e per la versione in italiano, $dataIta= 01-05-2016. Come vedi funziona il posizionamento delle cifre, ma risulta un altra data da quella di partenza.


    Non avevo però specificato che con il tuo ultimo esempio non ottengo nessun risultato.
    Codice PHP:
    $Arraymiadata = explode("-", $miadata); // dividiamo questo brutto formato
    $dataEng = $Arraymiadata[0]."-".$Arraymiadata[2]."-".$Arraymiadata[1]; // ricomponiamolo come chiede il DB
    Cioè non viene visualizzata nessuna data. Ciao
    Ultima modifica di portier : 01-08-2014 alle ore 18.26.55

  12. #12
    zyro non è connesso Utente
    Data registrazione
    08-05-2010
    Messaggi
    105

    Predefinito

    Forse ricordo male io e datetime riporta i valori direttamente in timestamp, ma non ho purtroppo modo di verificarlo non avendo attualmente installati ne Opera ne Safari.

    In ogni caso come promesso ti passo il codice con le select, un po' più grezzo e con più script, ma compatibile con ogni browser e versione degli stessi

    Questo il form
    Codice HTML:
    <form>
    ...
        <select name="d" id="d">
            <option value=""></option>
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            <option value="6">6</option>
            <option value="7">7</option>
            <option value="8">8</option>
            <option value="9">9</option>
            <option value="10">10</option>
            <option value="11">11</option>
            <option value="12">12</option>
            <option value="13">13</option>
            <option value="14">14</option>
            <option value="15">15</option>
            <option value="16">16</option>
            <option value="17">17</option>
            <option value="18">18</option>
            <option value="19">19</option>
            <option value="20">20</option>
            <option value="21">21</option>
            <option value="22">22</option>
            <option value="23">23</option>
            <option value="24">24</option>
            <option value="25">25</option>
            <option value="26">26</option>
            <option value="27">27</option>
            <option value="28">28</option>
            <option value="29">29</option>
            <option value="30">30</option>
            <option value="31">31</option>
        </select>
        <select name="m" id="m">
            <option value=""></option>
            <option value="1">gen</option>
            <option value="2">feb</option>
            <option value="3">mar</option>
            <option value="4">apr</option>
            <option value="5">mag</option>
            <option value="6">giu</option>
            <option value="7">lug</option>
            <option value="8">ago</option>
            <option value="9">set</option>
            <option value="10">ott</option>
            <option value="11">nov</option>
            <option value="12">dic</option>
        </select>
        <select name="y" id="y">
            <option value=""></option>
            <option value="2012">2012</option>
            <option value="2013">2013</option>
            <option value="2014">2014</option>
    <!-- puoi anche usare un ciclo per estrarre almeno gli anni dal database se ti serve per una ricerca -->
        </select>
    ...
    </form>
    Poi passi il tutto al php

    Codice PHP:
    $d=$_POST['d']; // giorno
    $m=$_POST['m']; // mese
    $y=$_POST['y']; // anno

    $timestamp=mktime(0,0,0,$m,$d,$y);
    $dataEng=date('Y-m-d', $timestamp); // questa è la data per il database nel formato aaaa-mm-gg

    // interroga ilo database con la data inglese
    $RI=mysql_query("SELECT cognome, nome, tipoDoc, nDoc, rilasciato, ora_e, ora_u FROM SalaStudio, elenco
    WHERE id_SalaStudio=SalaStudio and data_odierna = "
    .$dataEng."");

    // adesso non ti serve neanche la seconda parte di codice, ti basta solo questa riga di comando per avere la data in italiano
    $dataEng=date('d-m-Y', $timestamp);

    // da questo punto in poi puoi richiamare i risultati
    Se non fai errori dovrebbe funzionare tutto, è esattamente lo stesso codice che uso io, ciao

  13. #13
    portier non è connesso Utente
    Data registrazione
    07-06-2014
    Messaggi
    127

    Predefinito

    Ok. Grazie mille. Ciao e buona domenica

Regole di scrittura

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