Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    MySQL Esperti - Problema campo Timestamp

    Salve a tutti.
    Sto aggiornando un sito vecchio come il cucco e sto riscontrando un problema che non capisco nella tabella delle NOTIZIE.
    La tabella è strutturata come segue.
    codice:
    +------------+-------------+------+-----+---------------------+----------------+
    | Field      | Type        | Null | Key | Default             | Extra          |
    +------------+-------------+------+-----+---------------------+----------------+
    | id         | int(11)     | NO   | PRI | NULL                | auto_increment |
    | data       | timestamp   | NO   |     | 0000-00-00 00:00:00 |                |
    | titolo     | text        | YES  |     | NULL                |                |
    | corpo      | text        | YES  |     | NULL                |                |
    | link       | text        | YES  |     | NULL                |                |
    | foto       | text        | YES  |     | NULL                |                |
    | video      | text        | YES  |     | NULL                |                |
    | visibilita | tinyint(1)  | YES  |     | 0                   |                |
    | autore     | varchar(30) | YES  |     | NULL                |                |
    | evidenza   | tinyint(1)  | YES  |     | 0                   |                |
    | counter    | int(11)     | YES  |     | 0                   |                |
    +------------+-------------+------+-----+---------------------+----------------+
    Nel campo DATA vado ad inserire (dal pannello di amministrazione) la data di pubblicazione della notizia come timestamp.
    Nel front-end la visualizzo invece in un formato più leggibile.

    Nell'ammodernamento del sito, però, ho inserito la seguente query che mi aggiorna la colonna COUNTER e mi permette di vedere quante visualizzazioni ha ogni singola news.
    Nella pagina del front-end, ho il seguente codice PHP per eseguire il conteggio delle visualizzazioni.
    Codice PHP:
    $add_visita "
        UPDATE news
        SET counter = counter + 1
        WHERE id = 
    $id_news
    "
    ;
    mysql_query($add_visita); 
    Ebbene, oggi mi sono accorto che ogni volta che viene visualizzata una notizia, si auto-aggiorna anche il campo data, con il timestamp del momento in cui viene visualizzata la notizia.
    Prima di accorgermi di questa anomalia, il campo data aveva il CURRENT_TIMESTAMP come default, ed è stata la prima modifica che ho eseguito.
    In locale (MySQL 5.x) è bastato fare quello, in remoto (MySQL 4.x) no: il problema è sempre lì pronto per verificarsi.
    Non riesco a capire perché.
    Qualcuno sa spiegarmelo?
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505
    Sulla vecchia tabella come hai aggiornato il default del campo DATA?
    Non a parole, proprio i comandi SQL usati per farlo.

  3. #3
    uhm...... allora.
    Non avevo aggiornato quella colonna, che era già formattata come prevedevo.
    L'avevo modificata aggiungendo CURRENT_TIMESTAMP come default, ma poi ho aggiunto una colonna di data, copiato i valori dalla prima alla seconda colonna e quindi cancellato la prima colonna.
    La colonna di data ha come default 0!
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  4. #4
    UP!.
    Nessuna idea?
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  5. #5
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Da come lo descrivi sembra dovuto all'attributo "ON UPDATE CURRENT_TIMESTAMP", ma nel dump che hai postato non ce n'è traccia.
    Prova a fare un dump della tabella in remoto, ma mi pare che da MySQL 4.1 l'attributo venga aggiunto in automatico:
    http://dev.mysql.com/doc/refman/4.1/en/timestamp.html
    The first TIMESTAMP column in table row automatically is updated to the current timestamp when the value of any other column in the row is changed, unless the TIMESTAMP column explicitly is assigned a value other than NULL.

    If a DEFAULT value is specified for the first TIMESTAMP column when the table is created, it is silently ignored.
    Prova anche ad eseguire:
    codice:
    ALTER TABLE `news` CHANGE `data` `data` TIMESTAMP DEFAULT NULL

  6. #6
    Difatti suppongo che il problema sia quello.
    Nelle prove in locale (con mysql 5) non ho avuto questo problema.... o meglio: mi è bastato togliere l'attributo CURRENT_TIMESTAMP dalla tabella per evitare questo strano comportamento.
    In remoto, invece, continua imperterrito il fenomeno, anche se ho tolto quell'attributo dalla colonna.
    Come faccio a toglierlo?
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  7. #7
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Il manuale dice così:
    Auto-initialization only:

    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ->
    ALTER TABLE `news` CHANGE `data` `data` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    http://dev.mysql.com/doc/refman/4.1/en/timestamp.html

    esegui la query però, non modificare da phpmyadmin

  8. #8
    essenzialmente le cose stanno cosi':

    mysql 4.x, il campo timestamp autoaggiornante e' sempre e solo il primo che fisicamente si trova nell'elenco dei campi della tabella. con un formato variabile nel numero dei digit da mostrare. Alternativa per fissare una data e' modificare il campo in datetime con un "campo = now()" all'inserimento del record.

    mysql 5.x, il campo autoaggiornante puo' essere qualunque di vari campi timestamp della tabella e va esplicitamente dichiarato. Il formato e' ora equiparato al campo datetime. Per cui a scanso di equivoci futuri e' opportuno configurare solo il campo timestamp da aggiornare in caso di variazioni della tupla e configurare come datetime i campi di data/ora che non si devono variare.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    @ Piero:
    Difatti è proprio il comportamento che ho riscontrato.
    Non capisco però perché, in MySQL 4.x, se aggiorno un altro campo della tabella e non la colonna TIMESTAMP, alla fine venga modificata anche questa!
    Ad ogni modo, mi sembra di capire (visto che il campo data è solo uno in quella tabella) che posso crearne uno di tipo TIMESTAMP con NULL come valore di default ed inserirci la data da query al momento della creazione del record, per non avere comportamenti anomali.
    Sbaglio?

    @ Enoa.
    Quello lo avevo già fatto.
    Ma a me serve l'esatto contrario, cioè che non si auto-aggiorni il campo ad ogni modifica del record.

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  10. #10
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Originariamente inviato da alcio74
    @ Enoa.
    Quello lo avevo già fatto.
    Ma a me serve l'esatto contrario, cioè che non si auto-aggiorni il campo ad ogni modifica del record.
    Ti avevo consigliato quella query perché l'attributo che fa l'auto-update del campo quando cambia la tupla lo setti con:
    codice:
    ALTER TABLE `news` CHANGE `data` `data` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    //auto-init e auto-update
    //oppure, ma credo che funzioni solo dalla 5.x
    ALTER TABLE `news` CHANGE `data` `data` TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
    //solo auto-update
    Ma da quello che dice piero.mac, mi pare di capire che la versione 4.1 forza l'auto-update per il primo campo timestamp ignorando quello che specifichi nel create o alter table.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.