Sistema de encuestas con restricción de IP

Recomienda este artículo Versión imprimible
Publicado por MijT el 27/Nov/2007 en PHP y MySQL | 3598 Lecturas | 18 comentarios
He hecho este script basándome en uno que vi en PHP-Hispano, la diferencia con aquel script es que aquí he cambiado algunas cosas como por ejemplo, permitir que el administrador del site pueda añadir las opciones que se desee(el script original sólo permite 4 por encuesta), y también he modificado el script para que se pueda hacer restricciones de IP y el usuario pueda votar una sola vez sin necesidad de estar registrado(el original sólo permite votar a usuarios registrados).

Bueno, ahora vamos a la acción, lo primero que tenemos que hacer es crear las tablas en las que guardaremos los datos(Título de la encuesta, Opciones de las encuestas y la IP de los votantes), comov erán son en total 3 tablas, pues bien, si nuestro Hosting dispone de phpMyadmin, ingresamos en él con nuestro usuario y contraseña y nos vamos a la parte de SQL para empezar a crear nuestras tablas, que son las siguientes:

# Esta tabla contendrá los títulos de la encuesta

CREATE TABLE `encuestas` (
  `id_enc` int(5) NOT NULL auto_increment,
  `pregunta` varchar(250) NOT NULL default '',
  PRIMARY KEY  (`id_enc`)
);

# Esta tabla contendrá las opciones de cada encuesta creada

CREATE TABLE `encuestas_opt` (
  `id_opt` int(10) NOT NULL auto_increment,
  `opciones` varchar(100) NOT NULL default '',
  `num_votos` int(10) NOT NULL default '0',
  `id_enc` int(6) NOT NULL default '0',
  PRIMARY KEY  (`id_opt`)
);

# Esta tabla contendrá la IP de los votantes

CREATE TABLE `encuestas_ip` (
  `id_ip` int(10) NOT NULL auto_increment,
  `ip_voto` varchar(15) NOT NULL default '',
  PRIMARY KEY  (`id_ip`)
)


Una vez creadas nuestras tablas en MySQL, pasamos a crear los scripts de nuestro sistema de encuestas.

Lo primero será crear el archivo con el que nos conectaremos a MySQL, lo llamaremos acceso_DB.php
<?php
    $dbhost 
"localhost"//Host del mysql
    
$dbuser "tu_usuario_de_mysql"//Usuario del mysql
    
$dbpass "la_clave"//Password del mysql
    
$db "base_de_datos"//db donde se creará la tabla users
    
    //conectamos y seleccionamos db
    
mysql_connect("$dbhost","$dbuser","$dbpass");
    
mysql_select_db("$db");
    
session_start();
?>


Nuestro siguiente archivo será crear el script que con el que crearemos encuestas con sus respectivas opciones, a este archivo lo llamamos addencuesta.php
<?php
    
include('acceso_DB.php'); // Este archivo contendrá nuestros datos de conexión a MySQL
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Encuestas</title>
<meta name="distribution" content="global" />
<meta name="robots" content="all" />
<style type="text/css">
body {
    font-family: 'Trebuchet MS', Verdana, Arial, Helvetica, sans-serif; /* Tahoma,Verdana, sans-serif*/
    Font-size: 10pt;
    background: #fff;
    padding: 0;
    margin: 20px;
}
a.link {
    color: #0066cc;
    text-decoration: none;
}
a.link:hover {
    text-decoration: underline;
}
.file {
    display: block;
}
label {
    display: block;
    font-weight: bold;
}
span a {
    margin-left: 1em;
}
</style>
<!-- Este javascirpt nos permitirá tener la opción de agregar las opciones que deseemos agregar a cada encuesta -->
<script type="text/javascript">
    var numero = 0;
    
    // Funciones comunes
    c = function (tag) { // Crea un elemento
        return document.createElement(tag);
    }
    d = function (id) { // Retorna un elemento en base al id
        return document.getElementById(id);
    }
    e = function (evt) { // Retorna el evento
        return (!evt) ? event : evt;
    }
    f = function (evt) { // Retorna el objeto que genera el evento
        return evt.srcElement ?  evt.srcElement : evt.target;
    }
    
    addField = function () {
        container = d('files');
        
        span = c('SPAN');
        span.className = 'file';
        span.id = 'file' + (++numero);
        
        field = c('INPUT');
        field.name = 'opciones[]';
        field.type = 'text';
        
        a = c('A');
        a.name = span.id;
        a.href = '#';
        a.onclick = removeField;
        a.innerHTML = 'Quitar';
        
        span.appendChild(field);
        span.appendChild(a);
        container.appendChild(span);
    }
    removeField = function (evt) {
        lnk = f(e(evt));
        span = d(lnk.name);
        span.parentNode.removeChild(span);
    }
</script>
</head>
<body>
<?php
        
if(isset($_POST['enviar'])) {
        if(
$_POST['pregunta'] == '') {
            echo 
"No has ingresado la pregunta de la encuesta. <a class='link' href='javascript:history.back()'>Regresar</a>";
        }else {
            
$pregunta strip_tags($_POST['pregunta']);
            
mysql_query("INSERT INTO encuestas (pregunta) VALUES('".$pregunta."')");
            
$id_enc mysql_insert_id();
            
$cont '0';
            
$cant count($_POST['opciones']);
            while(
$cont $cant) {
                
$opciones $_POST['opciones']["$cont"];
                
$sql mysql_query("INSERT INTO encuestas_opt (opciones, id_enc) VALUES ('".$opciones."', '".$id_enc."')");
                
$cont++;
            }
?>
            <div style="border: 1px solid #e0e0e0; background: #f7f7f7; padding: 5px; text-align: center; margin-top: 100px;">
                <strong>Encuesta creada correctamente</strong>
            </div>
<?php            
            mysql_query
("DELETE FROM encuestas_ip"); // Limpiamos la tabla encuestas_ip para permitir a los anteriores votantes poder votar en esta nueva encuesta
        
}
        }else {
?>
            <div style="font-size: 17px; color: #0066cc;">Crear encuesta</div>
            <form name="frm" id="frm" action="addencuesta.php" method="post">
                <label>Título de la encuesta:</label>
                <input type="text" name="pregunta" size="30" /><br />
                <label>Opciones:</label>
                <a class="link" href="#" onclick="addField()" accesskey="5">Añadir opciones</a>
                <div id="files"></div>
                <input type="submit" value="Guardar datos" id="envia" name="enviar" />
            </form>
<?php
        
}
?>
</body>
</html>


A este archivo lo llamaremos encuestas.php, y será el que nos muestre la encuesta para votar y los resultados de la misma si ya se ha votado:
<?php
    
include('acceso_DB.php');
    
$ipencuesta $_SERVER['REMOTE_ADDR'];
    
$sql mysql_query("SELECT * FROM encuestas_ip WHERE ip_voto LIKE '".$ipencuesta."'") or die(mysql_error());
    
$votadas mysql_fetch_array($sql);
    if(
mysql_num_rows($sql) == 0) {
        
$sql_enc mysql_query("SELECT * FROM encuestas ORDER BY id_enc DESC LIMIT 0,1") or die(mysql_error());
        while(
$row mysql_fetch_array($sql_enc)) {
            
$id_enc $row['id_enc'];
            
$pregunta $row['pregunta'];
?>
            <div style="text-align: center;"><strong><?=$pregunta?></strong></div>
            <form method="post" action="votarencuesta.php">
            <?php
                $opt 
mysql_query("SELECT * FROM encuestas_opt WHERE id_enc='".$id_enc."'") or die(mysql_error());
                while(
$row2 mysql_fetch_array($opt)) {
                    
$id_opt $row2['id_opt'];
                    
$opciones $row2['opciones'];
                    
$num_votos $row2['num_votos'];
            
?>
                <input type="radio" name="opciones" value="<?=$id_opt?>" /> <?=$opciones?><br />
            <?php
                
}
            
?>
                <div style="text-align: center; padding: 10px;"><input type="submit" name="votar" value="Votar" /></div>
            </form>
<?php
        
}
    }else {
        
$encuesta mysql_query("SELECT * FROM encuestas ORDER BY id_enc DESC LIMIT 0,1") or die(mysql_error());
        while(
$datos mysql_fetch_array($encuesta)) {
            
$id_enc $datos['id_enc'];
            
$pregunta $datos['pregunta'];
?>
            <div style="text-align: center;"><strong><?=$pregunta?></strong></div>
<?php
            $rs 
mysql_query("SELECT sum(num_votos) FROM encuestas_opt WHERE id_enc='".$id_enc."'");
            
$tot mysql_result($rs,0);
            
$opts mysql_query("SELECT * FROM encuestas_opt WHERE id_enc='".$id_enc."'") or die(mysql_error());
            while(
$dat2 mysql_fetch_array($opts)) {
                
$id_opt $dat2['id_opt'];
                
$opciones $dat2['opciones'];
                
$num_votos $dat2['num_votos'];
                
$ptos $num_votos 100;
                
$porcentaje = @round($ptos/$tot,0);
?>
                        <strong><?=$opciones?></strong> - <?=$num_votos?> votos - <?=$porcentaje?>%
                        <div style="width: <?=$porcentaje?>%; height: 10px; background: #009900;"></div>
<?php
            
}
?>
                    <div style="text-align: center; font-size: 11px;">Votos totales: <strong><?=$tot?></strong></div>
<?php
        
}
    }
?>


Para finalizar, el archivo que guardará los votos y la IP del votante en la BD, lo llamaremos votarencuesta.php
<?php
    
include('acceso_DB.php'); // Este archivo contendrá nuestros datos de conexión a MySQL
    
if(isset($_POST['votar'])) {
        if(
$_POST['opciones'] == '') {
            echo 
"No se ha seleccionado ninguna opción. <a href='javascript:history.back()'>Regresar</a>";
        }else {
            
$opciones $_POST['opciones'];
            
$sql mysql_query("SELECT * FROM encuestas_opt WHERE id_opt='".$opciones."'");
            
$row mysql_fetch_array($sql);
            
$suma $row['num_votos']+1;
            
$ip_votar $_SERVER['REMOTE_ADDR'];
            
mysql_query("UPDATE encuestas_opt SET num_votos='".$suma."' WHERE id_opt='".$opciones."'");
            
mysql_query("INSERT INTO encuestas_ip (ip_voto) VALUES('".$ip_votar."')");
            
$redir $_SERVER['HTTP_REFERER'];
            
header("Location: $redir");
        }
    }else {
        echo 
"Operación incorrecta. <a href='javascript:history.back()'>Regresar</a>";
    }
?>


Con todo ello ya tendremos listo nuestro sistema de encuestas, ahora nos quedaría hacer un include() a nuestro archivo encuestas.php en cualquier zona de nuestra web, foro o blog para empezar a utilizarla.

El sistema es sencillo, pueden agregársele más cosas, por ejemplo un poco de AJAX para que los votos se hagan sin necesidad de recargar toda la página en la que esté incluida la encuesta, y demás cosillas que ustedes pueden integrarle. Espero que les pueda servir de utilidad.
Etiquetas:
Compártelo:
Enviar a Del.icio.us Enviar a Technorati Enviar a Barrapunto Floréalo Enviar a Menéame Enviar a Facebook Enviar a Google Bookmarks Enviar a Yahoo! Enviar a Bitacoras Enviar a Webéame Enviar a Digg Enviar a Fresqui Enviar a Furl Enviar a NeoDiario Enviar a Wikio

Artículos Relacionados

No hay post relacionados
18 Comentarios a: Sistema de encuestas con restricción de IP
Ragazzi comentó:
El 13 de Feb. del 2008 a las 05:22
podes subir el codigo del acceso_bd.php por favor? Gracias.

datmos comentó:
El 22 de Feb. del 2008 a las 02:59
wenas, yo tambien necesito el codigo de acceso_bd.php porfavor.

e intentado usar este:

<?php
$hostname_conexion = "localhost";
$database_conexion = "";
$username_conexion = "";
$password_conexion = "";
$conexion = mysql_pconnect($hostname_conexion, $username_conexion, $password_conexion) or trigger_error(mysql_error(),E_USER_ERROR);
?>

pero no me funciona, ademas la base de datos no tienen ni username ni password asi que este codigo no sirce, porque te lo pide no?

gracias

MijT comentó:
El 22 de Feb. del 2008 a las 09:39
Disculpen la demora, había olvidado ese archivo, ya lo he agregado al post, espero que con ello les funcione el script.

Saludos.

Juna Pablo comentó:
El 5 de Mayo del 2008 a las 09:44
He seguido todos los pasos y no me funciona, tan solo creo una pagina y llamo como tu lo dices.

include("encuestas.php"); // Este archivo contendrá nuestros datos de conexión a MySQL

Por casualidad no tienes el script para bajarlo, seria de gran ayuda.

Desde ya muchas gracias.

juancho comentó:
El 5 de Jul. del 2008 a las 02:59
gracias me sirvio :d

Riqui comentó:
El 8 de Sept. del 2008 a las 18:12
Como integro en html que corra el PHP? muchas gracias y felicidades

Federico comentó:
El 15 de Sept. del 2008 a las 10:02
no funciona... al votar, no muestra el resultado, todo lo demás anda bien, pero no se muestra el resultado

MijT comentó:
El 15 de Sept. del 2008 a las 10:32
@Federico: No te muestra el resultado?, sería bueno que dijeras qué es lo que te muestra en lugar del resultado, para ver cómo solucionarlo, porque ese mismo script lo uso en este blog y no tiene fallas.

Saludos.

almagropaco comentó:
El 8 de Ene. del 2009 a las 17:50
perdon por "revivir" pero es que justo lo encontre y me sirve de mucho, ya agrege la encuesta y todo pero al votar no sucede nada, se recarga la pagina , y no me muestra los resultados y puedo votar de vuelta, no faltaran cambiar algunos permisos CHMOD o algo? saludos y gracias

ddosmegas comentó:
El 31 de Mar. del 2009 a las 15:56
LO PROBE, PERO NADA SE QUEDA EN BLANCO :/ NOS GUSTARIA NOS AYUDES, SE LE AGRADECE POR EL APORTE!

gabriel comentó:
El 17 de Jun. del 2009 a las 10:01
Include a que?

puse el include que dices hacia el votar encuestas, pero me sale operacion incorrecta y ahi se queda no me deja hacer nada.

saludos.

muy buena pagina.

JM comentó:
El 24 de Jun. del 2009 a las 03:02
No funciona, para ke postean algo ke no sirve esa estructura tiene muchos errores, encima ni conecta, se ve ke solo hicieron una traduccion pero no tienen la menor idea, en fin

MijT comentó:
El 24 de Jun. del 2009 a las 10:06
He revisado el código del script y efectivamente encontré algunos errores que ya he corregido y vuelto a probar, y ahora funciona correctamente, disculpen las molestias.

Saludos.

alvaro comentó:
El 4 de Ago. del 2009 a las 10:06
mi hermano muchisimas gracias me funciono 100 pts el script era excactamente lo q estaba buscando gracias!!

Guille comentó:
El 14 de Nov. del 2009 a las 13:13
El tutorial me parece buenisimo, está muy claro. Lo hice y me crea la encuesta a la perfección pero cuando emito un voto me tira un error:

Warning: Cannot modify header information - headers already sent by (output started at /home/pronto/public_html/encuesta/acceso_DB.php:12) in /home/pronto/public_html/encuesta/votarencuesta.php on line 14

La linea 14 correponde a: header("Location: $redir");

Esta publicado en: www.prontocar.com.ar/encuesta/encuesta.php


Espero tu respuesta. En tanto voy a seguir intentando repararlo. No se mucho al respecto pero los foros como el tuyo son de gran ayuda. Muchas Gracias.

Un cordial saludo
Guillermo


MijT comentó:
El 14 de Nov. del 2009 a las 14:29
@Guille el error que te sale se debe a que no puedes enviar NADA antes de modificar las cabeceras (con funciones como setcookie(), header() o session_start()). Posiblemente tengas un espacio antes o después de abrir/cerrar el modo de PHP, concretamente en el archivo acceso_DB.php, en la línea 12.

Otra opción sería que hagas la redirección con JavaScript, es decir, en el archivo votarencuesta.php reemplazar la línea

header("Location: $redir");

por esta:

<script type="text/javascript">
    var pagina = "<?=$redir?>"
    function redireccionar() {
        location.href = pagina
    }
    setTimeout ("redireccionar()", 2000);
</script>

Saludos.

Guille comentó:
El 16 de Nov. del 2009 a las 07:35
Muchas Gracias por tu pronta respuesta. Ál parecer está resuelto. En el archivo acceso_DB.php me faltaba, tal como lo digiste, la funcion session_start() y habia un espacio despues de cerrar el modo PHP. Muy agradecido !!! Seguimos en contacto. Saludos
Guillermo

JC comentó:
El 23 de Dic. del 2009 a las 15:46
Muy bueno, funciona de pelos, como harias para una encuesta de mas de una pregunta? un while en la tabla preguntas,? me puedes explicar

Comenta este artículo

Nos encantaría que dejaras tu comentario acerca de esta entrada, pero para ello debes tener en cuenta lo siguiente:

  • No escribas todo el texto en mayúsculas.
  • Procura que tus comentarios estén relacionados con lo que se ha publicado en esta entrada.
  • Respeta a los demás lectores de este blog. Si hay algún comentario que no es de tu agrado, expón tus ideas de forma alturada.
  • No utilices groserías en tus comentarios.

Los comentarios que incumplan los puntos mencionados serán eliminados inmediatamente.

Para escribir tu comentario dispones de un editor de texto para agregar negrita, cursiva, subrayado, links, etc. Si no sabes cómo usarlo, entra aquí