Escolar Documentos
Profissional Documentos
Cultura Documentos
www.desarrolloweb.com
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.
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 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.
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
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.
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.
<?
$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>
<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.
Para poder actualizar nuestra base de datos con el objetivo de registrar el voto recibido,
usaremos una instrucción de este tipo:
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.
<?
//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>
<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.
Estructura de la tabla:
El código Fuente:
encuesta_blt.ini.php
<?
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()); }
}
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.
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…
De lo contrario ( else )
Se inserta un nuevo registro con datos esenciales para el funcionamiento de esta encuesta.
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.
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)