Come fare un sondaggio con Php e MySql
Salve a tutti………ci sono molte applicazioni web che un utente può usare per arricchire il proprio sito e renderlo più interessante e dinamico. Una di queste sono i sondaggi. Questo sondaggio (Ho messo delle squadre solo cosi per indicazione)che vi sto per illustrare e creato in php naturalmente appoggiandosi ad un database Mysql con qualche effetto di javascript. Non ho curato la grafica l’ho solo fatto funzionare poi ognuno sceglie la grafica migliore.
E’ molto facile da comprendere come state per vedere. Scusate gli “Orrori” di ortografia e altro……
Questa applicazione e ha i seguenti file….
- db_connect.php
- install.php
- scegli.htm
- vai.php
- guarda.php
- vota.gif
Guardiamoli uno per uno le loro funzionalità
1. db_connect.php
Questo è il file che verra incluso nei file vai.php, guarda.php. E il file di connessione a mysql e di selezione al database
PHP:
<?php
mysql_connect("localhost", "root") or die("Impossibile connettersi al database");
mysql_select_db("sondaggio") or die("Impossibile selezionare il database");
?>
Come si puo notare dopo essermi connesso al database seleziono la tabella sondaggio che ancora non ho creato ma che faro presto
2. install.php
Questo file è quello che uso per installare la mia tabella. Per sicurezza dopo aver creato la tabella cancello il file.Ora posto il codice e poi lo commentiamo zona per zona.
PHP:
<?php
$connessione=mysql_connect("localhost", "root") or die("Impossibile connettersi al database");
if ($connessione) {
echo "Connessione a mysql riuscita<br>";
}else{
echo" Connessione fallita<br>";
}
$database= mysql_create_db(sondaggio,$connessione);
if ($database) {
echo "Creazione database riuscita<br>";
}else{
echo" Creazione database fallita probabilmente c'e già<br>";
}
$db_name="sondaggio";
$selezione= mysql_select_db($db_name);
if ($selezione) {
echo "Selezione database riuscita<br>";
}else{
echo" Selezione fallita<br>";
}
$creatabella= "CREATE TABLE nomi (
id INT (5) UNSIGNED not null AUTO_INCREMENT,
italia DECIMAL,
portogallo DECIMAL,
spagna DECIMAL,
francia DECIMAL,
inghilterra DECIMAL,
PRIMARY KEY (id))";
$crea=mysql_query($creatabella,$connessione) or die("Impossibile eseguire la query <b>$ciao</b><a href=\"inserisci.php\"><br>Inserisci un messaggio</a><br><br><b>Errore</b>:".mysql_error());
if ($crea) {
echo "Creazione Tabella riuscita<br>";
}else{
echo" Creazione Tabella fallita<br>";
}
$creatabella= "INSERT INTO nomi (italia, portogallo, spagna, francia, inghilterra) VALUES ('0','0','0','0','0')";
$crea=mysql_query($creatabella) or die("Impossibile eseguire la query <b>$ciao</b><br><b>Errore</b>:".mysql_error());
if ($crea) {
echo "Inserimento riuscito<br>";
}else{
echo"Inserimento Fallito<br>";
}
mysql_close();
?>
Come si puo notare da codice queste sono le prime tre operazioni
- Mi collego al database
- Creo la tabella
- Seleziono la tabella
Dopo avere fatto questo cerchiamo di installare la tabella e strutturare il nostro database con
PHP:
$creatabella= "CREATE TABLE nomi (
id INT (5) UNSIGNED not null AUTO_INCREMENT,
italia DECIMAL,
portogallo DECIMAL,
spagna DECIMAL,
francia DECIMAL,
inghilterra DECIMAL,
PRIMARY KEY (id))";
$crea=mysql_query($creatabella,$connessione) or die("Impossibile eseguire la query <b>$ciao</b><a href=\"inserisci.php\"><br>Inserisci un messaggio</a><br><br><b>Errore</b>:".mysql_error());
if ($crea) {
echo "Creazione Tabella riuscita<br>";
}else{
echo" Creazione Tabella fallita<br>";
}
Come si nota creo una tabella nomi con i nomi delle squadre che nel campo hanno come descrizione DECIMAL (cosi dico a mysql che li andranno numeri decimali).
Poi faccio la query e la controllo. Il file non è pero finito qui perche subito dopo vi trovate questo codice
PHP:
$creatabella= "INSERT INTO nomi (italia, portogallo, spagna, francia, inghilterra) VALUES ( '0', '0', '0', '0', '0' )";
$crea=mysql_query($creatabella) or die("Impossibile eseguire la query <b>$ciao</b><br><b>Errore</b>:".mysql_error());
if ($crea) {
echo "Inserimento riuscito<br>";
}else{
echo"Inserimento Fallito<br>";
}
Questo codice grazie alla voce INSERT INTO mi fa inserire dati nei campi che io impostero a zero.Poi faccio la query e controllo. Avrei potuto agire in due modi:
Uno è quello di settare i campi a zero cosiche io ogni volta che si vota incremento di uno
L’altro era di lasciare stare pero poi quando si votava dovevo controllare che il campo non fosse nullo e quindi non devo incrementare ma mettere uno.
Mi spiego meglio
Nel primo caso quando si vota faccio in modo che php legga nel database e mi incrementi di uno il numero. Nel secondo(se non setto tutto i campi = a 0) php non riesce a
incrementarmi i dati di uno perche i campi hanno valore null, quindi io devo fare in modo che se il campo è vuoto si inserisca uno altrimenti si incrementi.
Siccome la via piu breve era la prima ho scelto quella.
3. scegli.htm
diamo un occhiatina veloce a questo file
<html>
<head>
<title>Sondaggio</title>
</head>
<body>
<form action="vai.php" method="post">
Italia<input type="radio" value="italia" name="paese"><br>
Spagna<input type="radio" value="spagna" name="paese"><br>
Portogallo<input type="radio" value="portogallo" name="paese"><br>
Francia<input type="radio" value="francia" name="paese"><br>
Inghilterra<input type="radio" value="inghilterra" name="paese"><br>
<input type="submit" value="VOTA">
</form>
</body>
</html>
Niente da spiegare qui un form semplice che punta a via.php con metodo post e usa il tipo radio passando il valore come nome.
4. vai.php
Innanzitutto includo il file di connessione
PHP:
<?php
include("db_connect.php");
$risultati_mysql=mysql_query("SELECT * FROM nomi ");
while ($riga1=mysql_fetch_array($risultati_mysql)) {
$id=$riga1["$paese"];
$idnuovo=($id + 1);
}
$sql="UPDATE nomi SET $paese='$idnuovo' ";
if(!mysql_query($sql)){
echo "Errore impossibile votare";
echo "<script>
function redirect(){
window.location.replace(\"scegli.htm\");
}
setTimeout(\"redirect()\", 2000);
</script>";
exit();
}else{
echo "Voto valido";
echo "<script>
function redirect(){
window.location.replace(\"guarda.php\");
}
setTimeout(\"redirect()\", 2000);
</script>";
}
mysql_close();
?>
Ecco cosa faccio dopo essermi collegato a mysql dopo aver selezionato la nostra tabella sondaggi.
Faccio una query di selezione(mysql_query(“SELECT * FROM nomi “)) e prendo tutta la tabella nomi. La inserisco in un array (mysql_fetch_array($risultati_mysql)
ed subito dopo in una variabile chiamata $id metto il valore della colonna chiamata $paese (che è il nome che passo tramite form selezionando il paese). Poi creo
una nuova variabile $idnuovo e gli assegno il valore della variabile $id +1 . Dopo aver fatto cio faccio UPDATE nomi SET $paese=’$idnuovo’ che praticamente modifica
il campo passato attraverso form con il nuovo valore. Dopidichè controllo che la query sia valida e nel caso sia errata lancio un javascript mandando l’utente alla pagia scegli.htm
altrimenti se la query e valida lo mando alla pagina guarda.php .
PHP:
$risultati_mysql=mysql_query("SELECT * FROM nomi ");
while ($riga1=mysql_fetch_array($risultati_mysql)) {
$id=$riga1["$paese"];
$idnuovo=($id + 1);
}
$sql="UPDATE nomi SET $paese='$idnuovo' ";
if(!mysql_query($sql)) {
echo "Errore impossibile votare";
echo "<script>
function redirect(){
window.location.replace(\"scegli.htm\");
}
setTimeout(\"redirect()\", 2000);
</script>";
exit();
}
5. guarda.php
In questo file dovete avere dimestichezza con le operazioni matematiche….
Dopo aver incluso il file di connessione seleziono la tabella nomi e la metto in un array. Poi creo delle variabili che contengono ognuna i valori dei
campi di ogni squadra. Praticamente in ogni variabile ci sta il numero dei voti ottenuti. Quindi per vedere quanti voti in totale abbiamo facciamo la somma
delle variabili
$totale=$spagna+$italia+$portogallo+$fra
ncia+$inghilterra;
La somma a noi ci serve per due motivi: uno e che vogliamo mostrare agli utenti quante persone fino ad ora hanno votato, l’altro dobbiamo fare la percentuale di ogni paese. Per fare la percentuale si fa (VOTI OTTENUTI) per 100 diviso (VOTI TOTALI).
$percspagna= $spagna*100/$totale;.
Per avere un sondaggio piu pulito io arrotondo il risultato a due cifre dopo la virgola con $s=round($percspagna, 2); $s e la variabile che contiene il nostro dato round e la funzione che arrotonda $percspagna e la percentuale e 2 sono le cifre massime dopo la virgola. Ora noi abbiamo ottenuto la percentuale. Questa io la usero per due motivi come per il totale: uno per mostrare agli utenti quanta percentuale ha un campo l’altra la uso per dimensionare la mia immagine. La percentuale che io ottengo non ha il simblo % dopo il numero quindi e solo un numero normale. Cioe se la spagna ha preso il 40% dei voti quando calcolo la percentuale la variabile $s conterra 40 e non 40%. Questa precisazione va fatta perche quando inseriro il valore per mostrare la percentuale devo aggiunfere manualmente il simbolo %. Quando devo mostrare la mia immagine è diverso perche modifico dinamicamente il width(GRAZIE BUBU BUBU). Se ho un immagine di 100px puo andare bene quella misura ma 100 px sono pochi. IO nel file
6. vota.gif
ho una gif lunga 300 px. Allora per prendere le dimensioni della nostra barra che ogni paese avrà (il grafico che andremo a creare) moltiplico il numero che ottengo dalla percentuale per 3.
Perché lo moltiplico per 3
E’ semplice: quanto ottengo la percentuale abbiamo detto prima che ottengo 40 e non 40%. Quindi la mia immagine avra di lunghezz 40 px(calcolo fatto su 100). La mia immagine e 300 px quindi tre volte il valore con cui si calcola la percentuale. Come potete vedere sotto e molto chiaro lo schema e per mettere in ordine ho usato il tag pre
PHP:
<?php
include("db_connect.php");
$risultati_mysql=mysql_query("SELECT * FROM nomi ");
while ($riga1=mysql_fetch_array($risultati_mysql))
{
$spagna=$riga1["spagna"];
$italia=$riga1["italia"];
$portogallo=$riga1["portogallo"];
$francia=$riga1["francia"];
$inghilterra=$riga1["inghilterra"];
}
$totale=$spagna+$italia+$portogallo+$francia+$inghilterra;
echo "In totale ci sono $totale voti";
$percspagna= $spagna*100/$totale;
$s=round($percspagna, 2);
$percitalia= $italia*100/$totale;
$i=round($percitalia, 2);
$percfrancia= $francia*100/$totale;
$f=round($percfrancia, 2);
$percportogallo= $portogallo*100/$totale;
$p=round($percportogallo, 2);
$percin= $inghilterra*100/$totale;
$n=round($percin, 2);
//ora faccio il calcono della lunghezza dell immagine
$s1=$s*3;
$i1=$i*3;
$p1=$p*3;
$f1=$f*3;
$n1=$n*3;
echo "<pre>";
echo "Spagna <img src=\"vota.jpg\" height=10 width=$s1> $s%<br>";
echo "Italia <img src=\"vota.jpg\" height=10 width=$i1> $i%<br>";
echo "Portogallo <img src=\"vota.jpg\" height=10 width=$p1> $p%<br>";
echo "Francia <img src=\"vota.jpg\" height=10 width=$f1> $f%<br>";
echo "Inghilterra <img src=\"vota.jpg\" height=10 width=$n1> $n%<br>";
echo " </pre>";
mysql_close();
?>
Questa applicazione puo essere implementata in tanti modi per far si che non si posssa votare piu di 1 volta in un giorno.
Si puo fare con i cookie oppure memorizzando l’ip..
Io vi mostro con i cookie come si fa…
Prendete il file vai.php e subito dopo <?php mettete
PHP:
if($paese){
setcookie ("sondaggio","cookie impostato",time()+86400,"/");
}
if($sondaggio){
echo "Si puo votare solo una volta al giorno";
exit();
}
Cioè se si passa un valore con $paese(perche uno puo provare anche a non votare) si setta un cookie chiamato sondaggio. Poi basta controllare se c’e.