Estás en Principal | Crear Foro |
Ver Comentarios | 7-09-2008
Por Dago Gonzalez
En este tutorial crearemos un simple sistema de encuestas desde cero.
Primero y antes que nada, debemos preparar la tabla en la base de datos que contendrá todos los temas de nuestro sistema de encuestas. Lo que estas tablas tendrán son la información de nuestro titulo de encuesta, fecha, las respuestas (opciones) y la cantidad de votos y otros datos que servirán para identificar a que encuesta pertenece una respuesta y su respectivo voto. Pero mejor, veamos la estructura propuesta:
CREATE DATABASE `mibasedatos`;
USE `mibasedatos`;
CREATE TABLE encuestas
(id INT not null AUTO_INCREMENT,
titulo blob not null ,
fecha datetime not null,
PRIMARY KEY (id));
CREATE TABLE respuestas
(id INT not null AUTO_INCREMENT,
texto VARCHAR (50) not null ,
votos INT (5) not null ,
idenc INT not null,
PRIMARY KEY (id));
INSERT INTO encuestas VALUES ('1','¿Quién ganará la EURO 2008?',now());
INSERT INTO respuestas VALUES ('1','ALEMANIA',0,'1');
INSERT INTO respuestas VALUES ('2','ITALIA',0,'1');
INSERT INTO respuestas VALUES ('3','FRANCIA',0,'1');
INSERT INTO respuestas VALUES ('4','INGLATERRA',0,'1');
INSERT INTO respuestas VALUES ('5','PORTUGAL',0,'1');
Veamos en detalle que campos tendrá la tabla "encuestas":
Y los campos de la tabla "respuestas" serán:
La sentencia SQL anterior, pueden guardarla en un archivo.sql y correrla en su base de datos desde el phpMyAdmin. Una vez que hayan creado la tabla en su base de datos, entonces podemos avanzar al siguiente paso.
Antes de ponernos a programar cualquier parte de este sistema, vamos a encargarnos de hacer un pequeño script que realice una tarea que vamos a repetir mucho, y que es conectarnos a la base de datos. Este script lo incluiremos en cada página en la que tengamos que acceder a la base de datos:
Ejemplo de la pagina de configuracion.inc.php<? $host = "localhost"; $usuario = "miusuario"; $password = "mipassowrd"; $db = "mibasedatos"; $enlace = mysql_connect($host, $usuario, $password); mysql_select_db($db,$enlace); ?>
Cómo vemos, no hay gran ciencia en este script, tan solo unas variables conteniendo la configuración de nuestra base de datos, y el código mínimo y necesario para conectarnos y guardar el recurso de conexión en una variable $enlace que luego utilizaremos cuando hagamos nuestras consultas.
Ya teniendo las bases de nuestro sistema de encuestas, el diseño de las tablas en la base de datos, podemos comenzar a crear la primera página, donde se mostrará la última encuesta (nuestro sistema permite ingresar muchas encuestas, pero tan solo se visualizará la última ingresada):
Ejemplo de la pagina de index.php<?php
//Conectamos con la base de datos
include('configuracion.inc.php');
//Seleccionamos la informacion de la última encuesta insertada
$consulta = "SELECT * FROM encuestas ORDER BY fecha DESC LIMIT 0,1";
$consulta = mysql_query($consulta,$enlace);
while($row = mysql_fetch_array($consulta))
{
//almacenamos en sus respectivas variables el titulo,
//fecha e id de la encuesta consultada
$titulo=$row["titulo"];
$fecha=$row['fecha'];
$id=$row['id'];
}
//EN LAS SIGUIENTES LINEAS MOSTRAREMOS: titulo con sus respectivas
//respuestas(opciones) con su respectivo texto, de la encuesta consultada
//abrimos un formulario cuya accion me llevará a vote.php
//y tambien mostramos el titulo:
echo '<form action="vote.php" method="post" name="form1" target="_blank">
<DIV align=center><input type="hidden" name="id" value="'.$id.'">
<FONT color="#333369" size="3"><strong>'.$titulo.'<BR></strong></FONT>
</DIV><TABLE width="100%" border=0><tbody>';
//Seleccionamos las respuestas (opciones) correspondientes
//a la encuesta: es decir cuyo idenc sea igual al id de la encuesta
$sql = "SELECT texto, id FROM respuestas WHERE idenc=\"$id\"";
$sql = mysql_query($sql,$enlace);
while($row = mysql_fetch_array($sql))
{
//almacenamos en sus respectivas variables el texto en $texto
//y el id en $idres de cada respuesta:
$texto=$row["texto"];
$idres=$row["id"];
//creamos botones del tipo radio: con nombre "opcion", valor igual a $idres, y mostramos el texto
// por cada respuesta que haya (nótese que el echo siguiente esta dentro del bucle while)
echo '<TR><TD vAlign=top><input type="radio" name="opcion" value="'.$idres.'">
</TD><TD width="100%"><font color="#333366">'.$texto;
}
//se tiene un boton tipo submit que al hacer click en Votar nos llevará a vote.php
//y registrá un tovo; también mostramos la fecha de publicación de la encuesta
echo '</font></TD></TR></tbody></TABLE><CENTER><FONT><INPUT type="submit" name="submit" value="Votar">
</FONT></CENTER></form><br>Encuesta desde : '.$fecha;
mysql_free_result($sql)
?>Bueno, en un comentario php del script anterior dije "abrimos un formulario cuya acción nos lleará a vote.php", me referia que despues de seleccionar la opción por quien vamos a votar, se da click en Votar para poder registrar el voto, esto me llevará a vote.php a quien -si se fijan bien en el codigo anterior- le estoy enviando el id de encuesta ($id) como campo oculto (type="hidden") por el URL y también envio el id de la opción votada ($idres).
Ejemplo de la pagina de vote.php<?
require('configuracion.inc.php'); //conectamos a la base de datos
//Obtenemos el titulo de la encuesta
$consulta = "SELECT titulo FROM encuestas ORDER BY fecha DESC LIMIT 1,0";
$consulta = mysql_query($consulta,$enlace);
$lado=mysql_num_rows($consulta);
while($row = mysql_fetch_array($consulta)){
$titulo= $row['titulo'];
}
//en 'opcion' esta el ID de la respuesta votada, entonces lo almacenamos en $opcion
$opcion=$_POST[opcion];
//Obtenemos el numero actual de votos para la opción elegida
//Comprobamos si $opcion no está vacío porque posteriormente este mismo
//fichero lo utilizaremos para ver resultados sin tener que votar necesariamente
if(!empty($opcion))
{
$consulta = "SELECT votos FROM respuestas WHERE id=$opcion";
$consulta = mysql_query($consulta,$enlace);
$lado=mysql_num_rows($consulta);
while($row = mysql_fetch_array($consulta))
{
//almacenamos la cantidad de votos de cada una de las respuestas
//nótese que estamos dentro del bucle while
$votos= $row['votos'];
}
//Incrementamos en uno los votos totales
$votos = $votos + 1;
//Y actualizamos la base de datos
$consulta = "UPDATE respuestas SET votos = $votos WHERE id=$opcion";
mysql_query($consulta,$enlace);
}
// mysql_free_result($consulta);
?>
<?php header("location: resultados.php");?>Enel script anterior, despues de registrar el voto, se mostrará la página de resultados, cuyo script se presenta a continuación:
Ejemplo de la pagina de resultados.php<?php
//Conectamos con la base de datos
require('configuracion.inc.php');
//Obtenemos el titulo de la última encuesta para colocarlo como título
//en nuestra grafica de resultados; lo de grafica es un decir, en realidad
//son imagenes con un ancho de acuerdo al % de votaciones je je
$consulta = "SELECT titulo,id,fecha FROM encuestas ORDER BY fecha DESC LIMIT 0,1";
$consulta = mysql_query($consulta,$enlace);
$lado=mysql_num_rows($consulta);
while($row = mysql_fetch_array($consulta))
{
$titulo= $row['titulo'];
$id=$row['id'];
$fecha= $row['fecha'];
}
//Obtenemos el numero de votos de cada opcion y los metemos en "votos[]"
$consulta = "SELECT votos, texto FROM respuestas WHERE idenc=$id";
$consulta = mysql_query($consulta,$enlace);
$lado=mysql_num_rows($consulta);
while($row = mysql_fetch_array($consulta)){
//Guardamos el texto en la variable temp. Este texto nos servirá como
//índice en el array votos[]
$temp = $row['texto'];
$votos[$temp]= $row['votos'];
}
//sacamos el total de votos: Hacemos una consulta que me devuelva
//la suma del campo votos y lo almacene en totalito
$consu = "SELECT SUM(votos) AS totalito FROM respuestas WHERE idenc=$id";
$consu = mysql_query($consu,$enlace);
$row_tot= mysql_fetch_array($consu);
$total=$row_tot["totalito"];
echo 'Resultados de la encuesta:'.$titulo.'</DIV>
<TABLE width="100%" border=0><TBODY>';
$sql = "SELECT texto, id, votos FROM respuestas WHERE idenc=\"$id\"";
$sql = mysql_query($sql,$enlace);
while($row = mysql_fetch_array($sql))
{
$texto=$row["texto"];
$idres=$row["id"];
//el if es para que no me salga error en division x cero cuando
//se inserta una nueva encuesta y no se ha ingresado respuestas todavía.
if ($total>0)
{
//sacar el % de los votos que tuvo cada respuesta
$res= round ($row["votos"]*100/$total,2);
}
else {$res=0;}
echo '<TR><TD><font color="#333366">'.$texto.'<br>
</font></TD>';
//las siguientes lineas son para Mostrar resultados ( el % o el numero de votos
//por cada opcion):
echo '<TD WIDTH="*"><IMG HEIGHT="15" WIDTH="'.$row["votos"]*100/$total.'
%" SRC="imagenes/aqua.gif">'.$res.'%</TD><TD ALIGN="center" WIDTH="70">'.
$row["votos"].'</TD></TR>';
}
echo '</TBODY></TABLE><TABLE width="100%" border=0><TD vAlign=top>
<br>Encuesta desde: '.$fecha.'</TD>
<TD vAlign=top><br>Total votos emitidos: '.$total.'</TD></TABLE>';
echo '<form name="form1" method="post" action=""><div align="center"><p>
<input type="submit" name="Submit" value="Volver" onClick="window.close();"></p>
<p> </p> </div></form>';
//ATENTO: si quieres puedes darle más formato html para mostrar resultados!!
?>Bueno, hasta aqui hemos hecho unos formularios para mostrar una encuesta; también te permite votar en la ultima encuesta publicada. Pronto agregaremos mas formularios para el mantenimiento (registrar, borrar una encuesta, agregar más respuestas a una encuesta, borrar respuestas de una encuesta, modificar la encuesta y sus respuestas, etc).
Si quieren más información sobre otras funciones en php: pueden visitar y consultar el manual de mySQL.
Realizar nuestro sistema de encuestas no es muy dificil, si sabemos utilizar mínimamente mySQL y PHP (más bien, tan solo ciertas funciones muy útiles del PHP). En estas pocas líneas aprendimos:
atte. Dago2007
fin
Nuestras Encuestas: Participa!!