[PHP - RISOLTO] Tabella dinamica: colonne selezionate da checkbox

ciao
prendi quello che hai fatto, salvalo con un altro nome (non si sa mai) e sostituisci con questo
PHP:
<?php
//qui dati di connessione
$matricola=$_POST['redattore'];
$wh="";
if(!empty($matricola)){
    $wh=" WHERE matricola=$matricola";//$matricola è un numero intero gli apici non ci vogliono
}
if(is_array($_POST['fields'])){
    $arr_campi=array_map('trim',$_POST['fields']);//eventuale ripulita
    $numero=count($_POST['fields'])-1;//servirà poi per fare la tabella
    $campi=implode(",",$arr_campi);
    $query= "SELECT $campi FROM tabella $wh";
    $ris = mysql_query($query);
    if(mysql_num_rows($ris)> 0){
        echo "<table>";
        echo "<tr><td>".str_replace(',' , '</td><td>' ,$campi )."</td></tr>";
        $j=0;//conteggio per cambio riga
        while($row=mysql_fetch_assoc($ris)){
            if($j==0){echo "<tr>";}
            echo "<td>".$row[$arr_campi[$j]]."</td>";
            $j++;
            if($j>=$numero){$j=0; echo "</tr>";}//verifica meglio il >=
        }
        echo "</table>";
    }else{
        echo "la ricerca non ha dato risultati";
    }
}else{
    echo "non hai selezionato almeno un'opzione";
}
//e qui un lin alla pagina del form
?>
prova e sappimi dire, quello che non capisco è perche il var_dump di ris dia resuorce ma il fetch dia quell'errore
 
  • Like
Reactions: username90
Ciao Borgo, scusami se ti faccio sapere solo ora.. allora ho fatto come hai detto tu e mi dà errore su mysql_num_rows() expects parameter 1 to be resource, boolean given e stampa la scritta la ricerca non ha dato risultati. Sono senza speranze.. ormai pure la notte penso a come risolvere...:(
 
ciao
non preuccuparti, l'unica cosa è che non capisco perchè dia quell'errore, ora provo a farmi tabella e faccio delle prove.
comunque chiederò anche iauto per vedere se si risolve
 
Ciao username90,
Prova questo, poi, se va bene ti mando il codice e la tabella. A me funge
(ovviamente poi è da sistemare: giusto per la funzionalità)

Zorro
 
Ultima modifica:
ciao
ho fatto la tabella viewselettiva limitata a solo 4 voci, messa in un'unica pagina per fare prima e messo delle select matricola a caso e ho fatto delle prove
non da l'errore che dici anche se avevo fatto un errore di logica nel while per la visualizzazione delle voci checcate (guarda come ho modificato), questo codice funziona, copialo (solo la parte php, non il form) nella pagina richiamata dal tuo form e provalo
PHP:
<?php
$host = 'localhost';     //qui devi mettere i tuoi valori di connessione
$username = 'root';
$password = 'password';
$db = 'prove';
$conn = @mysql_connect($host,$username,$password) or die (mysql_error());
$sel = @mysql_select_db($db) or die (mysql_error());
//---connessione----------------------------------------------------
if(isset($_POST['cerca'])){
    $matricola=$_POST['redattore'];
    $wh="";
    if(!empty($matricola)){
    $wh=" WHERE matricola=$matricola";//$matricola è un numero intero gli apici non ci vogliono
    }
    if(is_array($_POST['fields'])){
        $arr_campi=array_map('trim',$_POST['fields']);//eventuale ripulita
        $numero=count($_POST['fields'])-1;//servirà poi per fare la tabella
        $campi=implode(",",$arr_campi);
        $query= "SELECT $campi FROM viewselettiva $wh";
        echo "<pre>";
        //var_dump($query);// OK
        $ris = mysql_query($query);
        //var_dump($ris);// OK
        if(mysql_num_rows($ris)> 0){// OK
               echo "<table>";
            echo "<tr><td>".str_replace(',' , '</td><td>' ,$campi )."</td></tr>";
            while($row=mysql_fetch_assoc($ris)){// OK
                //interno del while aggiustato
                echo "<tr>";
                for($k=0;$k<=$numero;$k++){
                    echo "<td>".$row[$arr_campi[$k]]."</td>";
                }
                echo "</tr>";
            }
            echo "</table>";
        }else{
            echo "la ricerca non ha dato risultati";
        }
        echo "</pre>";
    }else{
        echo "non hai selezionato almeno un'opzione";
    }
}
?>
<form name="form1" enctype="multipart/form-data" method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
<select name="redattore" id="redattore">
  <option value="1">pinco</option>
  <option value="2">pallo</option>
  <option value="3">sempronio</option>
</select><br />
<input type="checkbox" name=fields[] value="Tipologia" checked>Tipologia<br />
<input type="checkbox" name=fields[] value="Nome" checked>Nome ricetta<br />
<input type="checkbox" name=fields[] value="Porzioni" checked>Porzioni<br />
<input type="checkbox" name=fields[] value="Calorie" checked>Calorie<br />
<input type="submit" name="cerca" value="Visualizza">
</form>
detto questo non capisco perche a te dia quell'errore o su mysql_num_rows o su mysql_fetch_assoc
 
ciao @zorro
non ho detto che il tuo codice non funzioni, ma che username80 ha quell'errore che non capisco da dove provenga, la query gli da resource... e quindi vuol dire che va a buon fine, ma la successiva istruzione mysql_fetch_assoc (oppure la mysql_num_rows) a user80 dice che manca il parametro come se la query non fosse riuscita.
errore che a te e al mio codice evidentemente non da.
 
In effetti anche a me dava errore (soprattutto nella query di lettura) con mysql; provando poi con mysqli pare che tutto funzioni.......
Certo bisogna vedere se pure a username funziona il mio codice
 
Ciao username90,
Prova questo, poi, se va bene ti mando il codice e la tabella. A me funge
(ovviamente poi è da sistemare: giusto per la funzionalità)

Zorro
Ciao @zorro si questo funge come vorrei funzionasse anche il mio.. Scusa se rispondo ora ma non avevo visto le notifiche. Ora sto rispondendo anche a Borgo man mano che leggo le vostre risposte.
 
Ultima modifica:
@borgo italia ho provato a copiare il php che hai scritto tu, ma niente sempre la solita risposta leggo, ovvero:
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\bdd\redazione\stampa.php on line 29
la ricerca non ha dato risultati .
 
ciao
non capisco perchè venga fuori quell'errore
prova a passare a mysqli correggi semplicemente la parte php, ho segnato le righe con //nuova con MYSQLI
PHP:
<?php
$host = 'localhost';     //qui devi mettere i tuoi valori di connessione
$username = 'root';
$password = 'password';
$db = 'prove';
$conn = mysqli_connect($host,$username,$password, $db) or die (mysqli_error());//nuova con MYSQLI
//---connessione----------------------------------------------------
if(isset($_POST['cerca'])){
    $matricola=$_POST['redattore'];
    $wh="";
    if(!empty($matricola)){
    $wh=" WHERE matricola=$matricola";//$matricola è un numero intero gli apici non ci vogliono
    }
    if(is_array($_POST['fields'])){
        $arr_campi=array_map('trim',$_POST['fields']);//eventuale ripulita
        $numero=count($_POST['fields'])-1;//servirà poi per fare la tabella
        $campi=implode(",",$arr_campi);
        $query= "SELECT $campi FROM viewselettiva $wh";
        echo "<pre>";
        //var_dump($query);// OK
        $ris = mysqli_query($conn,$query);//nuova con MYSQLI
        //var_dump($ris);// OK
        if(mysqli_num_rows($ris)> 0){//nuova con MYSQLI
               echo "<table>";
            echo "<tr><td>".str_replace(',' , '</td><td>' ,$campi )."</td></tr>";
            while($row=mysqli_fetch_assoc($ris)){//nuova con MYSQLI
                //interno del while aggiustato
                echo "<tr>";
                for($k=0;$k<=$numero;$k++){
                    echo "<td>".$row[$arr_campi[$k]]."</td>";
                }
                echo "</tr>";
            }
            echo "</table>";
        }else{
            echo "la ricerca non ha dato risultati";
        }
        echo "</pre>";
    }else{
        echo "non hai selezionato almeno un'opzione";
    }
}
?>
 
  • Like
Reactions: username90
no così non mi fa selezionare nulla dal menu a tendina del redattore..vabbè ragazzi vi ringrazio per la vostra disponibilità vorrà dire che non lo farò così questa operazione.
 
Ciao, stampate gli errori SQL : aiutano a capire
PHP:
$ris = mysql_query($query);
 if(!$ris) {
    echo mysql_error();
    die();
}
 
  • Like
Reactions: username90
Allora ho fatto come suggerito da @criric e ho scoperto l'errore: $wh=" WHERE matricola=$matricola"; matricola era sconosciuto... ho sostituito il termine matricola con redattore (perchè così si chiama il campo nella tabella viewselettiva) e ho ottenuto finalmente quello che volevo. Grazie mille a tutti voi che mi avete "supportato" e "sopportato" per questi giorni. :)
 
Io comunque, anche se non serve che hai già rilsolto, ti posto ugualmente il mio codice:


HTML

HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>

<body>
<form method="get" action="VISUTAB.php">
    <table align="center" width="900" border="0">
        <tr>
            <td colspan='4' align="center" height="50"><h1>Elenco ricette per redattore</h1></td>
        </tr>
        <tr>
            <td colspan='4' align="center" height="60"><b>Elenco ricette in archivio validate da un redattore e possibilita' di selezionare<br>i campi da mostrare tra quelli disponibili.</b></td>
        </tr>
        <tr>
            <td colspan='4' height="50">&nbsp;</td>
        </tr>
        <tr>
            <td rowspan="8" width="90">Redattore:</td>
            <td rowspan="8" width="350">
                <select name="redattore">
                    <option value="">Effettua una selezione</option>
                    <option value="pippo">pippo</option>
                    <option value="pluto">pluto</option>
                    <option value="paperino">paperino</option>
                </select>
            </td>
            <td rowspan="8">Campi da visualizzare:</td>
            <td><input type="checkbox" name="fields[]" value="Tipologia" checked>Tipologia</td>
        </tr>
        <tr>
            <td><input type="checkbox" name="fields[]" value="NOME_RICETTA" checked>Nome ricetta</td>        
        </tr>
        <tr>
            <td><input type="checkbox" name="fields[]" value="Porzioni" checked>Porzioni</td>        
        </tr>
        <tr>
            <td><input type="checkbox" name="fields[]" value="Calorie" checked>Calorie</td>        
        </tr>
        <tr>
            <td><input type="checkbox" name="fields[]" value="Tempo_COTT" checked>Tempo cottura/preparazione</td>        
        </tr>
        <tr>
            <td><input type="checkbox" name="fields[]" value="Difficolta" checked>Difficolta</td>        
        </tr>
        <tr>
            <td><input type="checkbox" name="fields[]" value="Note" checked>Note</td>        
        </tr>
        <tr>
            <td><input type="checkbox" name="fields[]" value="Preparazione" checked>Preparazione</td>        
        </tr>
        <tr>
            <td colspan='4' height="150" align='center'><input type="submit" name="cerca" value="Visualizza"></td>
        </tr>
    </table>
</form>
</body>
</html>


e php


PHP:
<?php
$scelte = $_GET['fields'];
$redattore = $_GET['redattore'];

$cont = count($scelte);
$wh='where REDATTORE = '."'".$redattore."'";

echo '<br><h2><center>Redattore: '.$redattore.'</centr></h2><br><br>';

$stringacampi=implode(" , ",$scelte);

// nome di host
$host = "..........";
// username dell'utente in connessione
$db_user = "..........";
// password dell'utente
$db_psw = "..........";
// nome del database
$database = '..........';


//************stringa di connessione al DB*************

$connessione = new mysqli($host, $user, $password, $database);

// verifica su eventuali errori di connessione
if ($connessione->connect_errno) {
    echo "Connessione fallita: ". $connessione->connect_error . ".";
    exit();
}

if (!$result = $connessione->query("SELECT $stringacampi FROM RICETTE $wh")) {
    echo "Errore della query: " . $connessione->error . ".";
}else{
    // conteggio dei record
    if($result->num_rows > 0) {
       echo '<table width="900" align="center" cellspacing="0" cellpadding="10" border="1">';
       echo '    <tr  bgcolor="#D2D2D2">';
       for ($ind=0;$ind<$cont;$ind++) {
           echo '        <th>'.$scelte[$ind].'</th>';
       }
       echo '    </tr>';
       echo '    <tr>';
       while($row = $result->fetch_array(MYSQLI_ASSOC)) {
                  for ($ind=0;$ind<$cont;$ind++) {
                         echo '<td><center>'.$row[$scelte[$ind]].'</center></td>';
                  }  
                  echo '    </tr>';
       }
       echo '</table>';
       // liberazione delle risorse occupate dal risultato
       $result->close();
    }
}

?>

Bisogna fare sempre attenzione alla corrispondenza tra i nomi
 
  • Like
Reactions: username90
Il codice di Zorro è molto interessante, primo perchè utilizza l'estensione mysqli che è molto più performante e sicura della vecchia e ormai deprecata mysql, poi perchè utilizza l'approccio ad oggetti che rende il tutto più elegante ma sopratutto perchè per ogni eventuale errore mostra un messaggio e una descrizione, molto importante in fase di sviluppo.
Vorrei comunque fare un paio di osservazioni:
- non c'è nessun controllo sui dati ricevuti, questo potrebbe agevolare il lavoro di qualche malintenzionato ( SQL Injection )
- la connessione viene chiusa solo se presente almeno un record
- $wh = 'where REDATTORE = ' . "'" . $redattore . "'"; non sono convinto sull'uso degli apici
edit:
provati gli apici la stringa è corretta, sono solo abituato a vederla scritta cosi
PHP:
$wh = "where REDATTORE = '$redattore'";
 
Ultima modifica:

Discussioni simili