You are on page 1of 8

Encuestas con PHP y MySQL

Objetivo: Trabajar con MySQL, Base de Datos y Tablas Trabajar con Libreras de conexin, INCLUDE Generar un grfico de columnas con cdigo PHP

1. Crear la base de datos


Vamos a crear encuestas para nuestro sitio web. Para ello crearemos dos tablas en MySQL, una para controlar las encuestas propiamente y otra para las respuestas de cada encuesta. Tabla de encuestas: CREATE TABLE encuestas (id INT not null AUTO_INCREMENT, titulo VARCHAR (50) not null , fecha INT (10) not null , PRIMARY KEY (id));

Id: Es el identificador de la encuesta. Se incrementa automticamente y sirve de clave primaria. Titulo: Tendremos 50 caracteres para asignar un titulo que contendr la pregunta en s. Fecha: Servir tanto para conocer la fecha de la encuesta, como para que slo se muestre la ltima.

Tabla de respuestas: 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));

Id: Identificador de la respuesta. Se incrementa automticamente y sirve de clave primaria. Texto: Es el texto que describir la respuesta Votos: El total de votos acumulados. Idenc: Referencia al Id de la encuesta a la que est asociado.

2. Crear la Librera de Conexin a la Base De Datos Archivo: Conex.php <?php Function conectar(){ $servidor=localhost; $usuario=Administrador; $clave=encuesta123; $dbase=SistemaEncuesta; If (!($link=mysql_connect ($servidor, $usuario, $clave))){ Echo Error Conectando la Base de Datos; exit(); } If (!mysql_select_db ($dbase, $link)){ Echo Error Seleccionando la Base de Datos; exit(); } Return $link; } >

3. Crear una nueva Encuesta


La forma de crear una nueva encuesta ser sencilla; Un formulario nos pregunta el texto de la pregunta y el nmero total de respuestas. Damos a "Enviar". Acto seguido tendremos un campo de texto por cada respuesta, donde asignaremos el texto de la respuesta. Volvemos a dar a "Aceptar" y si todo ha ido bien, nuestra encuesta ya estar dada de alta en nuestra base de datos.

3.1.

Primer formulario: encuesta

enc1.php <html> <head> <title> Sistema de Encuesta </title> </head> <body> <form name="form1" method="post" action="enc2.php"> <p>Titulo de la encuesta: <input type="text" name="titulo"> </p> <p>N&uacute;mero de respuestas: <input type="text" name="respuestas"> </p> <p><input type="submit" name="Submit" value="Enviar"> </p> </form> </body> </html>

3.2.

Segundo formulario:

Dentro de enc2.php. Lo nico que hacemos en este formulario es poner la cantidad de campos de texto como posibles respuestas exista. enc2.php <html> <head> <title> Sistema de Encuesta </title> </head> <body> <form action="enc3.php" method="post"> <table border="0"> <?php for($i=1;$i<=$respuestas;$i++){ ?> <tr> <td>Respuesta <?php echo $i; ?></td>

<td><input name="p<?php echo $i;?>" type="text" size="50" maxlength="50"></td> </tr> <?php } ?> </table> <input type="submit" name="Submit" value="Enviar"></p> <input name="titulo" type="hidden" value="<?php echo $titulo;?>"> <input type="hidden" name="Respuestas" value="<?php echo $respuestas;?>"> </form> </body> </html>

El siguiente fichero (enc3.php) es el que se encarga de guardar los cambios en la base de datos. En un primero momento, guardamos tan solo la encuesta, con sus campos 'fecha' y 'titulo'. Posteriormente sacamos el 'id' asignado a nuestra encuesta (la ltima almacenada) para que al insertar las respuestas podamos hacer referencia al id de la encuesta a la que va asociada. enc3.php <html> <head> <title> Sistema de Encuesta </title> </head> <body> <?php //Conectar la base de datos require('conex.php'); $link=conectar (); //Obtenemos la fecha del sistema $fecha = time(); //Insertamos la nueva encuesta $sqlenc= "INSERT INTO encuestas (titulo, fecha) VALUES ('$titulo', '$fecha') "; $rsenc = mysql_query($sqlenc,$link); //Ahora obtenemos el ID de la encuesta que acabamos de insertar $sqlid = "SELECT id FROM encuestas ORDER BY fecha DESC LIMIT 0,1"; $rsid = mysql_query($sqlid, $link); while($row = mysql_fetch_array($rsid)){ $id=$row["id"]; }

//Recorremos todas las preguntas for($i=1; $i<=$respuestas; $i++){ //Obtenemos el texto de la pregunta $preg = p.$i; $texto = $preg; //Y lo insertamos $sql = "INSERT INTO respuestas(texto, votos, idenc) VALUES("$texto", 0, $id)"; $mysql = mysql_query($sql, $link); } ?> <div align="center"><strong>Bien hasta aca!! Si todo ha ido bien, tu encuesta ha sido insertada!! </strong> </div> </body> </html>

4.

Votar los resultados

Tal y como he planteado este sistema de encuestas, la nica que se mostrar ser la que tenga la fecha ms reciente, es decir, la ltima encuesta insertada. Cualquier modificacin para evitar este funcionamiento no creo que os suponga mucho esfuerzo. A continuacin Se tiene el cdigo del formulario para votar, la opcin que desee. Archivo encuesta.php <html> <head> <title>Sistema de Encuesta</title> </head> <body> <?php //Conectamos con la base de datos require('conex.php'); $link= conectar(); //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)){ $titulo=$row["titulo"]; $fecha=$row["fecha"]; $id=$row['id']; } ?> <form name="form1" method="post" action="votar.php"> <table width="350" border="1"> <tr> <td colspan="2"><strong>Titulo</strong>: <?php echo $titulo; ?> <input type="hidden" name="id" value="<?php echo $id;?>"></td> </tr> <?php $sql = "SELECT texto, id FROM respuestas WHERE idenc="$id""; $sql = mysql_query($sql,$link); while($row = mysql_fetch_array($sql)){ $texto=$row["texto"]; $idres=$row["id"]; ?> <tr> <td width="51"><input type="radio" name="opcion" value="<?php echo $idres; ?>"></td> <td width="283"><?php echo $texto; ?></td> </tr> <?php } ?> <tr>

<td><input type="submit" name="Submit" value="Enviar"></td> <td>Esta encuesta est; desde el <?php echo date('dd-mm-yyyy',$fecha); ?></td> </tr> <tr> <td colspan="2"><a href="votar.php">Ver resultados</a></td> </tr> </table> </form> </body> El cdigo que viene a continuacin, votar.php, de momento slo aade el voto a la base de datos: Ms adelante pondremos en ste mismo fichero el cdigo que aade la imagen con el grfico de barras votar.php <? require('conex.php'); $link =conectar();
mysql_connect($host, $us uari o, $passwor d); mysql_select _db ($db, $enlac e);

//Obtenemos el titulo de la encuesta $consulta = "SELECT titulo FROM encuestas ORDER BY fecha DESC LIMIT 1,0"; $consulta = mysql_query($consulta,$link); $lado=mysql_num_rows($consulta); while($row = mysql_fetch_array($consulta)){ $titulo= $row['titulo']; } //Obtenemos el nmero actual de votos para la opcin elegida Comprobamos si $opcion no est vaco porque posteriormente este mismo lo utilizaremos para ver resultados sin tener que votar nuevamente. 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)){ $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,$link); } echo Gracias por enviar la Votacin; echo <br>; echo <a ref=encuesta.php>Votar en al Encuesta</a>; ?> </body> </html>

5.

Mostrar el grfico de barras

Para realizar esto lo que haremos es crearnos un fichero que conectar con la base de datos y extraer la informacin necesaria. Crearemos una imagen, y le daremos formato con funciones de la librera gd. Quizs a muchos de vosotros os surja la duda, tal y como me ocurri a m, de cmo poner en funcionamiento esta librera: Se debe bajar (en caso de estar en Windows) el archivo php_gd.dll, copiarlo a la carpeta extensions de php y descomentar la lnea donde se hace referencia a la DLL en cuestin en el php.ini. El cdigo, aunque a alguno a primera vista nos intimide, realmente no tiene complicacin alguna, tan solo leemos de la base de datos y dibujamos los elementos de nuestro grfico de barras: NOTA: ste fichero ha de conectar con la base de datos. Para que funcione correctamente, hay que aadir que incluya conex.php directamente en el sitio que corresponda. Queda: dgrafica.php <?php //Conectar a la base de datos require(conex.php); $link = conectar(); //Obtenemos el titulo de la ltima encuesta para colocarlo como ttulo en nuestro grfico $sqlenc = "SELECT titulo, id FROM encuestas ORDER BY fecha DESC LIMIT 0,1"; $rsenc = mysql_query($consulta,$link); $lado=mysql_num_rows($rsenc); while($row = mysql_fetch_array($consulta)){ $titulo= $row['titulo']; $id=$row['id']; } //Obtenemos el nmero de votos de cada opcin y los metemos en "votos[]" $sqlres = "SELECT votos, texto FROM respuestas WHERE idenc=$id"; $rsres = mysql_query($consulta,$link); $lado=mysql_num_rows($rsres); while($row = mysql_fetch_array($rsres)){ //Guardamos el texto en la variable temp. Este texto nos servir como //ndice en el array votos[] $temp = $row['texto']; $votos[$temp]= $row['votos']; } //Variables del grfico $width = 700; //Ancho de la imagen $espacioCol = 50; //Espacio que habr del principio de una columna a otra $altoCol = 35; //El alto de las columnas $height = 2*count($votos)*$espacioCol+45; //El alto de la imagen $maxvoto = max($votos); //Valor de la opcion mas votada $maxlargo = $width-50; //Largo que tendr la opcin ms votada $coeficiente = (int)($maxlargo / $maxvoto); //Coeficiente para calcular el largo de cada opcion //Se crea la imagen con el alto y ancho ya asignados $image = imagecreate($width,$height); //Se declaran las variables para los colores. Gris ser el primer color que declaramos, ste se quedar como color de fondo en la imagen $gray = imagecolorallocate($image, 0xC0, 0xC0, 0xC0); $black = imagecolorallocate($image, 0x00, 0x00, 0x00); $blue = imagecolorallocate($image, 0x00, 0x00, 0xFF); //Recorremos el array 'votos' for($i=0; list($texto, $vot) = each($votos); $i++) {

$labelfont = 2; //Fuente empleada para etiquetas //Se dibujan las barras //Coordenadas para definir el rectngulo $valign = ($i+1)*$espacioCol + 15; $halign = 30; $valign2 = $valign + $altoCol; $halign2 = $halign+$vot*$coeficiente; imagefilledrectangle($image,$halign,$valign,$halign2,$valign2,$blue); //Ponemos el ndice de cada barra //Coordenadas para colocar los indices $indice = $i + 1; $halign = 15; imagestring($image, $labelfont, $halign, $valign, $indice, $black); //Leyenda: Numero de opcion + Texto + ( votos ) //Coordenadas para colocar la leyenda $valign = ($i+1)*$espacioCol + (count($votos)*$espacioCol)+ 15; $halign = 30; $leyenda = "Opcion ".$indice.": ".$texto." ($vot)"; imagestring($image, $labelfont, $halign, $valign, $leyenda, $black); } //Asignamos tipografa y colocamos el ttulo en la parte superior izquierda $titlefont = 3; imagestring($image, $titlefont, 10, 10, $titulo, $black); //Dibujamos el recuadro que encierra el contenido imagerectangle($image, $width - 5, 30, 5, $height - 5, $black); //Devolvemos la imagen header("Content-type: image/png"); imagepng($image); imagedestroy($image); ?> Una vez todo hecho, tan slo faltara incluir un pequeo detalle a nuestro cdigo. En el archivo que capta los votos (votar.php) se debe aadir el siguiente cdigo: <img src="dgrafica.php"> Esto sita una imagen del resultado final de una encuesta cualquiera:

You might also like