• User Newbie

    [PROBLEMA]checkbox dinamiche php-mysql

    Buonasera a tutti, ho un problema che mi sta facendo fondere il cervello, mi rivolgo a voi sperando in un vostro aiuto.

    Devo realizzare una checkbox multipla collegata a database del tipo:

    elemento1[]
    elemento2[]
    elemento3[]

    L'utente deve poter "aggiornare" il checked della checkbox dinamicamente.

    Quindi al caricamento della pagina, leggendo i valori da database potrebbe essere:

    elemento1[]
    elemento2[X]
    elemento3[]

    e dopo la modifica potrà essere:

    elemento1[]
    elemento2[X]
    elemento3[X]

    e devo poter prevedere anche lo stato di decheck:

    elemento1[]
    elemento2[]
    elemento3[X]

    In php ho creato questo codice:

    [PHP]

    $myCheck = $_POST['myCheck'];
    if(isset($myCheck)){
    foreach ($myCheck as $key => $value) {
    $sel= mysql_db_query($db_login,"SELECT evidenza FROM servizi WHERE id='$key'" ,$connessione); //seleziono il campo evidenza che vale 0 o 1 che è poi il valore della checkbox
    $s = mysql_result($sel,0,"evidenza");
    if($s==0){
    $v=1;
    mysql_db_query($db_login,"update ".$db_servizi." set evidenza='".$v."' where id='".$key."' ",$connessione);
    } else{
    $v=0;
    mysql_db_query($db_login,"update ".$db_servizi." set evidenza='".$v."' where id='".$key."' ",$connessione); }
    [/PHP]

    e quest'altro codice che "stampa" la checkbox

    [PHP]
    //query database
    while ( $i<$num ){

    $id = mysql_result($news,$i,"id");
    $titolo = mysql_result($news,$i,"titolo");
    $evidenza = mysql_result($news,$i,"evidenza");

    //inizio elemento
    echo($titolo);
    if($evidenza == 1){
    echo('<input type="checkbox" checked="checked" id="mycheck" value="'.$id.'" name="myCheck['.$id.']" class="regular-checkbox big-checkbox" />');
    } else{
    echo('<input type="checkbox" id="mycheck" value="'.$id.'" name="myCheck['.$id.']" class="regular-checkbox big-checkbox" />');
    echo('<label for="');echo($id);echo('"></label>');

    .......

    [/PHP]

    La stampa dei risultati dal database alle checkbox funziona, l'aggiornamento dei campi non viene intercettato dalla POST il deseleziona, qualche suggerimento per risolvere il problema??


  • User Attivo

    Ciao Daniele,
    intanto ti consiglierei di utilizzare funzioni non deprecate per il tuo script.
    Un flusso comunemente utilizzato (come riportato da php.net) è questo:
    [PHP]if (!$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')) {
    echo 'Could not connect to mysql';
    exit;
    }

    if (!mysql_select_db('mysql_dbname', $link)) {
    echo 'Could not select database';
    exit;
    }

    $sql = 'SELECT foo FROM bar WHERE id = 42';
    $result = mysql_query($sql, $link);

    if (!$result) {
    echo "DB Error, could not query the database\n";
    echo 'MySQL Error: ' . mysql_error();
    exit;
    }

    while ($row = mysql_fetch_assoc($result)) {
    echo $row['foo'];
    }

    mysql_free_result($result);[/PHP]
    Puoi anche ottenere le righe come oggetti con mysql_fetch_object.

    Ti consiglio anche di validare sempre l'input (o almeno filtrarlo), perché l'SQL injection può causarti parecchi guai.

    Quanto al tuo problema:
    La tua supposizione che un campo vuoto valga zero è errata, e per questo il deseleziona non può funzionare. Un campo senza check vale null e non viene proprio passato.
    La soluzione rapida è crearti un campo hidden con lo stesso name che valga zero, appena prima del campo:
    [PHP]echo('<input type="hidden" name="myCheck['.$id.']" value="0" /><input type="checkbox" checked="checked" id="mycheck" value="'.$id.'" name="myCheck['.$id.']" class="regular-checkbox big-checkbox" />');[/PHP] In questo caso se il campo checkbox non è selezionato, il campo hidden viene passato. Se invece la checkbox è selezionata, il valore dell'hidden viene sovrascritto dalla checkbox e troverai il valore corretto nella pagina di destinazione.
    Un'altra supposizione errata è che il campo selezionato passi 1: in realtà una checkbox selezionata passa il valore del value (nel tuo caso $id). E' il comportamento che cercavi?

    Una soluzione più pulita consiste nel crearti un vettore dei possibili id, con i suoi value (impostando un default), poi fare un merge del vettore di default con quello che ti viene passato da myCheck (o un foreach sul vettore di default e se il valore è cambiato lo sovrascrivi). Attenzione però a inserire nella query solamente id previsti e non accettare qualsiasi cosa venga messa dentro.

    Luca


  • User Attivo

    Salve ragazzi,

    M'intrometto nella discussione. Allora, non capisco il perchè se metto un if e dentro l'i metto l'uopdate per il checkbox, non mi fa l'update, se invece tolgo l'if e metto solo l'update, l'update lo fa prima di eseguire il checcked. Di quello che sto parlando, ora lo posto qua:

    regolamento

    [PHP]

    ?php
    require_once("connetti.php");
    $id_user = $_GET['id']; # o $_GET['username'];
    $page = (int)$_GET['page'];
    if(EMPTY($page)) $page = 1;

    $query_user = "SELECT * FROM utenti WHERE id='$id_user'";
    $result_query = mysql_query($query_user);
    $assoc_rows = mysql_fetch_assoc($result_query);

    echo "<title>Pag: $page</title>";
    switch($page)
    {

    case 1:
    

    ?>
    <div style='width:600px; font-family:Comic Sans MS'>

    <!--Inizio bordatura testo arrotondato-->
    

    <style type="text/css">
    .bordato{
    border:2px solid #000000;
    border-radius: 80px 80px 80px 80px;
    -moz-border-radius: 80px 80px 80px 80px;
    -webkit-border-radius: 80px 80px 80px 80px;
    }
    </style>
    <body>
    <div class="bordato">
    <br> <br>
    <center>BENVENUTI NEL SOCIAL NETWORK PIU' LIBERO DEL MONDO

    </center>

    <p align="left">

    Se stai leggendo questo regolamento +¨ perchè¨ ti sei iscritto a tale sito e di conseguenza, prima di andare avanti, devi accettare tre regole fondamentali. <br/>

    Tali regole, servono per non creare dispute e conversazioni spiacevoli sia con gli utenti, sia con gli amministratori.

    Non bisogna essere maggiorenni per iscriversi. Basta avere un'età dai 12 anni in su. Le tre regole fondamentali sono le seguenti: <br></p>
    <p align="left">

    1. Vietato bestemmiare pena si viene automaticamente cancellati dal sito senza possibilità di registrarsi con un ulteriore username; <br/></p>
      <p align="left">

    2. Vietato parlare di politica. La politica è causa di discussioni e punti di vista differenti l'uno dall'altro. Ci saranno tre avvisi,
      dopo di che pena esclusione dal sito e cancellazione perenne dal database;<br/> </p>

    <p align="left">
    3) Rispettare gli utenti iscritti. <br/> </p>

    <p align="left">

    Se accetti le seguenti regole, clicca su "avanti" altrimenti su "cancella", e sarai automaticamente cancellato dal database.

    Grazie di aver letto il regolamento e buon divertimento.
    </p>

    <input id='regolamento' type='checkbox' value='Accetta il regolamento'>Accetta il regolamento

    <br><br>
    <input type="button" onClick="window.location.href='logout.php';" style='padding:10px' value="Logout" />

    <input type="button" onClick="window.location.href='cancellazione.php';" style='padding:10px' value="Cancellati" />

    <input type='button' onclick='getpage("<?=$page+1?>")' value='Avanti' disabled='disabled'/>

    </div>

    <?php
    
    if($_POST['checkbox']){
    

    $qry = "UPDATE utenti SET accettatermini='1' WHERE id='".$id."'"; //aggiornamento dati nel db
    echo $qry;
    if (mysql_query($qry)){
    echo "... Aggiornamento effettuato correttamente....";

    } else {
    echo "Errore: Non è stato possibile effettuare l'aggiornamento richiesto";

    }
    }

    //Inizito seconda pagina dopo aver accettato il regolamento

        break;
    case 2:
    

    $checktermini=mysql_query("SELECT accettatermini FROM utenti WHERE accettatermini='0'");
    $vuota=mysql_num_rows($checktermini);
    if($vuota > 0){
    echo "<br> <br> <h1> Il regolamento deve essere accettato !!! </h1>";
    ?>

    <input type='button' onclick='getpage("<?=$page-1?>")' value='Indietro' hidden/>
    <?php
    exit();
    echo $checktermini;
    }
    ?>
    <link rel="stylesheet" type="text/css" href="coloredisfondo.css">

    <?php
    

    // Ricerca e visualizza l'utente che si è¨ connesso con le info

    #$query = mysql_fetch_array(mysql_query("SELECT * FROM utenti WHERE id='".$_SESSION['id']."'"));

    echo "<br> <br>";
    echo '<p align="left">';
    echo " Cognome: ". $query['cognome'];
    echo '<p align="left">';
    echo '<p align="left">';
    echo "Nome: ". $query['nome'];
    echo "<br> ";
    echo '<p align="left">';
    echo "Username: ". $query['username'];
    echo "<br>";
    echo '<p align="left">';
    echo "EMail: ".$query['email'];

    ?>

         <form action= 'aggiornaprofilo.php' method="POST">
    

    <p align="left">

    Data di Nascita Giorno:

    <?php

    require_once("arraylistecitta.php");

    // Inizio Selezione data di nascita

    //Giorno

    echo "Giorno: ";
    echo "<select name="giorno">";
    echo "<option value=""> seleziona </option>";
    for($gg=1; $gg<=31; $gg++){
    if(strlen($gg)< 2){$gg = "0".$gg;}
    echo "<option value="$gg"> $gg </option>";
    }
    echo "</select>";

    //Mese

    echo " Mese: ";

    echo "<select name="mese">";
    echo "<option value=""> seleziona </option>";

    foreach($mese as $valore){
    echo "<option value="$valore">$valore";
    //echo "<option value="$valore">$valore";
    echo "</option> ";
    }
    echo "</select>";

    //Anno

    echo " Anno: ";
    $da=1950;
    $al=2014;
    echo "<select name="anno">";
    echo "<option value=""> seleziona </option>";
    for($aa=$da; $aa<=$al; $aa++){
    echo "<option value="$aa"> $aa </option>";
    }
    echo "</select>" ;

    // Inizio selezione Città

    echo"<br> <br>";

    echo "Città : ";

    echo "<select name="citta">";
    echo "<option value=""> seleziona </option>";

    foreach($citta as $valore){
    echo "<option value="$valore">$valore";
    //echo "<option value="$valore">$valore";
    echo "</option> ";
    }
    echo "</select>";

    // Inizio selezione Province

    echo " Provincia: ";

    echo "<select name="provincia">";
    echo "<option value=""> seleziona </option>";
    foreach($province as $valore){
    echo "<option value="$valore">$valore";
    //echo "<option value="$valore">$valore";
    echo "</option> ";
    }
    echo "</select>";

    //Anno_diploma

    echo " Anno Diploma: ";
    $da=1950;
    $al=2014;
    echo "<select name="anno_diploma">";
    echo "<option value=""> seleziona </option>";
    for($aa=$da; $aa<=$al; $aa++){
    echo "<option value="$aa"> $aa </option>";
    }
    echo "</select>" ;;

    //Anno_laurea

    echo " Anno Laurea: ";
    $da=1950;
    $al=2014;
    echo "<select name="anno_laurea">";
    echo "<option value=""> seleziona </option>";
    for($aa=$da; $aa<=$al; $aa++){
    echo "<option value="$aa"> $aa </option>";
    }
    echo "</select>" ;

    //Sesso

    echo " Sesso: ";

    echo "<select name="sesso">";
    echo "<option value=""> seleziona </option>";

    foreach($sesso as $valore){
    echo "<option value="$valore">$valore";
    //echo "<option value="$valore">$valore";
    echo "</option> ";
    }
    echo "</select>";

    //Stato Civile

    echo " Stato Civile: ";

    echo "<select name="statocivile">";
    echo "<option value=""> seleziona </option>";
    foreach($statocivile as $valore){
    echo "<option value="$valore">$valore";
    //echo "<option value="$valore">$valore";
    echo "</option> ";
    }
    echo "</select>";

    //Occupazione

    echo "<br> <br>";

    $q=mysql_query("SELECT occupazione FROM utenti ORDER BY occupazione");
    $vuota=mysql_num_rows($q);
    if($vuota > 0){//fa vedere la select solo se ci sono componenti e mostra solo il'input nuovocomponente, in pratica solo la prima volta
    echo "Attività <select name="occupazione">";
    echo "<option value="">-seleziona-</option>";
    while($riga=mysql_fetch_array($q)){
    echo "<option value="".$riga['occupazione']."">".$riga['occupazione']."</option>";
    }//fine while
    echo "</select>";
    }//fine if vuota

    ?>

    Nuova attività da inserire: <input type='text' name='nuovaoccupazione' />
    <?php

    echo "<br> <br>";

    //Titolo_Studio

    $q=mysql_query("SELECT titolo_studio FROM utenti ORDER BY titolo_studio");
    $vuota=mysql_num_rows($q);
    if($vuota > 0){//fa vedere la select solo se ci sono componenti e mostra solo il'input nuovocomponente, in pratica solo la prima volta
    echo "Titolo di studio: <select name="titolo_studio">";
    echo "<option value="">-seleziona-</option>";
    while($riga=mysql_fetch_array($q)){
    echo "<option value="".$riga['titolo_studio']."">".$riga['titolo_studio']."</option>";
    }//fine while
    echo "</select>";
    }
    //fine if vuota
    ?>
    Nuovo titolo di studio da inserire: <input type='text' name='nuovotitolostudio' />

    <?php
    //Titolo_laurea

    $q=mysql_query("SELECT titolo_laurea FROM utenti ORDER BY titolo_laurea");
    $vuota=mysql_num_rows($q);
    if($vuota > 0){//fa vedere la select solo se ci sono componenti e mostra solo il'input nuovocomponente, in pratica solo la prima volta
    echo "Titolo di laurea: <select name="titolo_laurea">";
    echo "<option value="">-seleziona-</option>";
    while($riga=mysql_fetch_array($q)){
    echo "<option value="".$riga['titolo_laurea']."">".$riga['titolo_laurea']."</option>";
    }//fine while
    echo "</select>";
    }//fine if vuota
    ?>
    Nuovo titolo di laurea da inserire: <input type='text' name='nuovolaurea' />

    <br><br> <center>
    <input type='button' onclick='getpage("<?=$page-1?>")' value='Indietro' ?>
    <input type='button' onclick='getpage("<?=$page+1?>")' value='Avanti' ?>

        <!--<input type="button" onClick='getpage("<?=$page+1?>")' style='padding:10px' value="Aggiorna Profilo" />-->
    
       
    
        <input type="submit"  onClick="window.location.href='aggiornaprofilo.php';"style='padding:10px' value="Aggiorna Profilo" >
        
        <input type="button" onClick="window.location.href='logout.php';" style='padding:10px' value="Logout" >
    
    
    
    </center>
    <?php
    break;
    case 3:
    break;
    

    }
    ?>
    <script>
    $('input[id=regolamento]').click(function(){
    var input = $('input[value="Avanti"]');
    if($(this).is(':checked')) input.removeAttr('disabled');
    else input.attr('disabled','disabled');
    });
    function getpage(page)
    {
    location.href = '?page='+page;
    }
    </script>

    [/PHP]

    altromodo

    [PHP]

    <?php

    if($_POST['checkbox']){ //se tolgo questa riga, l'update me lo fa regolamente. Mi sapete dire cosa c'è che non gli piace ????

    $qry = "UPDATE utenti SET accettatermini='1' WHERE id='".$id."'"; //aggiornamento dati nel db
    echo $qry;
    if (mysql_query($qry)){
    echo "... Aggiornamento effettuato correttamente....";

    } else {
    echo "Errore: Non è stato possibile effettuare l'aggiornamento richiesto";

    }
    }
    ?>
    [/PHP]

    Non capisco perchè senza if lo fa e con l'if non lo fa. In findei conti mi hanno detto che non c'è bisogno di mettere un if con dopo =="accetta regolamento" che è inutile. Basta un if così per gestire la checkbox. Datemi una mano vi pregoi non ci sto capendo più niente. Fra le altre cose ci dovrebbe essere anche un controllo che verifichi quaale utente abbia accettato il regolamento oppure no e ci dovrebbe essere un redirect che lo manda alla pagina 1 oppre alla 2. Grazie a tutti e spero in voi.