Sistema de encuestas básico en PHP y MySql

Sistema de encuestas con PHP

Recientemente me vi en la necesidad de implementar un sistema de encuestas para una Intranet. Buscando en la web encontré varias alternativas bastante útiles e innovadoras en algunos casos. Sin embargo, mi requerimiento era algo sencillo que permitiera incluirla en un CMS ya existente que esta implementada y no pude encontrar nada “sencillo”, es decir, sin administración independiente y que me permitiera manejar las encuestas con bastante rapidez.

Al no encontrar nada que pudiera satisfacer mi necesidad; decidí desarrollar mi propio sistema de encuestas el cual quiero compartir con ustedes.

Estos son los requerimientos para que este sistema script de encuestas funcione:

– PHP 5.x (http://php.net/)
– MySql 5.0.22 o superior (http://dev.mysql.com/downloads/mysql/5.5.html)
– PHP MySQL wrapper (http://www.ricocheting.com/code/php/mysql-database-class-wrapper)
– phpMyAdmin (http://www.phpmyadmin.net/)
– jQuery mediante google jsapi (http://www.google.com/jsapi)

El script es bastante sencillo y opera bajo una variable de url que maneja la validación y el query.

Primero necesitaremos crear una base de datos en MySql. Vamos a llamarla “encuestas”

Luego procedemos a crear las tablas necesarias utilizando phpmyadmin, suponiendo que lo tenemos configurado como nuestro administrador de mysql:

Tabla “surveys” que contiene el titulo, descripción y el “survey_id” el cual nos servirá para enlazar las preguntas y sus respuestas.

Tala “survey_q” que alojará las preguntas de cada una de nuestas encuestas

Tabla “surveys_o que alojara las posibles respuestas a seleccionar por cada pregunta.

Tabla “surveys_a” que almacenará las respuestas con el valor de la opción seleccionada para cada pregunta de nuestras encuestas.

Por último, la tabla “surveys_c” que utilizaremos para almacenar algún comentario del encuestado para cada survey. Esto es por si queremos permitir que nuestro conosultado nos escriba algun comentario relacionado con la encuesta a procesar.

Antes de continuar, es importante notar los campos “survey_id” y “q_id”; uno guarda la relación con el survey que agrupará las preguntas y el segundo relaciona la opción y respuesta con su pregunta respectivamente.

El campo “a_remoteip” de la tabla “surveys_a” para controlar por IP el que la encuesta pueda ser completada una sola vez por encuestado.

Ya tenemos la estructura de datos. Procederemos a crear una encuesta de prueba o “demo”.

Primero insertaremos los datos de nuestro survey.

Notemos el valor “Open” para el campo “survey_status”. Esto como modo de seguridad para tener varias  fases de nuestra encuesta para futura ampliación del sistema  de encuestas. Los valores pueden ser (Open, Edit, Test, Closed).

Ahora vamos a crear las preguntas y sus opciones de respuesta:

Las preguntas:

Las opciones o posibles respuestas.

Pongamos atención a la opción “o_id” con el valor “23”. Perteneciente a la encuesta “survey_id” con el valor 1; pregunta “q_id” con el valor 6, ya que el valor del campo “o_value” es NULL. Esto es indicativo de que es una opción de respuesta con el valor indicado por el encuestado mediante un text input, el cual es generado automáticamente bajo esta condición, como veremos en el archivo del script mas adelante.

A continuación vamos a crear nuestra estructura de archivo.

– Creamos una carpeta en nuestro servidor web a la cual vamos a llamar “encuesta”.
– Dentro de la carpeta “encuesta”, crearemos otra llamada “includes”.
– Colocamos dentro de “includes” el archivo “database.class.php”, suponiendo que descargaste el PHP MySQL wrapper.
– Creamos un archivo, el cual llamaremos “config.inc.php” tambien dentro de la carpeta “includes”.
– Creamos un archivo llamado “index.php” dentro de la carpeta “encuesta”, suponiendo que queremos que sea nuestro script para ser llamado mediante la url por defecto.

Esta seria nuestra estructura:

/encuesta/
/encuesta/includes/
/encuesta/includes/database.class.php
/encuesta/includes/config.inc.php
/encuesta/index.php

En nuestro archivo “/includes/config.inc.php”, tendremos las siguientes lineas de configuracion de nuestro PHP MySQL wrapper:

Y en nuestro archivo index.php, tendremos lo siguiente:

Ahora llamamos la encuesta mediante la url:

http://localhost/encuesta/?survey=c4ca4238a0b923820dcc509a6f75849b_1

Fijémonos en el valor de la variable “survey” la cual tiene un valor string. Este valor en realidad contiene dos parámetros separados por “_’.

El primero, el string o cadena “c4ca4238a0b923820dcc509a6f75849b” la cual es un código cualquiera que deseemos utilizar con fines de validar la solicitud de la encuesta a tomar.

El segundo, el entro “1”, el cual indica el “survey_id” que quermos presentar.

Ambos valores deben coincidir con los de la encuesta en la tabla “surveys” para cada encuesta; de lo contrario nos indicara que la encuesta seleccionada no existe.

Por ejemplo, si creamos otra encuesta, según el index key seria la “survey_id” con valor 2, entonces colocaremos en el campo “survey_code” el string “asdfg”, entonces para llamar nuestra segunda encuesta sería:

http://localhost/encuesta/?survey=asdfg_2

Listo. Nuestro propio sistema de encuesta base a partir del cual podemos desarrollar algo mas robusto; con la versatilidad de poder incorporarlo en cual quier sistema que estemos desarrollando o para una pagina web.

Es importante que recuerdes que este script no tiene una rigurosa seguridad puesto que fue desarrollado para implementarlo en una intranet con controles de seguridad terceros. Por lo que, si vas a tomarlo como base para una aplicación web o pagina, es necesario que trabajes mas la seguridad.

Espero les se de utilidad.

“CODE IS POETRY”.

  • anonimo

    oe man te falta poner el codigo del archivo
    database.class.php

    si lo pones antes le lo voy agraceder,
    saludos

  • Erick

    me marca el siguiente error

    Database Error
    Message: Could not connect to server: .
    MySQL Error: Access denied for user ‘ODBC’@’localhost’ (using password: NO)
    Date: Friday, December 10, 2010 at 11:24:39 AM
    Script: /encuesta/?survey=c4ca4238a0b923820dcc509a6f75849b_1
    Database Error
    Message: Could not open database: .
    MySQL Error: Access denied for user ‘ODBC’@’localhost’ (using password: NO)
    Date: Friday, December 10, 2010 at 11:24:39 AM
    Script: /encuesta/?survey=c4ca4238a0b923820dcc509a6f75849b_1
    Database Error
    Message: MySQL Query fail: SELECT * FROM surveys_a WHERE survey_id = ‘1‘ AND a_remoteip = ‘127.0.0.1‘
    MySQL Error: Access denied for user ‘ODBC’@’localhost’ (using password: NO)
    Date: Friday, December 10, 2010 at 11:24:39 AM
    Script: /encuesta/?survey=c4ca4238a0b923820dcc509a6f75849b_1
    Database Error
    Message: MySQL Query fail: SELECT * FROM surveys as s LEFT JOIN surveys_q as q ON s.survey_id = q.survey_id WHERE s.survey_code = ‘c4ca4238a0b923820dcc509a6f75849b‘ AND s.survey_status = ‘“Open”‘ AND s.survey_id = ‘1‘ AND q.q_status = ‘on’ ORDER BY q.q_id ASC
    MySQL Error: Access denied for user ‘ODBC’@’localhost’ (using password: NO)
    Date: Friday, December 10, 2010 at 11:24:39 AM
    Script: /encuesta/?survey=c4ca4238a0b923820dcc509a6f75849b_1

    • Revisa el user/pass de tu base de datos y en la configuración en el archivo config.inc.php.

  • Andres
    • Excelente tu aporte, y mejor la pregunta. Puedes utilizar cualquier controlador de datos que desees. Indico la librería mencionada por la flexibilidad que esta presenta y lo fácil de su uso. PDO es otra alternativa mejorada para PHP 5.x. Sin embargo, PDO presenta ciertas restricciones y una observación importante que hace PHP.net: “Algunos tipos de tablas MySQL (motores de almacenamiento) no son compatibles con las transacciones. Cuando se escriba código de base de datos transaccional usando un tipo de tabla que no soporta transacciones, MySQL supondrá que una transacción fue iniciada con éxito. Además, cualquier consulta DDL emitida validará implícitamente cualquier transacción pendiente. “.

  • Nice site ….)

  • Pingback: Encuesta simple con PHP y jQuery - Weblantropia()