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

    Checkbox, update e Ottimizzazione del codice..

    Salve a tutti. Sono al mio primo codice php, è anche il primo linguaggio che studio, per cui abbiate pazienza, cercherò di essere breve e preciso.
    Le domande sarebbero due:
    1) realizzazione della QUERY UPDATE
    2) ottimizzazione dell'intero codice

    Ho letto tutti quanti i rami di questa sezione che riguardano UPDATE e CHECKBOX ma non sono riuscito a realizzare la QUERY UPDATE, purtroppo, con i checkbox spuntati.

    Avendo 83 righe di tipo SET ('on','off') in una tabella con ID auto_increment, devo aggiornarla tramite $_POST[box] che restituisce i numeri dei checkbox name="box[]" spuntati.

    Pensavo di poter fare in questo modo ma qualcosa non va:

    $box = implode(',',$_POST[box]);
    $query = "UPDATE $table_name SET box='on' WHERE id = $box";
    In questo modo l'array restituisce i numeri delle checkbox spuntate che corrispondono agli ID nella tabella.. come avete (ovviamente) già capito.

    Questo sistema però funziona solo se una checkbox è spuntata, mentre io ho bisogno di aggiornare più campi, poiché ogni volta che l'utente si connette, riceverà la lista con le check spuntate e ne aggiungerà di nuove.

    Ho provato come descritto in alcuni post, ad usare
    UPDATE $table_name SET box='on' WHERE id IN $box
    Ma la query rifiuta la pluralità di valori restutuita dall'implode di $box 3,5,7,8 ecc.

    Scusate, scappo dal vet. che il mio cane sta malissimo, quando torno stasera finisco il post.
    A presto e grazie.

  2. #2
    fatto da solo, garzie lo stesso per le utili info trovate su questo forum!

    codice:
    $box = implode("",$_POST[box]); // senza la "virgola"
    $conn = ..
    $query = ..
    $res = ..
    
    while($row = mysql_fetch_array($res)) { 
    if( $row[id] == $box[$i]) {	
    $query = "UPDATE $table_name SET box='on' WHERE id = $box[$i]";
    mysql_query($query,$conn) or die ("Errore nella query UPDATE : " . mysql_error());
       $i++;
    }
    else continue; }

  3. #3
    Visto che sono riuscito a risolvere il primo quesito, provo a porvi il secondo.

    Avendo una 30na di utenti, per ogni utente devo registrare quali checkbox, delle 83, ha spuntato..
    Ho creato una tabella con la lista default, per ogni utente ho pensato di far creare una tabella nome_cognome con 83 campi alla registrazione, questi poi verranno aggiornati dopo le scelte fatte dall'utente sulla propria tabella.
    (la query insert di 83 righe è un po' noiosa, se sapete consigliarmi un altro metodo per creare 83 righe con lo stesso valore sarebbe ottimo)

    La domanda quindi è se secondo voi c'è un metodo più consono per realizzare questa cosa, magari con una tabella sola, oppure un'alternativa al "tipo" SET per dare un valore alle checkbox, nel mio caso ('on','off').

    Grazie come sempre.
    p.s. il mio cane ora sta un po' meglio.

  4. #4
    Risolto con un ciclo while che itera l'INSERT per 83 volte..
    (che brutto).

    Ora invece mi sorge un problema più grave.
    implode mi restituisce l'array sotto forma di numeri non separati da nulla. Se li separo con una "," le "," stesse prendono posizione nell'array restituito da implode, quindi la numerazione salta.
    Se invece NON li separo, i numeri a 2 cifre li interpreta come 2 numeri distinti, per cui 12 diventa 1 e 2..

    Dovrei creare un sistema che, se la cifra è superiore o uguale a 10, unisce i due valori..

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Supponendo che tu abbia un array del genere:
    $numeri = array(1,2,3,4,5,6);

    tramite un ciclo for lo scansioni tutto

    for ($i=0; $i<count($numeri); $i++)

    tramite la variabile $numeri[$i] accedi ad ogni singolo valore e dentro il for fai le operazioni che devi fare.

  6. #6
    codice:
    $box = $_POST[box]; //ex. 3,5,6,12
    $a = 0;
    
    for ($i=0; $i <= count($box); $i++) {
    	if($row[id] == $box[$i]) {	
    $query = "UPDATE $userTable SET box='on' WHERE id = $box[$i]";
    mysql_query($query,$conn) or die ("Errore nella query UPDATE on: " . mysql_error());
    }
    	else {
    $query = "UPDATE $userTable SET box='off' WHERE id = '$a'";
    mysql_query($query,$conn) or die ("Errore nella query UPDATE off: " . mysql_error());
            }
        $a++;
    }
    qualcosa del genere..
    il problema è che così $box[$i] mi restituisce 35612 e non un solo campo alla volta come il ciclo while, la cui variabile mi restituiva la posizione interna dell'array.

  7. #7

    i'm an idiot!
    non so perché ero arrivato all'utilizzo di implode..
    ho fatto talmente tante prove che non me lo ricordo più!
    così, come logicamente dovrebbe essere, funziona:
    codice:
    $box = $_POST[box];	
    $i = 1;
    $a = 0;
    	
    while(($row = mysql_fetch_array($res)) && ($i<=83)) { 	
    	if($row[id] == $box[$a]) {	
    $query = "UPDATE $userTable SET box='on' WHERE id = $box[$a]";
    mysql_query($query,$conn) or die ("Errore nella query UPDATE on: " . mysql_error());
    	$a++;
    }
    	else {
    $query = "UPDATE $userTable SET box='off' WHERE id = '$i'";
    mysql_query($query,$conn) or die ("Errore nella query UPDATE off: " . mysql_error());}
    $i++;
    }
    mavvepare!
    tnx cmq per l'aiuto ovviamente.

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Scusa ganchan ma più rileggo i tuoi post più ho difficoltà a capire cosa vuoi fare. Correggimi se sbaglio: hai 83 voci che possono essere solo di tipo on e off. L'utente al momento della registrazione deve scegliere tra le 2.
    Una volta che sceglie le sue opzioni queste andranno salvate in una tabella.
    Se ho capito bene potresti fare una cosa del genere

    <form action="elabora.php" method="post">
    Opzione 1
    <input type="radio" name="opzione1" value="on">
    <input type="radio" name="opzione1" value="off" checked>


    Opzione 2
    <input type="radio" name="opzione2" value="on">
    <input type="radio" name="opzione2" value="off" checked>


    <input type="submit" value="invia">

    ecc.fino ad arrivare alle 83 opzioni. Tramite l'attributo checked le setti tutte ad off e quando l'utente vuole attivarle semplicemente clicca su on.


    Nella pagina che elabora i dati recuperi i valori selezionati
    $opzione1 = $_POST['opzione1'];
    $opzione2 = $_POST['opzione2'];
    ecc.
    e poi procedi all'inserimento.

    Nella pagina di update delle sue preferenze fai

    $sqlinterr = "UPDATE tabellaUtenti SET opzione1= '$opzione1',";
    $sqlinterr.= " opzione2 = '$opzione2',";
    $sqlinterr.= " opzione3 = '$opzione3',";
    $sqlinterr.= " opzione4 = '$opzione4'";
    $sqlinterr.= " WHERE idutente = $idutente";

    mysql_query ($sqlinterr) or die(mysql_error());

    $num = mysql_affected_rows();
    if ($num>0)
    echo "Il record è stato modificato";
    else
    echo "<Il record non è stato modificato";
    }

    E' questo ciò che vuoi fare oppure ho capito male?

  9. #9
    Scusa Nicola, effettivamente per essere il più breve possibile forse mi sono spiegato molto male.
    Per ogni utente che si iscrive, viene creta una tabella nome_cognome con colonne ID e BOX di 83 righe.
    codice:
    $query = "CREATE TABLE ".$userTable." (id INT (2) UNSIGNED not null AUTO_INCREMENT PRIMARY KEY, box SET ('on','off') not null)";
    mysql_query($query,$conn) or die ("Errore nella query2: " . mysql_error());
    
    for($i=1;$i<=83;$i++) {						
    $query = "INSERT INTO ".$userTable." VALUES ('$i','off')";
    mysql_query($query,$conn) or die ("Errore nella query: " . mysql_error());}
    
    session_start();
    	$_SESSION['userTable'] = $userTable;
    La colonna ID è UNSIGNED auto_inrement mentre quella box ha valore SET ('on','off') da trasmettere alle checkbox in questo modo.
    codice:
    <? session_start();
    	$userTable = $_SESSION['userTable'];
    
    $conn.. $query.. etc.
    <form method="post" name="box[]" action="insertforme.php"> 
    <table>
    <?
    while ($row = mysql_fetch_array($res))
    { ?>
     <tr> 
      <td class="tdBox"><input type="checkbox" name="box[]" <? echo 'value="'.$row[id].'" '; if($row['box'] == "on"){echo 'checked';} ?> /></td>
      <td class="tdNum"><? print "$row[id]" ?></td>
      <td class="tdNome"><? print "$row[NomeForma]"  ?></td>
      <td class="tdTrad"><? print "$row[Traduzione]"  ?></td>
      <td class="tdTipo"><? print "$row[TipoForma]"  ?></td>  
      </tr>
    <? } ?> 
    </table>
    <input type="submit" name="submit" value="Invia">
    I $row[] non appartenenti alle checkbox li stampo tramite "SELECT FROM" di 2 tabelle, tabellaUtente e la lista completa delle opzioni, incrociate con WHERE A.id = B.id, ma questo non ha importanza.

    Una volta che l'utente ha scelto le checkbox fra le 83, faccio l'UPDATE tramite l'array $_POST[box] che contiene tutti i valori delle checkbox scelte per ex. (3,5,8,9,13,45,68,81).

    nella pagina insert.php mi connetto alla tabella utente e faccio l'update in questo modo
    codice:
    <? session_start();
    	$userTable = $_SESSION['userTable'];
    
    $conn.. $query.. etc. //connessione al database e alla tabella utente passata tramite la variabile $_SESSION[userTable]
    
    $box = $_POST[box];	//array delle checkbox
    $i = 1;
    $a = 0;                 
    	
    while(($row = mysql_fetch_array($res)) && ($i<=83)) { 		
    	if($row[id] == $box[$a]) {	
    $query = "UPDATE $userTable SET box = 'on' WHERE id = $box[$a]";
    mysql_query($query,$conn) or die ("Errore nella query UPDATE on: " . mysql_error());
    	$a++;
    }
    	else {
    $query = "UPDATE $userTable SET box = 'off' WHERE id = '$i'";
    mysql_query($query,$conn) or die ("Errore nella query UPDATE off: " . mysql_error());}
    $i++;
    }
    ?>
    In questo modo, tramite while itero il paragone fra le 83 righe ID dell'intera tabella e i valori richiamati dall'array $_POST[box], quando sono uguali allora la riga corrispondete prende il valore di SET ('on').
    Altrimenti la variabile $i (else) che viene incrementata ad ogni ciclo modifica il valore di SET su ('off') di modo che se viene tolta una checkbox dall'utente nei giorni successivi, questa non è presente nell'array $_POST[box], e $i assumendo il suo valore la convertirà.

    :master:

  10. #10
    Allora: ho rivoluzionato un po' il sistema, per cui ora invece di avere una tabella per ogni utente in cui salvare i valori delle checkbox, ho una tabella dove ogni colonna prende il nome _cognome dell'utente, e le righe prendono i valori delle checkbox ('on','off')in ordine crescente da 1 a 83, laprima colonna invece è ID auto_increment.

    Ora dovrei creare una query che mette in relazione la tabella delle 83 forme con la colonna dell'utente loggato (presa dalla tabella utentiForme) per restituire la lista forme con le checkbox personali.
    Qualcosa del genere:
    codice:
    $query = 'SELECT * FROM forme A, utentiForme.'.$userColumn.'  B WHERE A.id = B.id';
    Ovviamente è una sintassi errata. Il manuale online di mysql oltretutto è scritto malissimo.

    Potrei forse fare due query e confrontare con una terza il risultato?
    codice:
    	$query = 'SELECT * FROM forme';
    	$res = mysql_query($query, $conn) or die("Errore nella query: " . mysql_error());
    
    	$queryB = 'SELECT $userColumn FROM utentiForme';
    	$resB = mysql_query($queryB, $conn) or die("Errore nella query: " . mysql_error());
    	$rowB = mysql_fetch_array($resB);
     	
    while ($row = mysql_fetch_array($res))
    { ?>
     <tr> 
      <td class="tdBox"><input type="checkbox" name="box[]" <? echo 'value="'.$row[id].'" '; if($rowB['box'] == "on"){echo 'checked';} ?> /></td>
      <td class="tdNum"><? print "$row[id]" ?></td>
      <td class="tdNome"><? print "$row[NomeForma]"  ?></td>
      <td class="tdTrad"><? print "$row[Traduzione]"  ?></td>
      <td class="tdTipo"><? print "$row[TipoForma]"  ?></td>  
      </tr>
    <? } ?>
    :master:

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.