Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    19

    Problema con query che duplica le righe

    Buonasera a tutto il forum.
    Ho cercato nei vari post e in giro per la rete senza trovare niente di simile.
    Sicuramente la mia poca dimestichezza con php mi porta a sbagliare...

    Ho una query che prende i dati da un form e li scrive in una tabella all'interno di un database Mysql.

    I dati ricavati dal form sono contenuti in 3 array. Ciascuno di essi contiene lo stesso numero di elementi.

    Un po' di codice:

    Codice PHP:
    for ($k=0$kcount($array1); $k++)
         {     
           
    $query_ "INSERT INTO tabella (Campo1,Campo2,Campo3)
                               VALUES ('
    $array1[$k]','$array2[$k]','$array3[$k]')"
             if(
    mysql_query($query_)) 
                        {     
                          
    $messaggio "Sono state inserite ".count($array1)." righe nella tabella.";                 
                         }
                         else                                          
                         {                     
                         
    $messaggio_nuovi "Le righe non sono state inserite.";                       
                         }                                               
             } 
    Quando la query viene lanciata ogni riga della tabella viene scritta due volte così che se, la query stessa, deve lavorare su array di un solo elemento le righe scritte sono due identiche; se gli array contengono ciascuno due elementi, le righe scritte sono quattro e così via.
    Per capire:

    immaginate che $array1 contenga (a,b,c), $array2 contiene (1,2,3) e $array3 contiene (d,e,f). La query scrive 6 righe uguali fra loro a due a due:

    a, 1, d
    a, 1, d
    b, 2, e
    b, 2, e
    c, 3, f
    c, 3, f

    I tre campi coinvolti sono di tipo varchar con lunghezza 255.

    Dov'è che sbaglio? Mi sto lambiccando dalle tre di questo pomeriggio...

    Grazie a tutti per l'interessamento

    Emanuele

  2. #2
    Scusa ma secondo il tuo ciclo dovrebbe dare come risultato:

    a, 1, d
    b, 2, e
    c, 3, f

    poichè nel primo ciclo la variabile $k è 0 e prende il primo valore di tutti e 3 le array, nel secondo ciclo si incrementa di 1 (quindi diventa 1) e prende il secondo valore di tutti e 3 le array...e così anche nel terzo ciclo

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    19
    Innanzitutto grazie per la risposta.

    La tabella su cui sto lavorando e' il frutto di una copia del database da un vecchio pc a quello attuale. Ho confrontato le due versioni della tabella e mi sono accorto che quella su cui lavoro ora, non ha il campo Id impostato come chiave primaria autoincrementante.
    Ho pensato che questo fosse l'inghippo, ma niente da fare l'errore si ripete... e non vedo niente nel codice che suggerisca il perche' e per come....

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    a parte che sarebbe meglio una riscrittura (facendo un'unica query), se vuoi capire il problema stampa il valore delle variabili (tutte, inclusa quella di ciclo e la query) dopo la definizione di $query per vedere come avviene l'esecuzione, cmq farei almeno:

    Codice PHP:
    $num count($array1); // mi dici sono tutti e tre uguali, tanto...
    $query"INSERT INTO tabella (Campo1,Campo2,Campo3) VALUES ";
    for (
    $k=0$k<$num$k++) {      
        
    $query .= '('.$array1[$k].','.$array2[$k].','.$array3[$k]'),';
    };
    $query substr($query0, -1); // elimino l'ultima virgola in eccesso
    // ...poi esegui una query... 
    ...da riverificare, cmq (aggiungi un "print $query" in coda, p.es.)

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    19
    Ciao eiyen )

    Ho provato ad inserire la tua parte di codice e, come mi suggerisci, ho fatto pure un print della query. Ancora le righe vengono duplicate, ma in modo diverso: riprendendo l'esempio che avevo fatto all'inizio viene fuori una cosa tipo

    a, 1, d
    b, 2, e
    a, 1, d
    b, 2, e

    L'istruzione print $query restituisce

    INSERT INTO aggiungi_qui (Campo1, Campo2, Campo3) VALUES (a','1','d'),('b','2','e').
    Pure facendo un echo dei valori recuperati dal form, questi venogno visualizzati a video una sola volta... La variabile di ciclo viene fuori come deve (0,1,2,...n-1)...

    Non ne esco...
    Tu dici che sarebbe meglio scrivere una sola query, ma non capisco: non ho gia' una sola query che viene ripetuta n volte?

    Avro' qualcosa cui pensare nel weekend )

    Potro' collegarmi nuovamente da lunedi'.

    Grazie ancora per il tuo consiglio

    Emanuele

  6. #6
    Il problema non risiede nella porzione di codice da te postata. C'è qualcosa a monte che causa il doppio inserimento. Controlla il codice precedente.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    concordo con @satifal... nel mio esempio tu generi un'unica azione sql (due insert in una volta sola)... infatti la differenza di creazione dei record indica che l'intero blocco è ripetuto due volte (questa volta l'inserimento avviene in ordine diverso, però)... quindi c'è qualcosa esternamente

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    19
    Ringrazio entrambi per gli interventi.

    Ho un form che, con metodo POST, preleva i dati dalla tabella "pesca_da". Questa contiene cinque campi: Id, Campo1, Campo2, Campo3, Scadenza. Tutti i campi, a parte Id che e' numerico e autoincrementante e Scadenza che e' di tipo date, sono di tipo varchar.

    I dati visualizzati dal form vengono inviati alla tabella "aggiungi_qui" che ha la stessa struttura dell'altra con la differenza che qui il campo Scadenza si chiama Data.

    Ho riguardato il codice, ma non vedo niente che non vada. Mi muovo abbastanza bene con le query e le subqueries, ma l'inesperienza e' comunque tanta... Posto il codice tralasciando la parte relativa alla connessione al db e la parte iniziale del form.


    Codice PHP:

    $riferimento 
    "2012-03-30"//la data da confrontare con il campo Scadenza
    $query "SELECT Campo1, Campo2, Campo3, Scadenza from pesca_da WHERE Scadenza BETWEEN curdate() and '{$riferimento}'";
    $risultato mysql_query($query);

    if (!
    $risultato)
        {
          
    //visualizzo messaggio di errore
        
    }

    while (
    $row mysql_fetch_assoc($risultato))
        {
             
    $Cognome htmlentities($row['Campo1']);
             
    $Nome htmlentities($row['Campo2']);
             
    $Altro htmlentities($row['Campo3']);             

    echo
    "<tr>
         <td>
    $Cognome<input type='hidden' name='Campo1[]' value='$Cognome'></td>
             <td>
    $Nome<input type='hidden' name='Campo2[]' value='$Nome'></td>
             <td>
    $Altro<input type='hidden' name='Campo3[]' value='$Altro'></td>
           </tr>"

          }
    echo
    "</table>
           

           

            <input type='submit' value='invia'>"
    ;
     echo
    "</form>"

    In scrivi.php recupero i dati, ricavo la data odierna che sara' scritta nel db e quindi lancio la query riscritta come suggerito da eiyen:

    Codice PHP:
    $Campo1 $_POST['Campo1'];
    $Campo2 $_POST['Campo2'];
    $Campo3 $_POST['Campo3'];
    $oggi date("y-m-d");
    $num count($Campo1);

    $scrittura "INSERT INTO aggiungi_qui (Campo1, Campo2, Campo3, Data) VALUES ";
    for (
    $k=0$k$num$k++)
        {
           
    $scrittura .= "('$Campo1[$k]','$Campo2[$k]','$Campo3[$k]','$oggi'),";
         }
        
    $scrittura substr($scrittura0, -1); // elimino l'ultima virgola in eccesso 
            
    mysql_query($scrittura);
           
    if (!
    mysql_query($scrittura))
      {
        
    //messaggio di errore
       
    } else { //messaggio per esito positivo
       
       

    Ho provato ad inserire l'echo di $scrittura ad ogni ripetizione del ciclo e dopo il ciclo stesso e sempra funzionare: al primo giro contiene a,1,d e al secondo a,1,d - b,2,e (sempre riferendomi all'esempio dei post precedenti); all'uscita dal ciclo il valore è identico: a,1,d - b,2,e
    Ho inserito l'esecuzione della query all'interno del ciclo e, anche in questo caso, il risultato e' identico...

    Da battere la testa sulla tastiera....

  9. #9
    Originariamente inviato da stenfpar
    ...

    Codice PHP:
    $Campo1 $_POST['Campo1'];
    $Campo2 $_POST['Campo2'];
    $Campo3 $_POST['Campo3'];
    $oggi date("y-m-d");
    $num count($Campo1);

    $scrittura "INSERT INTO aggiungi_qui (Campo1, Campo2, Campo3, Data) VALUES ";
    for (
    $k=0$k$num$k++)
        {
           
    $scrittura .= "('$Campo1[$k]','$Campo2[$k]','$Campo3[$k]','$oggi'),";
         }
        
    $scrittura substr($scrittura0, -1); // elimino l'ultima virgola in eccesso 
            
    mysql_query($scrittura);
           
    if (!
    mysql_query($scrittura))
      {
        
    //messaggio di errore
       
    } else { //messaggio per esito positivo
       
       

    ...
    Mi sa che hai un piccolo problemino in "scrivi.php" così come l'hai scritto tu.

    Codice PHP:
    ...
            
    mysql_query($scrittura);
           
    if (!
    mysql_query($scrittura)) 
    ... 
    esegui due volte la query!
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    19
    Che scemo!....
    Per come l'avevo inteso il ciclo if avrebbe verificato se la query era stata eseguita o meno... invece l'if esegue comunque l'istruzione contenuta nelle parentesi e se questa va a buon fine esegue quanto indicato tra le graffe, altrimenti quello che e' indicato dopo else... Ho capito: devo rivedermi per bene il manuale...

    Ti ringrazio satifal D e grazie anche a eiyen e camionistaxcaso )

    Emanuele

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.