Otro ejemplo de encuesta con 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);
?>

Autor

Emmanuel García De Caro

Webmaster de Blasten.com

Compartir

Comentarios

angelica nieto

05/10/2006
MAS QUE UN COMENTARIO, ES UN FAVOR, LO QUE PARA ES QUE SOY PRINCIPIANTE EN EL TEMA, Y ME INTERESA MUCHA APRENDER A REALIZAR ENCUESTAS, PERO YA TENGO CONOCIENTOS DE ELLO CUANDO SE USA UNA UNICA RESPUESTA EN LA PREGUNTA. QUE POR FAVOR, QUIEN ME PODRIA AYUDAR EN CUANTO AL TEMA DE MULTIPLES RESPUESTAS, HE TRATADO PERO SIEMPRE ME SALEN ERRORES...

LES AGRADECERÍA ENORMEMENTE SU POSIBLE AYUDA, O POR LO MENOS CON PAGINAS DONDE PUEDA ENCONTRAR INFORMACION Y EJEMPLOS DEL TEMA....

/¯/¯/¯°·.ÅnGiƧ.·°¯¯¯

Rodrigo

23/2/2007
Hola amigos de desarrolloweb, me gusta mucho este sitio pues he aprendido bastantes cosas interesantes y sobre todo lo bien explicado que están los artículos....quería eso si que me ayuden con este ejemplo de encuesta, le agregue 2 preguntas más, pero no se como hacer para que me muestre las preguntas por separado, es decir, contesto la primera y paso a la segunda sin que se vea la anterior....espero que me entiendan lo que trato de decir. He intentando utilizando ciclos como el for, pero el me lo envía todo de una vez....saludos a todos, espero su respuesta

Livan G Caraballo

31/3/2009
El articulo está muy bueno

joaquin

03/3/2011
variables y campos
hola. quiero pasar la informaciòn de una variable a un campo de texto, cualquier ayuda se los agradezco.

saludos

Gustavo Arango

30/8/2011
Sobre esta Encuesta
tengo este ejemplo pero cuando lo corro me sale este error que puede ser

PHP Warning: Directive 'register_globals' is no longer supported in PHP 6 and greater in Unknown on line 0 PHP Warning: Directive 'register_long_arrays' is no longer supported in PHP 6 and greater in Unknown on line 0 PHP Warning: Directive 'magic_quotes_gpc' is no longer supported in PHP 6 and greater in Unknown on line 0
Gracias por su colaboracion

jaime

26/11/2011
formulario tipo test
Hola me gustaria saber si pueden ayudarme, tengo una base de datos con preguntas y 5 opciones de respuestas donde una es la correcta, he hecho el formulario pero no se como procesar la informacion para que me detecte que he seleccionado la respuesta correcta o la falsa, y me de un promedio de las respuestas bien y las malas.
gracias

cassa

20/3/2015
HOLA AMIGO ME PODRAS ENVIAR TU CODIGO
ESTOY ALGO ABRUMADO CON LO ESCRITO

ME GUSTARIA TENER TU CODIGO E INSTALARLO EN EL SERVIDOR
Y VERLO TRABAJAR ... PODRAS GRACIAS DE NUEVO.