> Manuales > Sistema de encuestas PHP y MySQL

Vemos un nuevo ejemplo de la creacion de un sistema de encuesta, realizado en 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

<?
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 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 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);
?>

Emmanuel García De Caro

Webmaster de Blasten.com

Manual