Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074

    inserimento duplicato in db

    Incontro uno strano problema - strano soprattutto perchè non si manifesta sempre.
    Ho un sistema di inserimento news, a cui possono accedere gli utenti registrati. Questo sistema, dopo aver raccolto i dati inseriti dall'utente, effettua due operazioni:
    - inserisce i dati nel db
    - invia una mail di avviso all'amministrazione del sito
    Tutto molto semplice. La stranezza è che, alcune volte - solo alcune!, e sempre quando ad inserire le news sono utenti, mai quando lo faccio io - la news viene inserita più volte (in genere, due volte, ma in alcuni casi anche tre o quattro volte!). Inoltre, è successo in almeno un caso, la news viene aggiunta una volta ma vengono inviati due messaggi di avviso.
    Questo è il codice che uso per queste due funzioni:
    Codice PHP:
    <?PHP
        
    if ($tag != "null" && $title != "" && $text != "" && $geo != "null" && $kind != "null") {
    // controllo che i campi richiesti non siano vuoti
    $query1 = ("INSERT INTO `news` (`date`, `tag`, `title`, `text`, `location`, `kind`, `deadline`, `email`, `link`, `start`, `thumb`, `img`) VALUES ('$today', '$tag', '$title', '$text', '$geo', '$kind', '$deadline', '$email', '$link', '$start', '$thmb_name', '$img_name')");
    $result1 mysql_query($query1)
        or die(
    "Query failed 1");
    // inserisco i dati nel db
        
    $result0 mysql_query("SELECT * FROM `news` WHERE `title` = '$title'");
        while (
    $row0 mysql_fetch_array($result0)) {
        
    $tmp $row0["news_id"];                
    // prelevo l'ID della news - mi servirà più avanti per altre ragioni...
        
    $result3 mysql_query("SELECT * FROM `coll` WHERE `name` = '$name'");
        while (
    $row3 mysql_fetch_array($result3)) {
        
    $usermail $row3["email"];
        }
    // prelevo la mail dell'utente che ha inserito la news
        
    $tosend "info@shavis.com";
        
    $oggetto "Submitted news";
        
    $strMessage "Alert: " $name " (Email: " $usermail ") ha inserito una nuova news: (" $title ").\nControllare...\n\nShaVis.com database system\n";
        
    $flag_success mail("$tosend""$oggetto""$strMessage""From: $usermail");
        if (!
    $flag_success) {
        }
    // invio la mail di avviso
    }
    ?>
    Perchè succedono queste stranezze?
    I dati vengono inseriti in un'altra pagina, e passati a questa via POST.
    Qualche idea in merito?
    metatad
    graphic & web design

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209
    Molto probabilmente gli utenti devono premere il pulsante indietro del browser o F5 a causa della mancanza di feedback. Se il motivo è questo devi rivedere la tua UI.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    No, no... il feedback c'è. Certo, se tornano indietro per fare delle modifiche ai dati inseriti... forse, dovrei inserire un controllo, del tipo:
    se $title esiste già nel db, e la data di inserimento è oggi, invece di inserire i dati come nuova news, faccio un update... però, se cambiano proprio il titolo?...
    Insomma, è un pò un problema...
    Come potrei risolvere?

    metatad
    graphic & web design

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209
    la tendenza degli sviluppatori è creare un ambiente MVC per questo tipo di operazioni, in modo di sapere qual'è l'azione richiesta. Nel tuo caso potresti passare un input hidden con il tipo di operazione.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    Scusa, non ho capito che intendi...
    Il meccanismo è questo:
    - pagina A | inserimento dati nel form
    - pagina B | ricezione dati via POST ed inserimento nel db
    Se, come suggerisci tu giustamente, gli inserimenti multipli possono essere dovuti al fatto che gli utenti, arrivati alla pagina B (dove, via AJAX, hanno una preview della news formattata), tornano indietro alla pagina A, e quindi poi reinviano i dati alla pagina B, se - ad es. - con un campo hidden passo un valore X dalla pagina A alla pagina B, cosa me ne faccio se l'utente usa il pulsante back del browser per andare indietro?
    Se voglio dare all'utente la possibilità della preview, devo registrare i dati nel db. Certo, potrei mettere un link back, che passi ad esempio l'id della news appena inserita, così se l'utente fa delle modifiche e poi rinvia i dati, passo anche questo valore e poi nella pagina B riconosco la news come esistente e faccio l'update invece dell'insert. Ma se usa il pulsante back del browser?
    E comunque, a parte il fatto che mi sembra strano che un utente torni indietro 3 volte senza fare alcuna modifica (caso reale), almeno in un caso un utente mi ha inviato un messaggio proprio per dirmi "l'ho inserita una volta, è apparsa due".
    Dunque, per quanto la tua ipotesi sia possibile (ed in quanto tale, da prevedere comunque), ho l'impressione che il problema stia altrove...
    metatad
    graphic & web design

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    209
    Hai ragione, prova a fare dei controlli comunque, me lo invento al momento, verifichi che in sessione ci sia un md5 che una volta inserita la news viene eliminato e quindi se qualcuno pigia indietro vengono ripassati i dati tra cui questo md5 non più confrontabile.

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.