Newsgroup: it.comp.www.php
Titolo: Problema con le sessioni

Salve a tutti,
sto realizzando un sondaggio in php, ma ho un problema.
Il sondaggio viene visualizzato in tutte le pagine del sito, ma io vorrei
che una volta che il visitatore abbia votato gli venissero mostrati i
risultati e non nuovamente il form con la possibilità di votare. Attualmente
succede il contrario, cioè se dopo che ho votato e visualizzato i risultati
cambio pagina, i risultati scompaiono e lasciano spazio nuovamente alla
form.
Ho pensato di usare le sessioni, facendo in modo che se una determinata
variabile è registrata, vengano mostrati i risultati, altrimenti venga
mostrato il sondaggio.
Inutile dire che non funziona altrimenti non sarei qui ;))
Questo è il codice completo ma è tutt'altro che definitivo, ora quello che
mi preme è farlo funzionare ;)
----------------------------------------------------------------------------
--------------
include ("include/config.inc.php");
if (!session_is_registered("ident")){
switch ($do) {
        case vote:
             session_register("ident");
             $conn2 = mysql_connect($hostname,$user,$pass);
             $nomecampo="votes".$resp;
             /*Aumenta il campo nel database corrispondente al voto
dell'utente*/
             $query="UPDATE $poll_table SET $nomecampo = $nomecampo+1 WHERE
id = $ident";
              $res = mysql_db_query($database, $query, $conn2);
              if(!$res){
                     echo "<li>Impossibile eseguire la query: $query";
                     echo "<li>Si è verificato il seguente errore:".
mysql_error();
                     echo "<a href=\"javascript:history.go(-1)\">torna
indietro</a> e riprova.";
                     mysql_close($conn2);
                     exit;
             }
             //prelevo i dati dal database
             $query = "SELECT question, response1, response2,
response3,response4,
                      votes1,votes2, votes3, votes4, date from $poll_table
WHERE id = $ident";
              $result = mysql_db_query($database, $query, $conn2);
              if(!$result){
                     echo "<li>Impossibile eseguire la query: $query";
                     echo "<li>Si è verificato il seguente errore:".
mysql_error();
                     echo "<a href=\"javascript:history.go(-1)\">torna
indietro</a> e riprova.";
                     mysql_close($conn2);
                     exit;
             }
             list($question, $response1, $response2, $response3, $response4,
$votes1, $votes2,
                 $votes3,$votes4, $date) = mysql_fetch_row($result);
              $total = $votes1 + $votes2 + $votes3 + $votes4;
              if($total>0){
                      $perc_votes1 = round(($votes1/$total)*100,2);
                     $perc_votes2 = round(($votes2/$total)*100,2);
                     $perc_votes3 = round(($votes3/$total)*100,2);
                     $perc_votes4 = round(($votes4/$total)*100,2);
             }
             else {
                     $perc_votes1 = $votes1;
                     $perc_votes2 = $votes2;
                     $perc_votes3 = $votes3;
                     $perc_votes4 = $votes4;
             }
             echo "Grazie per aver votato.<p>\n";
             echo "Ecco i risultati del sondaggio fino a questo
momento:<p>\n";
             /*inizio tabella contenente risultati*/
             echo "<table border=0 cellspacing=0 cellpadding=3>\n";
             echo "<tr><td colspan=4><b>".$question."</b></td></tr>\n";
             echo "<tr
style=\"color:#009933\"><td><br>".$response1."</td><td><br>".$votes1."
(".$perc_votes1."%)</td></tr>\n";
             echo "<tr
style=\"color:#000066\"><td>".$response2."</td><td>".$votes2."
(".$perc_votes2."%)</td></tr>\n";
             echo "<tr
style=\"color:#009933\"><td>".$response3."</td><td>".$votes3."
(".$perc_votes3."%)</td></tr>\n";
             echo "<tr
style=\"color:#000066\"><td>".$response4."</td><td>".$votes4."
(".$perc_votes4."%)</td></tr>\n";
             echo "<tr><td><br><font size=-2>Postato il
".$date."</font></td>\n";
             echo "<td><br><font size=-2>".$total." voti
totali</font></td></tr>\n";
             echo "</table><p>\n";
             echo"&nbsp;<a href=\"archive.php\" style=\"font-family:
Verdana; text-decoration:underline; font-size: 7 pt; color:
#000000;\">Sondaggi precedenti</a>\n";
              mysql_close($conn2);
             break;
        default:
                //se non ha ancora votato mostra il form
                if(!isset($sub)){
                         $conn = mysql_connect($hostname,$user,$pass);
                         if(!$conn){
                                echo "<li>Impossibile eseguire la query:
$query";
                                echo "<li>Si è verificato il seguente
errore:". mysql_error();
                                mysql_close($conn);
                                exit;
                        }
                        $query = "SELECT id, question, response1, response2,
response3, response4 from $poll_table
                                 ORDER BY id DESC LIMIT 0,1";
                         $sond = mysql_db_query($database,$query,$conn);
                         if(!$sond){
                                echo "<li>Impossibile eseguire la query:
$query";
                                echo "<li>Si è verificato il seguente
errore:". mysql_error();
                                mysql_close($conn);
                                exit;
                        }
                        //controlla se ci sono sondaggi...
                        if (mysql_num_rows($sond) > 0){
                                list ($id, $question, $response1,
$response2, $response3, $response4) = mysql_fetch_row($sond);
                        }
                        //...altrimenti mostra messaggio
                        else {
                                echo "Al momento non è disponibile nessun
sondaggio";
                                mysql_close($conn);
                                exit;
                        }
                        //visualizza form
                        echo"<form method=\"post\" name=\"pollform\"
action=\"$PHP_SELF?do=vote\">\n";
                        echo"<b>".$question."</b><p>\n";
                        echo"<input type=\"Radio\" name=\"resp\" value=\"1\"
accesskey=\"1\">".$response1."<p>\n";
                        echo"<input type=\"Radio\" name=\"resp\" value=\"2\"
accesskey=\"2\">".$response2."<p>\n";
                        echo"<input type=\"Radio\" name=\"resp\" value=\"3\"
accesskey=\"3\">".$response3."<p>\n";
                        echo"<input type=\"Radio\" name=\"resp\" value=\"4\"
accesskey=\"4\">".$response4."<p>\n";
                        echo"<input type=\"hidden\" name=\"ident\"
value=\"".$id."\"><p>\n";
                        echo"<input type=\"submit\" name=\"sub\"
value=\"Vota\"
                        style=\"font-family: Verdana; font-size: 8 pt;
color: #000000; background-color: #B8CADC; border-style: solid;
border-width: 1\"><p>\n";
echo"&nbsp;<a
href=\"javascript:MM_openBrWindow('result.php?id=$id','risultati','width=230
, height=170' )\"
                        style=\"font-family: Verdana;
text-decoration:underline; font-size: 7 pt; color: #000000; ;
\">Risultati</a>&nbsp;\n";
                        echo"&nbsp;<a href=\"archive.php\"
style=\"font-family: Verdana; text-decoration:underline; font-size: 7 pt;
color: #000000;\">Sondaggi precedenti</a>\n";
                        echo"</form><p>\n";
                }
                //visualizza questo messaggio se è stato premuto il pulsante
Invia senza votare
                elseif(isset($sub) && !isset($resp)){
                        echo "Devi scegliere una risposta !,<br><a
href=\"javascript:history.go(-1)\">torna indietro</a> e riprova.";
                        exit;
                }
                break;
}//fine switch
}//fine if
//se la var è registrata mostra risultati
else {
        $conn3 = mysql_connect($hostname,$user,$pass);
        list($question, $response1, $response2, $response3, $response4,
$votes1, $votes2,
             $votes3,$votes4, $date) = mysql_fetch_row($result);
        // Voti totali
        $total = $votes1 + $votes2 + $votes3 + $votes4;
        if($total>0){
                // calcola voti percentuali arrotondati alla seconda cifra
                $perc_votes1 = round(($votes1/$total)*100,2);
                $perc_votes2 = round(($votes2/$total)*100,2);
                $perc_votes3 = round(($votes3/$total)*100,2);
                $perc_votes4 = round(($votes4/$total)*100,2);
        }
        else {
                $perc_votes1 = $votes1;
                $perc_votes2 = $votes2;
                $perc_votes3 = $votes3;
                $perc_votes4 = $votes4;
        }
        echo "Grazie per aver votato.<p>\n";
        echo "Ecco i risultati del sondaggio fino a questo momento:<p>\n";
        echo "<table border=0 cellspacing=0 cellpadding=3>\n";
        echo "<tr><td colspan=4><b>".$question."</b></td></tr>\n";
        echo "<tr
style=\"color:#009933\"><td><br>".$response1."</td><td><br>".$votes1."
(".$perc_votes1."%)</td></tr>\n";
        echo "<tr
style=\"color:#000066\"><td>".$response2."</td><td>".$votes2."
(".$perc_votes2."%)</td></tr>\n";
        echo "<tr
style=\"color:#009933\"><td>".$response3."</td><td>".$votes3."
(".$perc_votes3."%)</td></tr>\n";
        echo "<tr
style=\"color:#000066\"><td>".$response4."</td><td>".$votes4."
(".$perc_votes4."%)</td></tr>\n";
        echo "<tr><td><br><font size=-2>Postato il ".$date."</font></td>\n";
        echo "<td><br><font size=-2>".$total." voti
totali</font></td></tr>\n";
        echo "</table><p>\n";
        echo"&nbsp;<a href=\"archive.php\" style=\"font-family: Verdana;
text-decoration:underline; font-size: 7 pt; color: #000000;\">Sondaggi
precedenti</a>\n";
        //chiudi connessione
        mysql_close($conn3);
}
----------------------------------------------------------------------------
---------------

> if (!session_is_registered("ident")){
Non e' il modo corretto di usare le sessioni !
Ti faccio una breve introduzione. Prima di tutto le sessioni servono per
propagare automaticamente nelle pagine di un sito il valore di variabili che
specifichi con la funzione session_register. Se pero' chiudi e riapri il
sito i valori nelle sessioni si reinizializzano, si capisce comunque anche
dal nome "sessione" quindi relativo alla sessione :-)
Se per esempio volessi propagare il valore della variabile $lang, ovvero la
lingua dovrei fare qualcosa del genere:
1) In tutte le pagine che usano le sessioni (tutto il sito) devi mettere
session_start(); cosi' da inizializzare tutte le variabili al loro valore
registrato nella sessione, che puo' essere registrata anche una volta sola
(parlo del session_register).
2) registrare le variabili, es: session_register("lang"); quindi senza la $.
3) assegnargli un valore $lang = "ita";
Adesso in tutte le pagine del sito avrai la variabile $lang con valore "ita"
Per il tuo problema io metterei intanto all' inizio dello script:
session_start();
session_register("voto");
$voto = 0;
Poi in caso di voto assegnerei $voto = 1
Adesso puoi fare il controllo sulla variabile $voto e vedrai che funziona !
--
---------------------------------------
Damiano Trisciani - 
dam...@tnx.it
Webmaster & Sysadmin of:
http://www.astrofili.org
 - Il portale per l' astronomia in Italia
http://www.tnx.it
 - The Network eXperience

 (parlo del session_register).
Ci sono riuscito !
Ho incluso in tutti i file queste righe (le ho messe in un file esterno):
session_start();
session_register("voto")
session_register("ident") (questo per un altro motivo)
Prima avevo messo anche $voto=0, ma cosě facendo non funzionava.
A me serve che se voto=0 mi esegue un pezzo di codice, se voto != 0 ne
esegue un altro.
Includendo ogni volta $voto=0, mi eseguiva sempre lo stesso pezzo di codice
!
Poi ho cambiato la riga:
if (!session_is_registered("ident") con
if($voto==0)
e la riga:
session_register("ident"); con
$voto=1;
Ora finalmente funziona bene.
Grazie mille per l'aiuto e per la spiegazione!

 !
Mi fa' piacere di esserti stato di aiuto
Vero, hai fatto bene a correggere, comunque i vari session_register puoi
usarli una sola volta, nelle altre pagine del sito basta session_start();
