Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746

    [mysql] INSERT indesiderato

    Ho una tabella così composta:
    codice:
    CREATE TABLE storico_messaggi_personali (
    id_storico_messaggi_personali INT UNSIGNED NOT NULL AUTO_INCREMENT primary key,
    id_utente INT UNSIGNED,
    timestamp_eliminazione TIMESTAMP,
    messaggio_registrato TEXT
    )
    e ci inserisco i dati con questa query:
    codice:
    $inserimento_messaggio = mysql_query("
    
    INSERT 
    
    INTO storico_messaggi_personali(
         id_utente,
         messaggio_registrato
         )
    
    VALUES(
        '$id_utente',
        '$estratto'
        )
    
    ",$connessione_db) or die(mysql_error());
    il tutto fa parte di un servizio di messaggistica e quando si cancella un messaggio, i dati ad esso corrispondenti vengono prima salvati con questa query.

    il problema è ke avviene un indesiderato inserimento multiplo, il primo contiene correttamente anke i dati del messaggio da eliminare estratti in precedenza, mentre gli altri (1 o 2) senza i dati. :master:
    Errare humanum est, perseverare ovest

  2. #2
    la query e' quella... una sola.

    Bisognerebbe vedere il contesto in cui si ripete.

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

  3. #3
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    il contesto è +o- questo:
    se hai voglia di darci un occhiata


    Codice PHP:
    <?php


    include ("../../../../xxx/connessione_db.php");
    include (
    "../../../servizi/radice.php");
    include (
    "../../../servizi/funzioni.php");

    $messaggio "Si è verificato un errore imprevisto.";
    $control_script "no";

    // variabili in ingresso

    if (empty($_GET['id_messaggio_condiviso'])) $id_messaggio_condiviso "" ;
    else 
    $id_messaggio_condiviso $_GET['id_messaggio_condiviso'] ;

    if (empty(
    $_GET['area_condivisa'])) $area_condivisa "" ;
    else 
    $area_condivisa $_GET['area_condivisa'] ;

    if (empty(
    $_GET['aiuto'])) $aiuto "" ;
    else 
    $aiuto $_GET['aiuto'] ;

    if (empty(
    $_GET['id_messaggio_bacheca']))

    $id_messaggio_bacheca ;
    $control_script "no";
    $messaggio "Il messaggio NON può essere eliminato causa mancanza di parametri essenziali.";
    } else {

    $id_messaggio_bacheca $_GET['id_messaggio_bacheca'] ;
    $control_script "si";


    /////////////////////////////////////////////////////
    //
    // inserimento nello storico
    //
    ////////////////////////////////////////////////////


    //  ESTRAZIONE MESSAGGIO BACHECA DA DATABASE

    $estratto_messaggio "" ;

    // formattazione data di eliminazione
    $data_eliminazione date("d/m/Y H:i:s") ;


    $selezione_messaggio_bacheca mysql_query("
    SELECT titolo,data_orario_inserimento,data_orario_modifica
    FROM   pmc_bacheca_messaggi
    WHERE id_mittente = '
    $id_utente'
    AND   id_messaggio_bacheca = '
    $id_messaggio_bacheca'
    AND   visibile = 'SI'
    LIMIT 1
    "
    ,$connessione_db) or die(mysql_error());

    $riga_messaggio mysql_fetch_array $selezione_messaggio_bacheca ) ;

    if (empty(
    $riga_messaggio['titolo'])) $titolo "senza titolo";
    else 
    $titolo $riga_messaggio['titolo'];

    if (empty(
    $riga_messaggio['data_orario_inserimento']) or $riga_messaggio['data_orario_inserimento'] == "0000-00-00 00:00:00" ) {
    $data_orario_inserimento "???";
    } else {
    $data_orario_inserimento $riga_messaggio['data_orario_inserimento'];
    $data_orario_inserimento converti_datetime_07($data_orario_inserimento);
    }

    if (empty(
    $riga_messaggio['data_orario_modifica']) or $riga_messaggio['data_orario_modifica'] == "0000-00-00 00:00:00" ) {
    $data_orario_modifica "";
    } else {
    $data_orario_modifica $riga_messaggio['data_orario_modifica'];
    $data_orario_modifica converti_datetime_07($data_orario_modifica);
    }

    $estratto_messaggio "[b]<u>".$titolo."</u>[/b]
    [b] eliminato:[/b]"
    .$data_eliminazione."[b] creato:[/b]".$data_orario_inserimento ;
    if (!empty(
    $data_orario_modifica)) $estratto_messaggio $estratto_messaggio."[b] modificato:[/b]".$data_orario_modifica ;




    /////////////////// LISTA FILE ALLEGATI ////////////////////////

    $nomi_file = array();
    $estratto_allegati "" ;
    $quanti_file ;

    $default_dir =  $_SERVER["DOCUMENT_ROOT"].$radice_allegati;
    if (!(
    $dp opendir($default_dir))) die ("Non si può aprire la directory $default_dir.");
    while(
    $file readdir($dp)) {
    if (
    $file != '.' && $file != '..' && eregi("^(\[\[$id_messaggio_bacheca\]\])",$file)) {
    $file_server $_SERVER['DOCUMENT_ROOT'].$radice_allegati."/".$file;
    $nome_pulito eregi_replace("^(\[\[$id_messaggio_bacheca\]\])","",$file);
    $nomi_file[] = $nome_pulito ;
    }}
    closedir($dp);
    $quanti_file count($nomi_file) ;

    if ( 
    $quanti_file ) {
    $estratto_allegati implode" ::: " $nomi_file ) ;
    $estratto_allegati "
    [b]allegati:[/b]"
    .$estratto_allegati ;
    }



    //  ESTRAZIONE DESTINATARI ASSOCIATI DA DATABASE

    $username_destinatari = array();
    $quanti_destinatari ;
    $estratto_destinatari "" ;

    $selezione_destinatari_associati mysql_query("
    SELECT username,
           pmc_bacheca_destinatari.data_orario_inserimento,
           data_orario_ricezione
    FROM   pmc_utenti
    INNER JOIN  pmc_bacheca_destinatari
    ON pmc_utenti.id_utente = pmc_bacheca_destinatari.id_destinatario
    WHERE  pmc_bacheca_destinatari.id_messaggio_bacheca='
    $id_messaggio_bacheca'
    ORDER BY username
    "
    ,$connessione_db) or die(mysql_error());

    $numero_destinatari_associati_selezionati mysql_num_rows($selezione_destinatari_associati);
    if (empty(
    $numero_destinatari_associati_selezionati)) $numero_destinatari_associati_selezionati ;
    if ( 
    $numero_destinatari_associati_selezionati ) {

    $estratto_destinatari "
    [b]destinatari:[/b]" 
    ;

    while (
    $riga_destinatari_associati mysql_fetch_array $selezione_destinatari_associati ) )
    {
    if (empty(
    $riga_destinatari_associati['username'])) $username_destinatario_associato "anonimo" ;
    else 
    $username_destinatario_associato $riga_destinatari_associati['username'];

    if (empty(
    $riga_destinatari_associati['data_orario_inserimento'])) $data_orario_inserimento "0000-00-00 00:00:00" ;
    else 
    $data_orario_inserimento $riga_destinatari_associati['data_orario_inserimento'];
    if ( 
    $data_orario_inserimento == "0000-00-00 00:00:00" $data_orario_inserimento "indefinito" ;
    else 
    $data_orario_inserimento converti_datetime_07($data_orario_inserimento) ;

    if (empty(
    $riga_destinatari_associati['data_orario_ricezione'])) $data_orario_ricezione "0000-00-00 00:00:00" ;
    else 
    $data_orario_ricezione $riga_destinatari_associati['data_orario_ricezione'];
    if ( 
    $data_orario_ricezione == "0000-00-00 00:00:00" $data_orario_ricezione "no" ;
    else 
    $data_orario_ricezione converti_datetime_07($data_orario_ricezione) ;

    $estratto_destinatari $estratto_destinatari." ::: ".$username_destinatario_associato."(inserito:[i]".$data_orario_inserimento."[/i] ricevuto:[i]".$data_orario_ricezione."[/i])" ;

    }
    }


    // creazione dell'estratto da inserire nello storico

    $estratto $estratto_messaggio ;
    if (!empty(
    $estratto_allegati)) $estratto $estratto.$estratto_allegati ;
    if (!empty(
    $estratto_destinatari)) $estratto $estratto.$estratto_destinatari ;

    $inserimento_messaggio mysql_query("

    INSERT 

    INTO pmc_storico_messaggi_personali(
         id_utente,
         messaggio_registrato
         )

    VALUES(
        '
    $id_utente',
        '
    $estratto'
        )

    "
    ,$connessione_db) or die(mysql_error());



    // eliminazione associazioni destinatari 

    $elimina_associazioni mysql_query("
    DELETE
    FROM   pmc_bacheca_destinatari
    WHERE  id_messaggio_bacheca = '
    $id_messaggio_bacheca'
    "
    ,$connessione_db);



    // eliminazione allegati

    $default_dir =  $_SERVER["DOCUMENT_ROOT"].$radice_allegati;
    if (!(
    $dp opendir($default_dir))) die ("Non si può aprire la directory $default_dir. Verificarne l'esistenza.");
    while(
    $file readdir($dp)) {
    if (
    $file != '.' && $file != '..' && eregi("^(\[\[$id_messaggio_bacheca\]\])",$file)) {
    $file_server $_SERVER['DOCUMENT_ROOT'].$radice_allegati."/".$file ;
    if (
    file_exists($file_server)) unlink($file_server) ;
    }}
    closedir($dp);



    // eliminazione messaggio

    $elimina_messaggio "
    DELETE
    FROM   pmc_bacheca_messaggi
    WHERE  id_messaggio_bacheca = '
    $id_messaggio_bacheca'
    LIMIT 1
    "
    ;

    if (
    mysql_query($elimina_messaggio,$connessione_db)) {
    $messaggio "Il messaggio è stato eliminato." ;
    $control_script "si" ;
    } else {
    $messaggio "Il messaggio non è stato eliminato per un errore del database." ;
    $control_script "no" ;
    }


    // fine else empty($_POST['id_messaggio_bacheca'])



    //////////////////////////////////////////////
    //
    //  PAGINA HTML
    //
    //////////////////////////////////////////////



    if ( $control_script == "si" ) { 
    $sfondo_messaggio "sfondo_tabella_testo_servizio.gif" ;
    $pulsante_form "avanti" ;
    $return "messaggi" ;
    } else {
    $sfondo_messaggio "sfondo_tabella_avviso_servizio.gif" ;
    $pulsante_form "annulla" ;
    $return "visualizza" ;
    }


    echo 
    "
    <html>
    <head>
    <title>eliminazione messaggio bacheca</title>
    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../../stili/stili_servizio.css\">

    </head>
    <body scroll=\"no\">
    <table border=\"0\" width=\"100%\" height=\"100%\" cellpadding=\"0\" cellspacing=\"0\">
    <tr><td align=\"center\" valign=\"middle\">
    "
    ;


    echo 
    "
    <form action=\"../../index.php\" method=\"POST\">
    <input type=\"hidden\" name=\"pagina\" value=\"bacheca\">
    <input type=\"hidden\" name=\"area_personale\" value=\"
    $return\">
    <input type=\"hidden\" name=\"id_messaggio_bacheca\" value=\"
    $id_messaggio_bacheca\">
    <input type=\"hidden\" name=\"id_messaggio_condiviso\" value=\"
    $id_messaggio_condiviso\">
    <input type=\"hidden\" name=\"aiuto\" value=\"
    $aiuto\">
    <input type=\"hidden\" name=\"area_condivisa\" value=\"
    $area_condivisa\">

    <table align=\"center\" border=\"0\" cellpadding=\"10\" cellspacing=\"0\">
    <tr><td align=\"center\" background=\"../../../grafica/
    $sfondo_messaggio\">
    <span id=\"testo_bianco\">
    $messaggio<span>



    <input type=\"submit\" value=\"
    $pulsante_form\"
    onmouseover=\"document.all.music.src='../../../suoni/link_menu_principale.wav';\"
    >
    </td></tr></table>

    </form>
    "
    ;


    echo 
    "
    </td></tr></table>
    <bgsound src=\"#\" id=\"music\" loop=\"1\" autostart=\"true\">
    </body></html>"
    ;


    $connessione_db mysql_close();

    ?>
    Errare humanum est, perseverare ovest

  4. #4
    Domanda:

    ma la pagina invia il form a se stessa?

    Se si perche' da una parte spedisci hidden via post e dall'altra prelevi con get?

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

  5. #5
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    no, non invia a se stessa le variabili arrivano tramite GET e poi ripartono via POST. non mi ricordo mica xkè ho fatto così.

    comunque il tutto funzionava a meraviglia prima di aggiungere quell'INSERT
    Errare humanum est, perseverare ovest

  6. #6
    Se l'inserimento avviene piu' volte questo potrebbe essere dovuto ad un ciclo oppure al richiamo della pagina per cancellare lo stesso del precedente.

    Lo script non e' semplicissimo da valutare, specie qui dove viene spezzato a causa della mancanza di spazi nello script. Bisognerebbe metterlo in un editor e sistemarlo.

    Vedo pero' che se mancano i dati da inserire tu forzi un qualcos'altro...
    codice:
    // creazione dell'estratto da inserire nello storico
    
    $estratto = $estratto_messaggio ;
    if (!empty($estratto_allegati)) $estratto = $estratto.$estratto_allegati ;
    if (!empty($estratto_destinatari)) $estratto = $estratto.$estratto_destinatari ;
    Potrebbe essere qui il nocciolo in caso di reiterazione dello script.

    Provo a caricare il tuo script su un editor, ma senza garanzie....


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

  7. #7
    L'insert non fa parte di un ciclo, ma evidentemente la pagina viene reiterata. Su editor si vede meglio... Poiche' deve inserire dei dati che sono stati estratti e che verranno cancellati farei una cosa forse semplicistica.... In caso che le variabili da inserire siano vuote, skippare l'insert.

    Dove lo prendi $id_utente?? Non vedo l'origine del dato.

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

  8. #8
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    tranquillo, capisco la complessità del dover analizzare questo scipt e non pretendo nessuna garanzia

    comunque lo script viene eseguito una sola volta e l'INSERT non rientra in alcun ciclo

    l'errore si è presentato con l'introduzione del campo TIMESTAMP che dovrei utilizzare per cancellare automaticamente i record dopo un certo intervallo temporale

    mi da la sensazione come se mysql combinasse il guaio da sè, ma proprio non saprei.

    sono fuso, buonanotte
    Errare humanum est, perseverare ovest

  9. #9
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    $id_utente arriva da controllo sugli utenti loggati che non ho incollato, comunque c'è
    Errare humanum est, perseverare ovest

  10. #10
    Originariamente inviato da carlo2002
    l'errore si è presentato con l'introduzione del campo TIMESTAMP che dovrei utilizzare per cancellare automaticamente i record dopo un certo intervallo temporale

    mi da la sensazione come se mysql combinasse il guaio da sè, ma proprio non saprei.

    sono fuso, buonanotte
    Non ho seguito bene il discorso della data/ora, ma il formato di data che utilizza il timestamp (mysql, non UNIX) e' diverso nelle versioni 4.0 e 4.1. Nella 4.1 e' come cerchi tu: yyyy-mm-dd hh:mm:ss
    mentre nella 4.0 e': yyyymmddhhmmss

    Di fatto lo script viene ripetuto piu' volte. Alcune volte senza dati oppure con gli stessi dati gia' eliminati in precedenza. Non vedo un controllo su questo.


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

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.