Você está na página 1de 10

Tu mejor ayuda para aprender a hacer webs

www.desarrolloweb.com

Sistema de encuestas PHP y


MySQL

Autores del manual


Este manual ha sido realizado por los siguientes colaboradores de DesarrolloWeb.com:
Carlos Eduardo Sotelo Emmanuel García De Caro
Pinto Webmaster de Blasten.com
Pregrado de Ingeniería de Sistemas http://www.blasten.com
http://www.iespana.es/mysqlweb/ (1 capítulo)
(4 capítulos)

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 1


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

Sistema de encuestas. Base de datos a utilizar


Algunas veces deseamos saber ciertas preferencias de los visitantes de nuestra pagina o qué
opiniones tienen sobre algún tema específico. Una solución a esto es tener un sistema de
encuestas, el cual contenga opciones, las cuales podamos votar. Antes de empezar debemos
tener en cuenta que nuestro sistema de encuesta debe tener los siguientes requerimientos.
• Permitir al usuario votar ente un numero de opciones predefinidas
• Permitir al usuario ver el resultado de las encuestas
• Permitir al usuario conocer el total de la población evaluada al momento de la lectura de
las encuestas
• Los resultados se mostraran en forma gráfica y numeral
Las páginas y otros archivos del sistema de encuestas que vamos a describir en este manual
están a vuestra disposición en un zip.
Referencias: Este manual supone que el lector tiene conocimientos, aunque sean básicos, sobre las
tecnologías PHP y MySQL. En DesarrolloWeb disponemos del material necesario para disponer de dicha
base, principlamente en nuestra sección PHP a fondo, y particularmente en nuestro Manual de PHP y el
Taller de MySQL.

Para resolver esto utilizaremos una base de datos con dos tablas, una correspondiente a las
opciones de la encuesta y la otra para los datos del administrador.
Nota: La tabla de administración no afecta directamente al funcionamiento del sistema de encuestas.
Simplemente serviría para guardar nombres de usuario y clave de las personas que podrían administrar la
aplicación de encuestas. No la vamos a ver por ahora, aunque os remitimos al manual de Sistema de
autentificación PHP, donde enseñamos a construir un sistema protegido por usuario/clave.
Asímismo, queremos indicar que la creación de la base de datos podría variar dependiendo del
desarrollador que la realice, pudiendo haber otras opciones también interesantes para modelizar este
sistema de encuestas.

Nuestra primera tabla constará de 11 campos de la siguiente manera.


1. Un campo para la pregunta de la encuesta
2. Cuatro posibles respuestas, las cuales serán las que nos interesa saber
3. Cuatro valores acumulativos del número de votos por cada respuesta
4. Un campo para el valor total de votos
Hasta ahora sólo hemos indicado 10 campos. El campo 11, que en realidad es el primero, es
nuestra clave primaria de la tabla. El script SQL para la creación de la tabla se encuentra a
continuación.

DROP TABLE IF EXISTS tblenc;


CREATE TABLE tblenc (
encid int(11) NOT NULL auto_increment,
encprg varchar(50) default NULL,
encrpt1 varchar(50) default NULL,
encrpt2 varchar(50) default NULL,
encrpt3 varchar(50) default NULL,
encrpt4 varchar(50) default NULL,
encval1 int(11) NOT NULL default '0',
encval2 int(11) NOT NULL default '0',
encval3 int(11) NOT NULL default '0',
encval4 int(11) NOT NULL default '0',
enctot int(11) NOT NULL default '0',
PRIMARY KEY (encid)
) TYPE=MyISAM;

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 2


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

Artículo por Carlos Eduardo Sotelo Pinto

Imagenes y páginas a utilizar en el sistema de encuestas


Será importante tener cuatro imágenes, las cuales servirán para mostrar el resultado gráfico
de la encuesta. Cabe recalcar que el tamaño de las imágenes se puede expresar en forma
porcentual respecto de la posición donde se encuentra. Así

<IMG HEIGHT="5" WIDTH="100%" SRC="imagenes/barra1.gif">

Las imágenes que tendremos serán las siguientes:


barra1.gif
barra2.gif
barra3.gif
barra4.gif

Las páginas involucradas

Antes de empezar a meternos con el código PHP de este sistema de encuestas vamos a
describir las principales páginas involucradas.

Página que muestra la encuesta


Tendremos una primera página donde podremos ver la encuesta actual, con sus diferentes
respuestas, colocadas dentro de un formulario. Podremos elegir una respuesta y enviarla para
la contabilización del voto.

Página que contabiliza el voto y muestra los resultados


La segunda página es la que recibe los datos del formulario y los registra en la tabla de la
encuesta, añadiendo una unidad a la respuesta escogida y al campo donde introducimos el
número total de respuestas. Posteriormente, esta misma página mostrará una tabla con los
resultados parciales de la encuesta, después de la contabilización del voto emitido por el
usuario.

Página de administración
No la vamos a ver, por lo menos todavía. Serviría para editar los datos de una encuesta o crear
encuestas nuevas. Sería sólo accesible por el administrador de la página.

Artículo por Carlos Eduardo Sotelo Pinto

Página que muestra la encuesta


Ahora diseñaremos nuestro formulario de encuesta. Este formulario deberá conectarse a
nuestra base de datos para obtener la pregunta y las posibles respuestas.

Aunque nuestro sistema está preparado para mostrar una única encuesta, la base de datos es
capaz de guardar varias. De este modo podríamos tener la encuesta actual y el histórico de

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 3


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

todas las encuestas que se han realizado en la página. La última encuesta introducida será la
que se mostrará en la página actual.

Imagen ejemplo de una encuesta

Para extraer la última encuesta introducida se utilizará una sentencia SQL en la que se
ordenarán las encuestas por su identificador, de manera descendente.

SELECT * FROM tblenc order by encid desc

Otro detalle en el que debemos fijarnos es en la creación de un campo hidden (oculto) de


formulario para enviar a la página de resultados el identificador de la encuesta a la que se está
votando.

<?
$servidor="localhost";
$usuario="nobody";
$password="nobody";
$base="encuesta";
$SQLid = mysql_connect($servidor,$usuario,$password);
mysql_select_db($base,$SQLid);
$SQLquery = "SELECT * FROM tblenc order by encid desc";
$SQLresult = mysql_query($SQLquery,$SQLid);
$SQLrow = mysql_fetch_array($SQLresult);
?>
<form name="form1" method="post" action="encuesta.php">
<input type=hidden name="encid" value="<?echo $SQLrow[0]?>">
<table width="270" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td bgcolor="#006600"><font color="#FFFFFF" size="1" face="Verdana, Arial, Helvetica, sans-
serif">::::::::::::::::::::::::::::::::::::::</font></td>
</tr>
<tr>
<td bgcolor="#FFFFCC"> <div align="center"><font size="2" face="Verdana, Arial, Helvetica, sans-
serif"><strong>
<? echo $SQLrow[1]?>
</strong></font></div></td>
</tr>
<tr>
<td bgcolor="#FFFFCC"> <p> <font size="2">
<label>
<input type="radio" name="voto" value="1">
<? echo $SQLrow[2]?></label>
<br>
<label>
<input type="radio" name="voto" value="2">
<? echo $SQLrow[3]?></label>
<br>

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 4


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

<label>
<input type="radio" name="voto" value="3">
<? echo $SQLrow[4]?></label>
<br>
<label>
<input type="radio" name="voto" value="4">
<? echo $SQLrow[5]?></label>
<br>
</font></p></td>
</tr>
<tr>
<td bgcolor="#FFFFCC"> <div align="center">
<input type="submit" name="Submit" value="Aceptar">
</div></td>
</tr>
</table>
</form>

Esta página almacena en una variable llamada voto el valor de la respuesta de nuestro
encuestado, para luego ser enviada a la página de resultados.

Artículo por Carlos Eduardo Sotelo Pinto

Página que contabiliza y muestra los resultados de la


encuesta
Ahora definimos nuestra pagina de resultados, la cual, lo primero que deberá hacer, es obtener
el valor de la variable voto y del identificador de la encuesta que se ha votado.

Para poder actualizar nuestra base de datos con el objetivo de registrar el voto recibido,
usaremos una instrucción de este tipo:

UPDATE tblenc SET encval$voto = encval$voto+1, enctot = enctot+1 where encid=$encid

Como podemos observar, utilizamos el valor de la variable voto como parte del nombre del
campo a evaluar, incrementamos el mismo e incrementamos el campo total, que es donde se
acumulará el número de votos realizados. Para asegurarnos de que se incrementan sólo los
votos relacionados con la encuesta actual, con el enunciado where, limitamos la actualización
solamente a la encuesta con el identificador recibido del formulario.

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 5


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

Imagen ejemplo de los resultados de una encuesta

Finalmente, nuestra página mostrará el resultado de la encuesta, aquí dimensionaremos el


tamaño de las imágenes para mostrar los resultados mediante porcentajes, los cuales serán
obtenidos por la división del número de votos de una respuesta multiplicado por cien, entre el
número total de votos. Así.

<IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval1"]*100/$SQLrow["enctot"]?>%" SRC="imagenes/barra1.gif">

Nuestro script quedará de la siguiente manera:

<?
//recibo el voto
$voto = $_POST["voto"];
//recibo el id de la encuesta
$encid = $_POST["encid"];

$servidor="localhost";
$usuario="Administrador";
$password="";
$base="prueba";
$SQLid = mysql_connect($servidor,$usuario,$password);
mysql_select_db($base,$SQLid);
$SQLquery = "UPDATE tblenc SET encval$voto = encval$voto+1, enctot = enctot+1 where encid=$encid";
$SQLresult = mysql_query($SQLquery,$SQLid);
$SQLquery = "SELECT * FROM tblenc where encid=$encid";
$SQLresult = mysql_query($SQLquery,$SQLid);
$SQLrow = mysql_fetch_array($SQLresult);
?>
<P ALIGN="center"><font size="4"><strong><em>RESULTADOS PARCIALES DE LA
ENCUESTA</em></strong></font></P>
<P ALIGN="center"><strong><font size="2" face="Verdana, Arial, Helvetica, sans-serif">
<?
echo $SQLrow["encprg"]
?>
</font></strong></P>
<TABLE ALIGN="center" WIDTH="75%" BORDER="0" CELLSPACING="1" CELLPADDING="1">
<!--DWLayoutTable-->
<TR>
<TD ALIGN="left" WIDTH="23%"><? echo $SQLrow["encrpt1"]?>
<div align="left"></div></TD>
<TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval1"]*100/$SQLrow["enctot"]?>%"
SRC="imagenes/barra1.gif"></TD>
<TD ALIGN="center" WIDTH="14%"><? echo $SQLrow["encval1"]?> votos</TD>
</TR>

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 6


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

<TR>
<TD ALIGN="left"><? echo $SQLrow["encrpt2"]?>
<div align="left"></div></TD>
<TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval2"]*100/$SQLrow["enctot"]?>%"
SRC="imagenes/barra2.gif"></TD>
<TD ALIGN="center"><? echo $SQLrow["encval2"]?> votos</TD>
</TR>
<TR>
<TD ALIGN="left"><? echo $SQLrow["encrpt3"]?>
<div align="left"></div></TD>
<TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval3"]*100/$SQLrow["enctot"]?>%"
SRC="imagenes/barra3.gif"></TD>
<TD ALIGN="center"><? echo $SQLrow["encval3"]?> votos</TD>
</TR>
<TR>
<TD ALIGN="left"><? echo $SQLrow["encrpt4"]?>
<div align="left"></div></TD>
<TD><IMG HEIGHT="5" WIDTH="<? echo $SQLrow["encval4"]*100/$SQLrow["enctot"]?>%"
SRC="imagenes/barra4.gif"></TD>
<TD ALIGN="center"><? echo $SQLrow["encval4"]?> votos</TD>
</TR>
</TABLE>
<P ALIGN="center">Total de votos emitidos: <? echo $SQLrow["enctot"]?></P>

Sólo queda definir la página de administración de la encuesta, la cual deberá contar con un
administrador que haga posible la alteración de estos datos, esto se puede hacer con un
sistema de autentificación con clave encriptada para dar seguridad, también se puede utilizar
cookies y/o sesiones para que un usuario no vote mas de una vez en la página, y otros trucos
que pueden ser de gran utilidad para este sistema. Pero ya no son tema de estudio de este
manual. Queda al ingenio del desarrollador y a los requerimientos del sistema.

Artículo por Carlos Eduardo Sotelo Pinto

Otro ejemplo de encuesta con PHP y MySQL


Realizaremos una sencilla encuesta; pero muy funcional y sutil, utilizada en muchos sitios web
como una recolecta de opiniones y preferencias ante opciones y una pregunta central.

Para ello utilizaremos una tabla de datos Mysql.


Referencia: Existen una serie de artículos acerca de la creación de una encuesta en PHP, tratados con
anterioridad en DesarrolloWeb.com.

Estructura de la tabla:

CREATE TABLE `encuesta_blt` (


`id_encuesta` varchar(5) NOT NULL default '',
`id_opcion` varchar(5) NOT NULL default '',
`ip` varchar(15) NOT NULL default '' )
TYPE=MyISAM;

El código Fuente:

encuesta_blt.ini.php

<?

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 7


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

mysql_connect('localhost','root','')or die('ERROR EN LA CONEXION :'.mysql_error());


mysql_select_db('base_de_datos_')or die('ERROR AL ESCOJER LA BD :'.mysql_error());

function show_encuesta($id_ENCUESTA,$proteccion_IP){
// COLOCO TODAS MIS PREGUNTAS Y OPCIONES
$encuesta[1]=array('¿Que Tecnologia utilizas?',array('Php','Asp','ColdFusion','Cgi','Perl','Jsp','Otra'));
//END
if (!array_key_exists($id_ENCUESTA,$encuesta)) return ('El id de la encuesta no se encuentra disponible');
else
$pregunta_de_la_encuesta = array_shift($encuesta[$id_ENCUESTA]);
$opciones_de_la_encuesta = array_pop ($encuesta[$id_ENCUESTA]);
if(isset($_POST[opcion])){
$ssqls=mysql_query('SELECT * FROM encuesta_blt WHERE ip="'.$REMOTE_ADDR.'"')or die(mysql_error());
if($proteccion_IP && mysql_num_rows($ssqls)>=1){
$html_encuesta='<font color="#FF0000" face="tahoma" size="2"><strong>Ya usted tiene un voto
registrad</strong>o </font>';
}
else {mysql_query('INSERT INTO encuesta_blt VALUES("'.$id_ENCUESTA.'","'.$_POST[opcion].'","'.
$REMOTE_ADDR.'")')or die(mysql_error()); }
}

$ssql=mysql_query('SELECT * FROM encuesta_blt WHERE id_encuesta="'.$id_ENCUESTA.'"')or die(mysql_error());


$total_votos=mysql_num_rows($ssql);

// IMPRIMIR LOS RESULTADOS.


$html_encuesta.='<form action="'.$_SERVER[REQUEST_URI].'" method="POST">';
$html_encuesta.= '<strong>'.$pregunta_de_la_encuesta.'</strong>';
$html_encuesta.='<br>';
foreach($opciones_de_la_encuesta as $KEY => $OPCION){
$ssql=mysql_query('SELECT * FROM encuesta_blt WHERE id_encuesta="'.$id_ENCUESTA.'" and id_opcion="'.
$KEY.'"')or die(mysql_error());
$votos_x_opcion=mysql_num_rows($ssql);
$estimar_porcentaje= @round($votos_x_opcion*100/$total_votos,1);
$html_encuesta.= '<input name="opcion" type="radio" value="'.$KEY.'"';
if($_POST[opcion]==$KEY && isset($_POST[opcion])){$html_encuesta.='checked'; }

$html_encuesta.= '>'.$OPCION.' '.$estimar_porcentaje.'% <strong>Votos: '.$votos_x_opcion.'</strong> <br>';


}

$html_encuesta.='<br><input type="submit" value="Votar">';


$html_encuesta.='</form>';
return $html_encuesta;
}
?>

Explicación del código


Antes que nada, como de costumbre crearemos la conexión con el servidor Mysql y
seleccionaremos la base de datos con la cual trabajaremos.

Definiremos una función con el nombre de show_encuesta($id_encuesta, $proteccion_IP),


donde $id_encuesta, se refiere al identificador de la encuesta que utilizaremos. Este sistema
esta adaptado para soportar un sin fin de encuestas, y $proteccion_IP cuyo valor debe ser
siempre un booleano (TRUE ó FALSE) y es el encargado de no permitir que un usuario vote
más de una vez, utilizando su dirección IP como referencia.

Asociamos en un array multidimencional el contenido de nuestra encuesta:


$encuesta[1]=array('Pregunta ',array('A','B','C','D','E','…',));

Donde 1, es el identificador de nuestra encuentra, si queremos insertar una nueva pregunta


utilizaremos $encuesta [2] y así sucesivamente siguiendo el esquema, en orden ascendente,
cabe destacar que no podemos repetir el valor numérico, ya que cambiaríamos el contenido

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 8


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

por este ultimo. Pregunta, es la pregunta central de la encuesta y A,B,C,D,E,… son las opciones
a elegir por los usuarios. Podemos utilizar un sin fin de opciones siempre y cuando sigamos el
esquema.

Luego utilizamos la función array_key_exists(), para verificar que existe el identificador de la


encuesta, esta función comprueba si existe el índice o la clave de un array. Colocamos el (!) al
comienzo para indicar si la condición de la función anterior devuelve FALSE, para retornar un
mensaje de error; return ('El id de la encuesta no…);

Agruparemos en la variable $pregunta_de_la_encuesta, el primer valor de la matriz


$encuesta[$id_ENCUESTA] con la función array_shift(), lo que seria prácticamente lo mismo
utilizando $encuesta[$id_ENCUESTA][0]., pero en este caso usamos una función definida en
PHP para este rol; como es el caso de array_pop(), que nos extrae el ultimo valor de la matriz
$encuesta[$id_ENCUESTA], que seria a su vez otra matriz o array con todas nuestras opciones
de la pregunta: array('A','B','C','D','E','…',)

Comprobaremos si $_POST[opcion] esta definida o toma algún valor, donde opcion, es el


nombre del botón de OPCIÓN o Radio. Si esta condición evalúa TRUE, indica que se ha hecho
clic sobre alguna opción y se ha procesado el formulario.

Para ejecutar las siguientes instrucciones:

Enviaremos una petición al servidor Mysql con mysql_query(consulta…) para obtener todos los
registros donde coinciden la fila IP, con la dirección IP del cliente $REMOTE_ADDR, utilizando la
cláusula WHERE. Luego iniciamos una nueva condición, ahora indicando si $proteccion_IP es
TRUE y (Lógico &&) el total de registros de la consulta anterior es igual o mayor a 1. Para
generar un mensaje de error e impedir el registro del nuevo voto.

Algo como:
Mi IP es : 127.0.0.1

Ejecuto la consulta Mysql y me indica que ya esa IP esta registrada en un voto anterior.
El valor que asigne a $proteccion_IP cuando llame mi función es TRUE .
Entones estos dos valores son VERDADEROS. Y el programa me responde bye, bye, bye. Ya
usted voto…

Si $proteccion_IP fuera FALSE, entonces si puedo votar un montón de veces a si ya este


registrada la IP

De lo contrario ( else )
Se inserta un nuevo registro con datos esenciales para el funcionamiento de esta encuesta.

Fin del else

A partir de este punto trabajaremos sin importar si esta definida o no $_POST[opcion].

Realizando una nueva consulta a Mysql, para obtener el total de registro correspondiente a la
encuesta que esta corriendo. Para utilizar este valor en el calculo del porcentaje de cada
opción.

$html_encuesta, esta variable contendrá el resultado que se imprimirá en pantalla, por eso se
usan conectores (.=) y su contenido son etiquetas de HTML, con el formulario y los demás

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 9


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.
Tu mejor ayuda para aprender a hacer webs
www.desarrolloweb.com

textos.

Utilizamos el práctico bucle FOREACH, para hacer un recorrido rápido de todas las opciones
(a,b,c,d,..) donde obtendremos el valor del $KEY o Clave y el nombre de la $OPCION.

Volvemos a realizar una consulta para buscar ahora todos los votos de esa opción y de esa
encuesta. Obtenemos el total de registros.

Para luego con la función round() redondear el valor de ($votos_x_opcion*100/$total_votos)


con 1 decimal. Donde $votos_x_opcion son todos los votos por esa opcion y $total_votos el
total de votos por toda la encuesta.

El mismo proceso empleado para obtener cualquier p|orcentaje, le ponemos el (@) para evitar
que se muestre un error por si acaso $total_votos es == a 0 ( CERO)

Finalmente con return, retornamos el contenido de $html_encuesta;

Para llamar la función ejecutamos lo siguiente:


<?
include('encuesta_blt.ini.php');
echo show_encuesta(1,true);
?>

Artículo por Emmanuel García De Caro

Sistema de encuestas PHP y MySQL: http://www.desarrolloweb.com/manuales/46/ 10


© Los manuales de DesarrolloWeb.com tienen el copyright de sus autores. No reproducir sin autorización.

Você também pode gostar