Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478

    UPDATE multipli contemporaneamente

    Allora, premetto che ho già fatto molte ricerche sul forum senza venirne a capo, chiedevo se qualcuno potesse darmi una mano a realizzare un sistema per ottenere degli aggiornamenti multipli contemporaneamente.

    Il tutto dovrebbe avvenire in una sola pagina: modify.php

    Dunque, nella pagina di modifca ho scritto questo codice:
    codice:
    if(isset($_POST['submit'])) {
    //recupero i dati passati con $_POST
    $data = $_POST['data'];
    $marca = $_POST['marca'];
    $tipo = $_POST['tipo'];
    
    //mi serve per contare quanti di sono stati aggioranti
    $record_aggiornati = count($_POST['id']);
    
        foreach($_POST['id'] as $key => $value) {
            $id = $_POST['id'][$key];
            $update = "UPDATE $table_name SET data = 'NOW()',
            marca = '$marca', tipo = '$tipo', WHERE id = '$id'";
    
            mysql_query($update, $db);
        }
    } else {
    //altre query select per stampare i record
    //ed eventualmente modificarli...
    //...adesso estraggo i dati
    while($records = mysql_fetch_array($result)) {
    
    echo '<input type="hidden" name="data" value="true">';
    echo '<input type="hidden" value="'.$records['id'].'" name="id[]">';
    
    echo 'Marca: <input type="text" name="marca"
    value="'.$records['marca'].'">';
    
    echo 'Tipo: <input type="text" name="tipo"
    value="'.$records['tipo'].'">';
    
    }
    echo '<input type="submit" name="submit"
    value="Aggiorna record"></form>';
    Ho tagliato il codice perché lungo ed insignificante per capire il procedimento da adottare. Comunque dovrebbe esserci tutto quello che serve per capire se ho scritto fagianate o potrebbe anche andar bene così...

    Ora, qualche notizia sulla tabella:
    - una sola tabella $table_name con i campi id (primary key, autoincrement) oltre atutti gli altri campi opportunamente (credo) settati per i rispettivi valori da contenere.

    Stando all'ambaradan postato ho fatto delle prove, ma niente! di aggioranre i campi non ne vuole proprio sapere.

    Ho aggiunto un echo a $update per cercare di capire quello che accade nel ciclo foreach, e ho notato che l'unica cosa che si aggiorna è l'id...

    Ho dei dubbi sulla query, sul campo SET data = NOW(), non mi convince. Anche omettendolo, però non cambia nulla.

    Questo stesso sistema, con piccole modifiche, mi permette di ottenere un risultato simile con la query DELETE.
    Nella pagina delete.php ottengo dal while la lista di tutti i record della tabella, e tramite l'uso del foreach e dell'uso dell'id[] riesco a scegliere quali e quanti record eliminare. Tutto va bene in quel contesto.

    Il problema è che non sono in grado di adattare lo stesso sistema per realizzare l'aggiornamento dei record...

    Ora, se siete arrivati fino alla fine senza ammorbarvi, vi prego, se potete datemi un aiuto. Grazie, e scusate se non sono stato abbastanza chiaro...


  2. #2
    $update = "UPDATE $table_name SET data = 'NOW()',
    marca = '$marca', tipo = '$tipo', WHERE id = '$id'";

    NOW() e' una funzione e quindi non va tra apici. Poi non ci vuole la virgola prima di WHERE.

    se vuoi vedere l'errore richiedine la segnalazione.

    mysql_query($update, $db) or die (mysql_error());

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

  3. #3
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    ...lo sapevo, grazie! (ma di un po', farai mica parte del team di sviluppo SQL ?? )

    Ok, comunque, fatte le opportune correzioni ho notato che non c'è nessun errore quando invio i dati (beh, veramente nemmeno prima, nel codice avevo omesso il mysql_error).

    Adesso riesco a fare l'aggiornamento ma... "su tutto!!", kassio!!

    Allora, ti dico: dopo il foreach, ho aggiunto:
    codice:
    echo mysql_info($db);
    e questo è quello che ottengo quando tento di aggiornare "più campi":
    codice:
    Rows matched: 1 Changed: 1 Warnings: 0
    ...com'è possibile? :master:

    So di chiederti tanto, ma mi daresti qualche altro consiglio?
    grazie


  4. #4
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Ah, altra cosa, cercando nel forum ho trovato queste tue righe di codice:
    codice:
    $num = mysql_affected_rows($db);
    
    if($num == 1 ) echo "ok. modifica effettuata";
          elseif($num == 0) echo "Nessuna modifica. Variazione abbandonata";
                else echo "attenzione... hai modificato $num record... controlla..";
    le ho aggiunte dopo il foreach, ma niente! è un disastro totale... addirittura se non modifico assolutamente nessun campo, con il codice di sopra mi restituisce sempre 1, e quindi effettua l'aggiornamento su tutte le righe prendendosi i valori dall'ultimo id inserito! Ho provato e riprovato a stapare la query, ma sembra corretta nel senso che non termina prima della condizione where...

    ...giusto una curiosità: ma come funziona il codice del myphpadmin quando si richiama la sezione modifica? Ho provato a guardare nelle varie sezioni, ma per me è troppo un casino... però l'ideale sarebbe un sistema tipo quello.

    Mah, ora è tardi, a domani...

    ( piero)

  5. #5
    Hai qualcosa di strano nella gestione del foreach.

    Come puoi avere un solo valore per data marca e tipo con tanti id?

    Stampa tutto il contenuto di $_POST se vuoi valutare cio' che fai.

    echo "<pre>";
    print_r($_POST);

    quanto meno ti rendi conto del contenuto. Poi che significa il seguente? A me pare senza senso. Scorri l'array per mettere di nuovo la chiave al suo posto di prima??? Anche qui stampa quello che fai.
    codice:
        foreach($_POST['id'] as $key => $value) {
        echo $id = $_POST['id'][$key];
    Infine la verifica delle righe modificate deve stare "dentro il ciclo foreach, altrimenti ti passera' solo l'ultima riga modificata al termine del ciclo.


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

  6. #6
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Grazie ancora per l'interessamento, ma non riesco a venirne a capo... prima di rinunciare definitivamente alla cosa, vorrei tentare con un esempio a cercare di spiegarmi meglio:

    - ho una pagina delete.php che, attraverso il codice che segue, mi permette di ottenere la lista di tutti i records contenuti nella tabella e mediante l'uso dei checkbox posso decidere quali e quanti records eliminare, indicando nel WHERE l'id (primary key):
    codice:
    //...controllo con isset se il form è stato inviato
    //se è così, uso il foreach per ciclare la query DELETE
    //ed eliminare i records scelti ($id) per essere eliminati
    
    foreach($_POST['id'] as $key => $value) {
        $id = $_POST['id'][$key];
        mysql_query("DELETE FROM $table_name WHERE id='$id'", $db);
    }
    Se i dati non sono stati inviati stampo la lista completa dei records:
    codice:
    while($records = mysql_fetch_array($result)) {
    
        //attribuisco al valore del checkbox il numero dell'id estratto
        //e aggiungo al nome del checkbox l'array id[]
    
        echo '<input type="checkbox" value="'.$records['id'].'" name="id[]">';
    }
    Questo funziona perfettamente.

    Ora, visto e considerato che questo sistema funziona abbastanza bene, avevo pensato di adattarlo per la pagina modify.php che avrebbe avuto in pratica lo stesso funzionamento: ciclare la query UPDATE per aggiornare solo i records modificati (se si invia il form) oppure stampare l'elenco di tutti i records in attesa di eventuali modifiche (un po' come avviene quando su questo forum si modifica il messaggio già inviato, ad eccezione per il fatto che l'elenco dei records viene mostrato attraverso vari form per avere un aspetto più ordinato).

    Non essendo stato capace di tirar fuori un sistema decente per ottenere gli aggiornamenti contemporanei, mi aiuteresti a realizzare un sistema per l'update multiplo sulla base del codice indicato sopra?

    Mi basterebbe un semplicissimo esempio, poi vedrei di arrangiarmi...

    Grazie di tutto

  7. #7
    Per quanto riguarda i suggerimenti gia' te li ho dati nell'ultimo post. Stampa gli array e vedi come sono composti. in base a quello deciderai la strategia per la query.

    Il foreach di cui sopra non ha granche' senso ti ripeto: hai un mixer tra l'uso di for e di foreach. Se scorri l'array sfrutta le peculiarita' di foreach.
    codice:
    foreach($_POST['id'] as $value) {
        mysql_query("DELETE FROM $table_name WHERE id='$value'", $db);
    }
    Per quanto riguarda gli aggiornamenti "multipli" dovresti mettere tutti i dati da modificare in un array multidimensionale e poi scorrere l'array con tanti foreach quanti sono i valori annidati. Quindi l'array $_POST dovra' presentarsi in questo modo:
    codice:
    Array
    (
        [0] => Array
            (
                [id] => 123456
                [data] => 2005-03-29
                [tipo] => lungo
                [marca] => pippo
            )
    
        [1] => Array
            (
                [id] => 123457
                [data] => 2005-03-25
                [tipo] => pippo
                [marca] => lungo
            )
    
    )
    Quindi il primo foreach scorre l'indice numerico (0-1-2-3-ecc), i foreach annidati scorreranno i vari valori del singolo indice numerico ed eseguiranno la query.
    codice:
    foreach($_POST as $key => $value ) {
    
      foreach($_POST[$key] as $key1 => $value1) {
        if($key1 == 'id') $id = "$value1";
             foreach($_POST[$key] as $key1 => $value1) {
                if($key1 == 'data')  $data = "$value1";
                   foreach($_POST[$key] as $key1 => $value1) {
                      if($key1 == 'tipo') $tipo = "$value1";
                         foreach($_POST[$key] as $key1 => $value1) {
                           if($key1 == 'marca') $marca = "$value1";
                         }
                   }
            }
      }
     mysql_query("update tabella set data = '$data', tipo = '$tipo',
                  marca = '$marca' where id = '$id'");
    }

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

  8. #8
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    adesso t'incazzerai ma... non ho capito come mettere tutti i dati in un array multidimensionale!?

    Ho fatto varie prove ma mi da sempre dei warning: Invalid argument supplied for foreach(), che corrispondono alla riga dove inizia il primo ciclo foreach...

    Come devo impostare l'attributo name nel campo hidden "id"??

    Grazie per la pazienza e scusami di tutto

  9. #9
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Allora... ricominciamo dall'inizio con tutto il codice:
    codice:
    //controllo se il form è stato inviato
    
    if(isset($_POST['submit'])) {
    
    //recuopero i dati passati dal form
    
    $id = $_POST['id'];
    $tipo = $_POST['tipo'];
    $marca = $_POST['marca'];
    
    //questo è il tuo codice...
    //manca il campo data perché ho preferito far le prove senza
    //non avendo ancora capito bene l'uso di NOW()
    //ma lasciamo perdere per adesso :(
    
    foreach($_POST as $key => $value ) {
    
      foreach($_POST[$key] as $key1 => $value1) {
        if($key1 == 'id') $id = "$value1";
          foreach($_POST[$key] as $key1 => $value1) {
            if($key1 == 'tipo') $tipo = "$value1";
              foreach($_POST[$key] as $key1 => $value1) {
                if($key1 == 'marca') $marca = "$value1";
              }
          }
      }
      mysql_query("update $table_name set tipo = '$tipo',
                  marca = '$marca' where id = '$id'");
    }
    
    //controllo se ci sono state modifiche
    
    $num = mysql_affected_rows($db);
    if($num == 1) echo "ok. modifica effettuata";
        elseif($num == 0) echo "Nessuna modifica. Variazione abbandonata";
            else echo "attenzione... hai modificato $num record... controlla..";
    
    //se il form non è stato inviato allora stampo l'elenco dei records
    
    } else {
    
    //invio la query select...
    
    //ora estraggo i dati
    while($records = mysql_fetch_array($result)) {
    
    echo '<input type="hidden" value="'.$records['id'].'" name="id[]">';
    
    echo 'Marca: <input type="text" name="marca" value="'.$records['marca'].'">';
    
    echo 'Tipo: <input type="text" name="tipo" value="'.$records['tipo'].'">';
    }
    echo '<input type="submit" name="submit" value="Aggiorna">';
    Ok, questo è il codice che sto usando.
    Questo invece è il risultato:
    codice:
    Array
    (
        [id] => Array
            (
                [0] => 1
                [1] => 2
                [2] => 3
                [3] => 4
            )
    
        [marca] => marcaC
        [tipo] => tipoC
        [submit] => Aggiorna
    )
    
    Warning:  Invalid argument supplied for foreach() in
    C:\Programmi\Apache Group\Apache2\test\DB\modify.php on line 26
    
    Warning:  Invalid argument supplied for foreach() in
    C:\Programmi\Apache Group\Apache2\test\DB\modify.php on line 26
    
    Warning:  Invalid argument supplied for foreach() in
    C:\Programmi\Apache Group\Apache2\test\DB\modify.php on line 26
    Nessuna modifica. Variazione abbandonata
    (nel database avevo inserito 4 record)
    rispettivamente:
    - campo id: 1, 2, etc.
    - campo marca: marcaA, marcaB, etc.
    - campo tipo: tipoA, tipoB, etc.

    Tornando di nuovo alla pagina modify.php ho notato 1 solo aggiornamento strano:
    - [b]i campi corrispondenti all'id 1, marca e tipo, ora hanno assunto il valore di 1 (marca) e 1 (tipo).
    Tutti gli altri campi sono rimasti invariati.

    Adesso, mio eroe, mi daresti l'ultimo aiuto prima dell'arrivo della neuro?

    grazie...


  10. #10
    Eroe delle palle...
    Cancella quello che ti ho detto e fai nel seguente modo.... Ti posto una pagina... completa di form ed inserimento. guardala, girala e adattala...
    codice:
    <?php
    // pagina chiamiamola di destinazione
    if(!empty($_POST))   {
    // $i = 0;
    foreach($_POST as $key => $value ) {
          $campo[] = $key;
    }
    
    foreach($_POST[$campo[0]] as $key0 => $val0 ) {
          $id[] = $val0;   }
    
    foreach($_POST[$campo[1]] as $key1 => $val1 ) {
          $tipo[] = $val1;   }
    
    // reset($_POST);
    foreach($_POST[$campo[2]] as $key2 => $val2 ) {
          $data[] = $val2;   }
    
    // reset($_POST);
    foreach($_POST[$campo[3]] as $key3 => $val3 ) {
          $nome[] = $val3;   }
    
    for($i = 0; $i < count($id); $i++) {
    echo $query = "update tabella set data = '$data[$i]', tipo = '$tipo[$i]', nome = '$nome[$i]' where id = '$id[$i]'
    ";
    }
    
    }
    
    // pagina con il form  cambia il valore del for per aumentare le righe
    
    $i= 0;
    echo "<form action='$_SERVER[PHP_SELF]' method='post'> ";
    for($y = 0; $y <= 8; $y++) {
    echo"
            <input type = 'hidden' name = id[$i] value = '123$y'>
       tipo <input type = 'text' name = tipo[$i] value = 'grigio$y'>
       data <input type = 'text' name = data[$i] value = '2005-03-$y'>
       nome <input type = 'text' name = nome[$i] value = 'pippo$y'>
    
       ";
    $i = $i + 1;
    }
    echo "
         <input type='SUBMIT'   name = 'submit'>
          </form>
          ";
    ?>
    copia e incolla e prova....


    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.