Pagina 1 di 2 12 UltimoUltimo
Visualizzazione risultati 1 fino 30 di 42

Discussione: Eliminare record da MySQL dove la data è dell'altro ieri

  1. #1
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito Eliminare record da MySQL dove la data è dell'altro ieri

    Buonasera a tutti,
    ho creato uno script PHP/MySQL che conta le visite giornaliere mostrano le visite unici e totali del giorno e del giorno precedente.
    Ora per non avere troppi record inutili nel database ho deciso di far eliminare automaticamente i record vecchi più di due giorni dal database e per fare questo mi sono voluto servire del campo data ma solo che non so/riesco a farlo. Potete aiutarmi?

    Il punto di codice sino alla quale sono giunto è:
    Codice PHP:
    mysql_query("DELETE FROM visite WHERE data = ’$vecchia_data‘") or die(mysql_error());
    Grazie in Anticipo se serve altro chiedete che posto.
    Apprezzi l'aiuto? Offrimi un caffè!

  2. #2
    Guest

    Predefinito

    Il campo interessato che tipo è?


    Ciao!

  3. #3
    Guest

    Predefinito

    Penso che sia meglio che modifichi in questo modo:
    Codice PHP:
    mysql_query("DELETE FROM visite WHERE (data-172800) > ’$vecchia_data‘") or die(mysql_error());
    dove data è espressa in formato unix
    Ultima modifica di Tecnoman : 22-04-2008 alle ore 21.47.41 Motivo: specifica della data

  4. #4
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    @debug E' un normale Varchar perchè ho deciso che il formato lo inserivo io. E' temporaneamente ho usato la funzione date("j n"); naturalmente se serve la cambio.

    @Tecnoman Non ho capito cosa intendi. Di MySQL capisco solo quanto basta o quanto leggo nei codici che già uso/scarico.
    Apprezzi l'aiuto? Offrimi un caffè!

  5. #5
    Guest

    Predefinito

    Ok, allora dovresti metterci il valore in timestamp, cioè quella che viene fuori con la funzione time() di php.
    time() da solo restituisce la data attuale, quindi se la memorizzi ora, tutti i record avranno la stessa data e ora. Puoi iniziare a fare questa cosa da ora così da sfruttarla tra un paio di giorni.

    In seguito puoi utilizzare il comando usato da Tecnoman, che opera proprio sul conteggio di secondi contenuti in 2 giorni (48 ore).


    Ciaooo!!!

  6. #6
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Scusate ma non ho capito, la funzione time() di php non è la stessa di now() di MySQL?

    Potreste farmi un esempio di codice?
    Apprezzi l'aiuto? Offrimi un caffè!

  7. #7
    Guest

    Predefinito

    Non esattamente.
    NOW() ritorna l'attuale datetime in un formato già usabile (formato americano-anglosassone), invece time restituisce il numero di secondi trascorsi dalla unix epoch (01-01-1970).
    Basta leggere le relative guide ufficiali.

    Quindi, dovresti modificare prima il sistema di memorizzazione (e ingrandire il campo varchar se fosse necessario), poi interrogare il DB come indicato nei post precedenti, con semplici operazioni matematiche.


    Ciao!

  8. #8
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Scusate ma voglio un chiarimento, io ingrandisco e cambio il tipo di campo in MySQL in DATETIME poi salvo in MySQL la data presa con time:
    Codice PHP:
    INSERT INTO visite(data) values(.time().)
    Giusto? E' poi?
    Apprezzi l'aiuto? Offrimi un caffè!

  9. #9
    Guest

    Predefinito

    Sbagliato, non dovevi cambiare il tipo di campo, nè la sua dimensione se non era necessario (un varchar a 100 è più che sufficiente).
    In quel campo ci vai ad inserire la stringa restituita da time() quando devi memorizzare il record.


    Ciaooo!!

  10. #10
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Va beh quindi ricapitolando salvo in varchar da 100 la data restituita da time() di php ma dopo per cancellare tutti i record che hanno la data dell'altro ieri salvando solo i record con la data di oggi e di ieri?

    Cioè l'eliminazione è la cosa che non capisco come fare...
    Apprezzi l'aiuto? Offrimi un caffè!

  11. #11
    Guest

    Predefinito

    Beh, miki, per togliere i record più vecchi di due giorni fai così:

    Codice PHP:
    mysql_query("DELETE FROM visite WHERE data < '".$time()-172800."'") or die(mysql_error());
    Ok?


    Grazie,
    Ciao...

  12. #12
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Niente non va, vi posto il mio intero codice, nella speranza di risolvere il più presto possibile:
    Codice PHP:
    <?php
    // Mi connetto al Database
    mysql_connect("localhost","miki92","mia_password") or die(mysql_error());
    mysql_select_db("my_miki92") or die(mysql_error());

    $ip = mysql_escape_string($_SERVER['REMOTE_ADDR']);
    $data = time();

    $risultato = mysql_query("SELECT * FROM visite WHERE ip='{$ip}' LIMIT 1");
    if (
    mysql_num_rows($risultato)>0) {
    mysql_query("INSERT INTO visite(data_totali) values(\"".$data."\")") or die(mysql_error());
    }else{
    mysql_query("INSERT INTO visite (data_uniche,ip) values(\"".$data."\",\"".$_SERVER['REMOTE_ADDR']."\")") or die(mysql_error());
    }

    // Elimino le vecchie "cose"

    mysql_query("DELETE FROM visite WHERE (data_totali-172800) > ’$data‘") or die(mysql_error());

    ?>
    Ultima modifica di miki92 : 24-04-2008 alle ore 14.32.10
    Apprezzi l'aiuto? Offrimi un caffè!

  13. #13
    Guest

    Predefinito

    E non hai messo la query che ti ho dato io?


    Comunque prova con questo e fammi sapere:

    Codice PHP:
    <?php
    $db
    = mysql_connect("localhost","miki92","tua_password") or die(mysql_error());
    mysql_select_db("my_miki92", $db) or die(mysql_error());

    $ip = $_SERVER['REMOTE_ADDR'];
    $data = time();

    $risultato = mysql_query("SELECT * FROM visite WHERE ip= '".$ip."' LIMIT 1", $db);
    if (
    mysql_num_rows($risultato)>0) {
    mysql_query("INSERT INTO visite(data_totali) values(\"".$data."\")", $db) or die(mysql_error());
    }else{
    mysql_query("INSERT INTO visite (data_uniche,ip) values(\"".$data."\",\"".$_SERVER['REMOTE_ADDR']."\")", $db) or die(mysql_error());
    }

    // Elimino le vecchie "cose"

    mysql_query("DELETE FROM visite WHERE data < '".time()-178200."'", $db) or die(mysql_error());

    ?>

    Fammi sapere...


    Grazie,
    Ciao...
    Ultima modifica di heidi52 : 24-04-2008 alle ore 14.39.52

  14. #14
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Niente, da errore: Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in C:\www\cont.php on line 17
    Comunque se posso chiederti un piacere, se hai un po' di tempo quando modifichi i codici puoi provarli in locale e poi li posti? Naturalmente se non puoi non importa.
    Apprezzi l'aiuto? Offrimi un caffè!

  15. #15
    Guest

    Predefinito

    Beh, prova mettendo la @ davanti a mysql_query, facendo @mysql_query, perché da quanto mi risulta la query non è sbagliata ;)


    Oppure prova così:

    Codice PHP:
    // Elimino le vecchie "cose"

    $duegiorni = $data-172800;

    @
    mysql_query("DELETE FROM visite WHERE data_totali < '".$duegiorni."'", $db) or die(mysql_error());

    Grazie,
    Ciao...
    Ultima modifica di heidi52 : 24-04-2008 alle ore 14.57.53

  16. #16
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Nulla, a te risulta che la query sia giusta ma stranamente è da quanto ho aggiunta quella che ricevo errori, la prima parte è sicuramente OK è la tua query l'errore.

    Tornando a noi, ho usato il codice del post #12 di questo topic e ricevo:
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '��' at line 1
    Apprezzi l'aiuto? Offrimi un caffè!

  17. #17
    Guest

    Predefinito

    Ma scusa miki, il campo che memorizza e cancella i time() si chiama "data"? (da quello che ho capito)

    Sennò sostituisci "data" con il vero nome del campo dove stanno i time(). ;)

    Grazie,
    Ciao...
    Ultima modifica di heidi52 : 24-04-2008 alle ore 15.00.25

  18. #18
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Il nome della tabella è visite, la riga data_uniche e data_totali, ma ho aggiunto anche semplicemente data.
    Apprezzi l'aiuto? Offrimi un caffè!

  19. #19
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Come ti ho detto può chiamarsi data_uniche, data_totali o data.
    Apprezzi l'aiuto? Offrimi un caffè!

  20. #20
    Guest

    Predefinito

    Allora, heidi come al solito distribuisci consigli del tutto sbagliati.
    I problemi non si risolvono omettendo i messaggi di errore (con @).

    L'errore di sintassi era qui:
    ("DELETE FROM visite WHERE data < '".time()-178200."'", $db)

    Sostituiscilo con:
    ("DELETE FROM visite WHERE data < '".(time()-178200)."'", $db)

    poichè il punto dopo un numero risulta essere una virgola.

    Altra cosa riguardo la parola "data": questa è una parola riservata, e il più delle volte, usandola con altri scopi, può creare fastidi e problemi.


    Ciao!

  21. #21
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Ottimo ora gli errori sono finiti ma il codice che uso per estrarre le date è sbagliato perchè ora uso time() di php.
    Come devo contare le visite di oggi e quelle di ieri partendo dagli ex codici?
    Codice PHP:
    $sql = 'SELECT COUNT( * ) AS `Righe` , `data_totali` FROM `visite` WHERE `data_totali` = $dataoggi;
    Apprezzi l'aiuto? Offrimi un caffè!

  22. #22
    Guest

    Predefinito

    Citazione Originalmente inviato da debug Visualizza messaggio
    Allora, heidi come al solito distribuisci consigli del tutto sbagliati.
    I problemi non si risolvono omettendo i messaggi di errore (con @).

    L'errore di sintassi era qui:
    ("DELETE FROM visite WHERE data < '".time()-178200."'", $db)

    Sostituiscilo con:
    ("DELETE FROM visite WHERE data < '".(time()-178200)."'", $db)

    poichè il punto dopo un numero risulta essere una virgola.

    Altra cosa riguardo la parola "data": questa è una parola riservata, e il più delle volte, usandola con altri scopi, può creare fastidi e problemi.


    Ciao!


    Cioè... aspetta...

    se io metto una variabile così:

    Codice PHP:
    $var = time()-172800;
    e poi nella query metto $var mi dà errore?


    Poi non ho capito il fatto della parola "data", cioè sconsigli di usare variabili $data in questo caso?



    Grazie,
    Ciao...

  23. #23
    Guest

    Predefinito

    No, non hai capito entrambe le cose.

    Il punto, in php, vale sia come carattere di concatenazione delle stringhe, sia come separatore decimale (come nel normale sistema anglosassone).

    Quindi scrivere una cosa del genere:

    $var="ciao ".$nome.", come va?";

    è diverso dallo scrivere:

    $var="Ci sono ".10+10." dita totali nel corpo umano";

    perchè una cifra (ma non una variabile contenente una cifra) seguita da un punto equivale a scrivere 10,qualcosa

    Per quanto riguarda la parola "data" è una parola riservata del linguaggio SQL, come "user" e altre, quindi non bisogna usarle per nominare i campi nel database (php non c'entra nulla).


    Ciaooooo!

  24. #24
    Guest

    Predefinito

    Citazione Originalmente inviato da debug Visualizza messaggio
    Il punto, in php, vale sia come carattere di concatenazione delle stringhe, sia come separatore decimale (come nel normale sistema anglosassone).

    Quindi scrivere una cosa del genere:

    $var="ciao ".$nome.", come va?";

    è diverso dallo scrivere:

    $var="Ci sono ".10+10." dita totali nel corpo umano";

    perchè una cifra (ma non una variabile contenente una cifra) seguita da un punto equivale a scrivere 10,qualcosa
    Cioè le parentesi vanno messe per far capire a php che non deve interpretare il punto come la nostra virgola ma come il + di unione stringa?
    Cioè come mi dicesti l'altra volta che nelle stringhe che hanno apertura e chiusura in " si mette il \ prima di " per non farle interpretare come chiusura della stringa?


    Citazione Originalmente inviato da debug Visualizza messaggio
    Per quanto riguarda la parola "data" è una parola riservata del linguaggio SQL, come "user" e altre, quindi non bisogna usarle per nominare i campi nel database (php non c'entra nulla).
    Ah ok questo l'ho capito.



    Grazie,
    Ciao...
    Ultima modifica di heidi52 : 24-04-2008 alle ore 17.21.29

  25. #25
    Guest

    Predefinito

    Sì esatto.


    Ciao!

  26. #26
    Guest

    Predefinito

    Oh, finalmente! Ho capito! Grazie debug per la pazienza e spiegazione


    Ciao...

  27. #27
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Scusate e per il mio problema!?
    Apprezzi l'aiuto? Offrimi un caffè!

  28. #28
    Guest

    Predefinito

    Inanzitutto miki, devi aggiustare le virgolette alla query, così:

    Codice PHP:
    $sql = "SELECT COUNT( * ) AS `Righe` , `data_totali` FROM `visite` WHERE `data_totali` = ".$dataoggi;
    Perché stava il ' di apertura che non stava chiuso, poi dicci che valore è assegnato a $dataoggi.

  29. #29
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Lascia perdere l'errore di virgolette (oltre il fatto che il codice mi è stato generato da phpMyAdmin) io volevo proprio sapere $dataoggi e $dataieri che codice devono avere per identificare solo le visite di oggi e di ieri.
    Apprezzi l'aiuto? Offrimi un caffè!

  30. #30
    Guest

    Predefinito

    Allora, per le visite di oggi, fai questo:

    Codice PHP:
    $sql = "select count ( * ) AS `Righe` , `data_totali` FROM `visite` WHERE `data_totali` > ".(time()-86400);
    Per quello di ieri fai questo:

    Codice PHP:
    $sql = "select count ( * ) AS `Righe` , `data_totali` FROM `visite` WHERE `data_totali` < ".(time()-86400);
    Ovviamente non sono sicuro qui se time()-86400 va tra parentesi, perché prima serviva per non far interpretare come la nostra virgola.


    Grazie,
    Ciao...

Pagina 1 di 2 12 UltimoUltimo

Regole di scrittura

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