GESTOR DE CUESTIONARIOS VIA WEB
Transcripción
GESTOR DE CUESTIONARIOS VIA WEB
INSTITUTO POLITÉCNICO NACIONAL Escuela Superior de Ingeniería Mecánica y Eléctrica Unidad Zacatenco Ingeniería en Comunicaciones y Electrónica SEMINARIO DE TITULACIÓN REDES DE COMPUTADORAS, MICROCONTROLADORES Y ADQUISICIÓN DE DATOS VÍA WEB PROYECTO DE TITULACIÓN “GESTOR DE CUESTIONARIOS VÍA WEB” QUE PARA OBTENER EL TÍTULO DE: INGENIERO EN COMUNICACIONES Y ELÉCTRONICA P R E S E N T A: ÁLVAREZ LÓPEZ JORGE ALBERTO. MAYA MORENO MARICELA. PÉREZ MELÉNDEZ TOMÁS ROBERTO. Asesores: ING. ARTURO A. HIT ESPINOSA. ING. JOSÉ GERARDO ROMERO BADILLO. MÉXICO D.F. MAYO 2010 1 2 INDICE OBJETIVO……………………………….………………………………………………….8 JUSTIFICACION………………………………………………………...............................8 INTRODUCCION…………………………………...………………….............................10 CAPITULO I. SERVIDORES…………………………………………………………….12 1.1 Tipos de servidores………………………………………………………................12 1.1.1 Servidores WEB………………….…………………………….....................13 1.1.2 Servidor DNS (Domain Name Server)….……..…………………………….15 1.1.3 Servidor Correo….…………………..……………….....................................17 1.1.4 Servidor FTP (File Tranfer Protocol)….………………………………...…...18 1.1.5 Servidor Usuarios….………………………………….…...............................21 1.1.6 Servidor DHCP (Dynamic Host Configuration Protocol)………………...…22 1.1.7 Servidor de Aplicaciones…………………………………………………….23 CAPITULO II. BASES DE DATOS….…………………………………………...............25 2.1 Modelos de Bases de Datos.………………………………….…………................26 2.1.1 Bases de Datos Jerárquicas….………………………………………….........26 2.1.2 Base de datos de red….…………………………………………....................27 2.1.3 Bases de datos transaccionales….…………………………………………....27 2.1.4 Bases de datos relacionales….………..………………………………….......27 2.1.5 Bases de datos multidimensionales…...….…………………………………..28 2.1.6 Bases de datos orientadas a objetos………………………………………….29 2.1.7 Bases de datos documentales….…..………………………………................30 3 2.1.8 Bases de datos deductivas….………………..………………………….........30 2.2 Sistema de Gestión de Base de Datos (SGBD) ….………………………………....30 2.3 Entidad – Relación….…………………………………...…………………….........31 2.4 Estructura de una Base de Datos….…………………………………………...........34 2.5 MYSQL….………………………………………….................................................34 CAPITULO II. LENGUAJES PARA PROGRAMACION WEB….……………………...36 3.1 HTML….…………………………………………...................................................36 3.2 PHP………………………………………………………………………………... 37 3.3 CSS………………………………………………………………………………….39 3.4 Javascript.……..…………………………………………………………………….40 CAPITULO IV. DISEÑO E IMPLEMENTACION………………………………….........41 4.1 Requerimientos y Análisis….………………………………………………………41 4.2 Diseño del Sistema………………………………………………………………….44 4.3 Implementación……………………………………………………………………..56 CONCLUSIONES…………………………………………………………………………67 ANEXOS…………………………………………………………………………………...69 REFERENCIAS BIBLIOGRAFICAS……………………………………………………118 4 INDICE DE FIGURAS Figura 1.1 Navegador y Servidor…………………………………………………………14 Figura 1.2 Incorpora una Base de Datos, Una típica transacción Web con base de datos. Por ejemplo una petición HTTP, listado de nuestros cuestionarios……………………………14 Figura 1.3 Análisis de la comunicación. Cliente-Servidor………………………………...15 Figura 1.4 Servidor DNS………………………………………………………………......17 Figura 1.5 Servidor de Usuarios……………………………………………………………21 Figura 1.6 Servidor DHCP…………………………………………………………………23 Figura 2.1 Funcionamiento de una Base de Datos…………………………………………25 Figura 2.2 Base de Datos Jerárquica……………………………………………………….26 Figura 2.3 Base de Datos de Red…………………………………………………………..27 Figura 2.4 Base de Datos Relacional………………………………………………………28 Figura 2.5 Base de Datos Multidimensional………………………………………………29 Figura 2.6 Base de Datos Orientada a Objetos…………………………………………….30 Figura 2.7 Componentes del SGBD……………………………………………………..…31 Figura 2.8 Entidad - Relación……………………………………………………………...32 Figura 2.9 Relación uno a uno………………………………………………………..……32 Figura 2.10 Relación uno a muchos………………………………………………………..33 Figura 2.11 Relación muchos a muchos…………………………………………………...34 Figura 3.1 Funcionamiento PHP…………………………………………………………...38 Figura 4.1 Diagrama Entidad-Relación……………………………………………………41 Figura 4.2 Tabla cuestionarios. ……………………………………………………………42 Figura 4.3 Tabla preguntas…………………………………………………………………42 5 Figura 4.4 Tabla respuestas………………………………………………………………...43 Figura 4.5 Tabla data………………………………………………………………………43 Figura 4.6 Tabla usuarios…………………………………………………………………..43 Figura 4.7 Vista Login……………………………………………………………………..44 Figura 4.8 Menús administración del sistema……………………………………………...45 Figura 4.9 Menús operación del sistema…………………………………………………...45 Figura 4.10 Diagrama de flujo Login………………………………………………………46 Figura 4.11.- Acciones cuestionarios………………………………………………………46 Figura 4.12 Vista cuestionarios…………………………………………………………….47 Figura 4.13 Diagrama de flujo Cuestionarios……………………………………………..47 Figura 4.14 Acciones preguntas……………………………………………………………48 Figura 4.15 Vista preguntas………………………………………………………………..48 Figura 4.16 Diagrama de flujo Preguntas…………………………………………………49 Figura 4.17 Acciones respuestas…………………………………………………………...49 Figura 4.18 Vista Respuestas………………………………………………………………50 Figura 4.19 Diagrama de flujo de Respuestas……………………………………………...50 Figura 4.20 Acciones data………………………………………………………………….51 Figura 4.21 Vista data……………………………………………………………………..51 Figura 4.22 Diagrama de Flujo Data………………………………………………………52 Figura 4.23 Acciones usuarios……………………………………………………………..52 Figura 4.24 Vista usuarios………………………………………………………………….53 Figura 4.25 Diagrama de flujo de Usuarios……………………………………………..…53 Figura 4.26 Acciones área operativa……………………………………………………….54 6 Figura 4.27 Vista área operativa…………………………………………………………...54 Figura 4. 28 Diagrama de flujo Operador………………………………………………….55 Figura 4.29 Pantalla Login………………………………………………………………....56 Figura 4.30 Pantalla Principal usuario Administrador……………………………………..57 Figura 4.31 Pantalla menú Cuestionarios….……………………………………………….57 Figura 4.32 Pantalla Nuevo cuestionario…………………………………………………..58 Figura 4.33 Pantalla modificar Cuestionario………………………………………………58 Figura 4.34 Pantalla Preguntas……………………………………………………………..59 Figura 4.35 Pantalla para ingresar Preguntas………………………………………………60 Figura 4.36 Pantalla ingreso de Respuestas……………………………………………….60 Figura 4.37 Eliminar cuestionarios………………………………………………………...61 Figura 4.38 Pantalla Vista previa………………………………………………………….62 Figura 4.39 Pantalla Extracción de información…………………………………………..62 Figura 4.40 Ejemplo archivo procesado de Datos…………………………………………63 Figura 4.41 Pantalla Usuarios……………………………………………………………...64 Figura 4.42 Pantalla Formulario de datos para usuarios nuevos…………………………..64 Figura 4.43 Pantalla principal usuario Operador…………………………………………..65 Figura 4.44 Pantalla para contestar cuestionario…………………………………………...65 Figura 4.45 Pantalla confirmación de cuestionario contestado…………………………….66 7 OBJETIVO Desarrollar una aplicación WEB que permita la gestión de cuestionarios, mantenimiento (altas, bajas y cambios), consulta de los cuestionarios y explotación de datos de los resultados obtenidos, para reducir tiempos y costos en la realización de encuestas de empresas públicas o privadas. JUSTIFICACIÓN En estos tiempos donde las empresas compiten con productos y servicios y la calidad de dichos productos y servicios juega un papel muy importante, dicha calidad esta representada primeramente como la capacidad de los productos y servicios de satisfacer las necesidades de los consumidores. Para conocer esta satisfacción por parte de los consumidores, las empresas se han encargado de buscar personal u otras empresas quienes se encargan de medir y cuantificar la satisfacción de los consumidores con respecto a los servicios o productos que ofrecen, esto lo hace a través de estudios y métodos que les ayudan a conocer en que proporciones les agrada o desagrada un producto o servicio. Para muchas empresas el conocer las necesidades de sus consumidores es de vital importancia, ya que de esto depende de la prosperidad de su empresa o su decaimiento. En esta actividad se llegan a gastar grandes cantidades tanto las empresas que piden el estudio, en los casos que sea por parte de una empresa externa como para quienes realizan el estudio. Para esto se realiza un análisis para determinar que es los que se quiere conocer del producto o servicio, una vez planteado esto se procede a decidir que método de estudio es el que más se adecua para la obtención de información de características de los 8 productos o servicios. Para la obtención de esta información la empresas se remiten a los consumidores, mediante una entrevista en la cual el consumidor externara sus gustos y preferencias mediante una entrevista por parte de una persona adiestrada previamente y la cual conoce las características a evaluar y que le serán externadas al consumidor para conocer su opinión o mediante un cuestionario con preguntas bien estructuradas que contienen la características a evaluar, en la que se procede solo leyendo y siguiendo las instrucciones que están escritas en el cuestionarios. Para la realización de estos cuestionarios puede llevar un tiempo importante, ya que se realiza primeramente en formato electrónico, el cual debe llevar un formato establecido por la empresa y en el cual podría llevarse la mayor parte de la construcción de cuestionario, restando tiempo a la obtención de la información por parte de las personas a cargo de encuestar y aplazar los resultados del estudio, hasta llegar a la impresión para su posterior salida. 9 INTRODUCCIÓN Gracias a la evolución de las nuevas tecnologías informáticas y tecnología en general se han podido realizar grandes aportaciones en varias ramas. Hemos observado que al combinarlas se han tenido grandes logros. Muchas de estas aportaciones y logros han tenido gran impacto beneficiando a las actividades cotidianas en empresas o simplemente a usuarios particulares, proporcionando una manera más eficaz y eficiente de realizar actividades. Uno de estos avances con el que compartimos la vida diaria y cada vez es mas usado es la Internet y todo aquel dispositivo capaz de ingresar a ella como los ordenadores, teléfonos celulares, PDA‟s (Personal Digital Assistant), reproductores de música. La Internet a hecho posible cosas que no hubiésemos imaginado antes y permitiendo a los usuarios compartir información a millones de personas, las cuales pueden acceder a esta información con respecto a sus prioridades, gustos, deseos, pasatiempo entre otros y realizando esto en tiempos muy cortos sin importar donde se encuentre la información. Entre los dispositivos que más destacan en la conexión a la Internet son los ordenadores y los teléfonos celulares ya que como hemos visto en el caso de los ordenadores cada vez son más portátiles, sin perder sus características y en algunos casos anexando nuevos avances tecnológicos que proporcionan una mayor accesibilidad a la información y a la forma de compartirla y beneficiando a millones de usuarios sin importar la actividad de la persona gracias a las basta cantidad de aplicaciones que existen y que se siguen generando con respecto a las necesidades de los usuarios o empresariales y en la telefonía celular los dispositivos han generado gran cantidad de aplicaciones que ofrecen a los usuarios otra forma de compartir información así como de acceder a ella mediante estas aplicaciones que 10 se asemejan cada vez más a la de los ordenadores y sin perder la portabilidad con la que ya contaban. Uniendo a estos tres avances tecnológicos podemos crear grandes aplicaciones que faciliten las tareas que realizamos cotidianamente en las empresas. Así como mejor la calidad de los servicios ofreciendo menores tiempos de realización de las actividades, con menores costos en procesos y materiales y ayudando a la ecología en la medida que se pueda en el menor uso de papel en las actividades y procesos. 11 CAPITULO I. SERVIDORES ¿Qué es un servidor? Como primer punto definiremos que es un servidor, sus características y su uso. Para usos en informática la palabra “Servidor” es un ordenador que es parte de una red ya sea LAN (Local Area Network) o MAN (Metropolitan Area Network) que se encarga de proveer servicio a otros ordenadores denominados “Cliente”. También es utilizado para nombrar a una aplicación la cual provee algún servicio a otras aplicaciones llamadas “Cliente” con lo cual haciendo posible que el servidor cumpla la tarea Cliente-Servidor simultáneamente. Cabe destacar que para que un ordenador sea un servidor, sus componentes no necesariamente deberán ser de última generación, ya que podríamos usar un ordenador casero con pocos recursos hasta uno especializado con el máximo de recursos posibles para dicha tarea. Esto dependerá del uso al cual se destinara dicho servidor. 1.1 Tipos de servidores. Estos servidores pueden interactuar en un mismo servidor o lo pueden hacer individualmente. Entre los servidores que podemos encontrar están; Servidor Dedicado el cual es un ordenador con sistema operativo que solo permite ofrecer servicios, compartir recursos y no se utiliza como estación de trabajo. Servidor NO dedicado el cual se encarga ofrecer servicios, compartir recursos y además se utiliza como estación de trabajo. Debemos también tomar en cuenta el rol que tienen los equipos en una red, ya que dependiendo del rol todas pueden ser servidores y clientes al mismo tiempo, a esto se le denomina Punto a Punto (Peer to Peer). 12 En el caso que exista un servidor y el resto de los ordenadores como clientes, a esta arquitectura se le conoce como Cliente-Servidor (Client-Server). Entre estos podemos encontrar diferentes tipos de servidores dependiendo al servicio que ofrecen como: 1.1.1 Servidor Web Es llamado así a la aplicación encargada de almacenar y servir páginas Web. Las páginas almacenadas pueden corresponder aun solo sitio Web o a varios sitios cada uno separado en diferentes carpetas las cuales se definen en la aplicación para su reconocimiento y posterior llamado. Para realizar el llamado el servidor esta en ejecución continua en espera de la petición de algún cliente mediante un navegador Web, este navegador Web será el encargado de interpretar el código HTML (Hyper Text Markup Language) en el cual están escritas la paginas Web, este código es enviado desde el servidor a través del protocolo HTTP (HypeText Transfer Protocol) y es mostrado en el ordenar cliente. La interpretación casi en su totalidad es hecha del lado del cliente, en algunos casos es necesario que el navegador Web del ordenador cliente cuente con pequeñas aplicaciones que son las encargadas de interpretar pequeñas partes de código escrito en otros lenguajes, pero también existen aplicaciones que contiene parte de código que es procesado e interpretado por el servidor y enviado como código HTML mediante el protocolo HTTP para que del lado del cliente pueda ser visualizado y normalmente utiliza los puertos numero 80 y 8080 para conexiones seguras. Entre los servidores más conocidos tenemos IIS (Internet Information Services) y Apache. Cabe mencionar que no solo es capaz de almacenar solo páginas sino también otro tipo de archivos como imágenes, videos, música, documento etcétera, los cuales pueden ser mostrados o llamados por alguna página Web. 13 Figura 1.1 Navegador y Servidor Figura 1.2 Incorpora una Base de Datos, Una típica transacción Web con base de datos. Por ejemplo una petición HTTP, listado de nuestros cuestionarios 14 Figura 1.3 Análisis de la comunicación. Cliente-Servidor 1.1.2 Servidor DNS (Domain Name System) Es una aplicación encargada de interpretar o traducir los nombres escritos en los navegadores de los ordenadores Cliente por las direcciones IP (Internet Protocol) de los servidores así como asociar diferentes tipos de información que refiere a dichos nombres. Para esto se basa en un sistema jerárquico, el cual se va interpretando de derecha a izquierda para poder localizar la información, mediante un tipo de etiquetado y su concatenación que conforma el nombre del dominio. Este etiquetado corresponde a servidores raíz. Los servidores DNS son de tipo primario, secundario y locales o caché, los cuales son los encargados de la búsqueda e interpretación de los nombres. Los servidores 15 primarios son lo encargados de almacenar la información de los nombres de dominio, los secundarios obtienen la información (una copia) de los servidores primarios en caso que estos fallen y lo servidores locales o caché obtienen información de otro servidor en respuesta a consultas de los servidores DNS primarios y secundarios las cuales son almacenadas por un tiempo determinado en estos servidores, esto se hace para un mayor eficiencia y reducción del tráfico de los servidores DNS primarios y secundarios. Para realizar las consultas los servidores pueden ser autorizados y no autorizados, los autorizados son aquellos que contienen copias de todos los dominios como son los DNS primarios y secundarios y los no autorizados solo contienen copias de las búsquedas de los DNS que se han consultado en el pasado y de los cuales se ha recibido una respuesta autorizada como lo es el DNS caché. Las consultas a los servidores DNS pueden ser de 2 tipos Recursiva e Iterativa, en las consultas recursivas el servidor DNS busca dentro de sus datos locales incluyendo su caché la mejor respuesta y en la consultas iterativas el servidor DNS no cuenta con la información así que busca el servidor raíz y repite el proceso hasta obtener la resolución de la consulta. El sistema funciona en base al protocolo UDP (User Datagram Protocol) y trabaja sobre el puerto numero 53. Entre los servidores más utilizados podemos encontrarnos con los siguientes Bind, PowerDNS, MaraDNS, djbdns, pdnsd, MyDNS, DNS (Windows 2000/2003/2008), dnsmasq. 16 Figura 1.4 Servidor DNS 1.1.3 Servidor Correo Es una aplicación encargada de enviar y recibir mensajes o correos, estos mensajes pueden contener solo texto y/o se puede incorporar más información como archivos adjuntos. Para realizar la tarea de envió y recepción entre un ordenador a otro se basa en un Agente de Trasferencia de Correos o MTA (Mail Transfer Agent) por sus siglas en ingles. De esta manera al enviar el un correo mediante un MTA lo recibe otro MTA este correo es tomado por un MSA (Mail Submission Agent) a través de un MUA (Mail User Agent), este MUA puede recibir directamente el correo desde otro MUA supliendo y actuando como un MSA. La parte con la que interactúa el usuario el MUA. Esta transferencia se realiza mediante protocolos, los cuales cumplen una función especifica. Estos protocolos son SMTP (Send Mail Transfer Protocol); este protocolo es el encargado de enviar los mensajes ya sea de un servidor a otro o desde un cliente de correo a un servidor, POP (Post Office Protocol); este 17 protocolo es el encargado de la obtención de los mensajes en un servidor y lo pasa al usuario de correo y el protocolo IMAP (Internet Message Acces Protocol) es un protocolo al igual que POP se encarga de la obtención de los mensajes en un servidor y también los pasa al usuario de correo, pero es mas complejo ya que también permite ver los mensajes en el servidor sin ser descargados, los puertos que utilizan son; SMTP los puerto numero 25, 587 (Alternativo para clientes de correo) y 465 (SMTPS), POP los puertos numero 110 y 995 (cifrado) y el IMAP los puertos numero 149, 220 (IMAP3) y 993(IMAPS). Entre los agentes de transferencia (MTA) más conocidos y utilizados nos podemos encontrar con los siguientes Sendmail, Postfix, Exim, Mdaemon y Microsoft Exchange Server. Y entre los agentes de correo de usuario (MUA) esta Thunderbird, Evolution, Microsoft Outlook y Microsoft Express. 1.1.4 Servidor FTP (File Transfer Protocol) Como su nombre lo indica es un protocolo de transferencia de archivos. Este tipo de servidor se encarga de almacenar archivos para su intercambio entre distintos ordenadores. Para que esto sea posible se debe instalar la aplicación en un ordenador destinado a solo esta tarea o en conjunto con otro tipo de servidor. Una vez instalada la aplicación puede ser configurada para su acceso, mediante Web o por medio de algún programa FTP. Para el acceso mediante Web lo único que necesitamos es tener un navegador Web, esto mediante el protocolo HTTP y el puerto numero 80 (que es quien ve al usuario) actuara como intermediario en conjunto con los protocolos numero 20 y 21 que maneja el servidor FTP, el cliente tecleara en la barra de direcciones el protocolo en este caso ftp y el dominio al que se ingresara en caso que exista. 18 Seguido de esto aparecerá una ventana pidiendo un usuario y una contraseña las cuales debemos ingresar para poder tener acceso al servidor FTP. En el caso de usar una aplicación cliente, esta se conecta a través del protocolo FTP para realizar la transferencia, es necesario registrar en el programa FTP el dominio en el que se desea hacer el intercambio de archivos así como ingresar el nombre de usuario y contraseña del dominio registrado. En ambos casos el intercambio de archivos puede ser solo de subida, descargas o ambos, esto dependerá de los privilegios configurados en cada cuenta de usuarios de FTP. Para tener acceso puede estar configurado con acceso anónimo, invitado y como usuario. En el caso que un servidor este configurado como anónimos, se permite tener acceso sin tener una cuenta de usuario, solo se teclea en el login “anonymous” y se tendrá acceso a los archivos. En el acceso como usuario, el servidor contara con información de las diferentes cuentas registradas en el equipo que podrán tener acceso a él, esto nos ayuda a dar privilegios para interactuar con los archivos existentes o ingresar nuevos archivos. Y al intentar establecer la conexión nos pedirá el usuario y la contraseña, los cuales en caso de contar con ellos se ingresaran para pode acceder al servidor FTP. Los usuarios invitados o “guest” es una mezcla entre los accesos anteriores, la parte más importante de este acceso es no perder seguridad en nuestro servidor permitiendo que usuarios mal intencionados ingresen a otras partes del sistema dañándolo, esto mediante el login y password, y que incorpore la libertad del los usuarios anónimos pero solo en cierto tipo de archivos y/o carpetas y con mas privilegios. Para establecer la conexión entre el servidor y el cliente existen dos modos el modo activo (estándar o PORT debido a que el cliente envía un comando tipo PORT al servidor por el canal de control al establecer la conexión) y el modo pasivo (o PASV por que para este caso envía comando tipo PASV al servidor). En ambos 19 modos el cliente es quien establece la conexión mediante el puerto número 21, quien es el encargado de establecer el canal de control. En modo Activo, el servidor siempre crea el canal de datos en su puerto numero 20, mientras que en el lado del cliente el canal de datos se asocia a un puerto aleatorio mayor que el puerto numero 1024. Para ello, el cliente manda un comando PORT al servidor por el canal de control indicándole el número de puerto, de manera que el servidor pueda abrirle una conexión de datos por donde se transferirán los archivos, en el número de puerto especificado. Esto genera problemas de seguridad y es que la máquina cliente debe estar dispuesta a aceptar cualquier conexión de entrada en un número de puerto superior al 1024, esto puede generar grandes problemas si tenemos el equipo conectado a una red insegura como Internet. De hecho, los cortafuegos que se instalen en el equipo para evitar ataques seguramente rechazarán esas conexiones aleatorias. Para solucionar esto se desarrolló el modo Pasivo. En este modo cuando el cliente envía un comando PASV sobre el canal de control, el servidor FTP le indica por el canal de control, el numero de puerto (mayor a 1023 del servidor. Ej:2040 ) al que debe conectarse el cliente. El cliente inicia una conexión desde el numero de puerto siguiente al puerto de control (Ej: 1036) hacia el puerto del servidor especificado anteriormente (Ej: 2040. Antes de cada nueva transferencia, tanto en el modo Activo como en el Pasivo, el cliente debe enviar otra vez un comando de control (PORT o PASV, según el modo en el que haya conectado), y el servidor recibirá esa conexión de datos en un nuevo puerto aleatorio (si está en modo pasivo) o por el puerto numero 20 (si está en modo activo). 20 1.1.5 Servidor Usuarios Un servidor de usuarios, es un ordenador el cual se encarga de validar usuarios de una red, esto al escribir un usuario y una contraseña que pertenezcan a dicha red. Esto le permite tener acceso a los recursos compartidos de esta red así como a aplicaciones que pueden ejecutar usuarios autentificados. Para poder acceder los usuarios debe ser dado de alta y configurado previamente como usuarios del dominio en el servidor de usuarios que funcionara también como controlador de dominio. Para la gestión de usuarios (alta, baja y modificación de la cuentas), se debe acceder a la aplicación encargada de esta tarea. Los usuarios pueden ser de diferentes tipos, cada uno con diferentes privilegios de acceso y modificación de archivos, esto para incrementar la seguridad dentro y fuera de nuestro dominio. Figura 1.5 Servidor de Usuarios 21 1.1.6 Servidor DHCP (Dynamic Host Configuration Protocol) Este es un servidor encargado de la asignación automática de la configuración a los ordenadores cliente en una red mediante el protocolo de configuración dinámica de servidor. Es este servidor el que contiene los rangos de direcciones red IP dinámicas que se irán asignando a los clientes con forme se realice la solicitud por parte del cliente y en el servidor existan IP‟s libres para ser asignadas, y con esto saber en todo momento quien tiene una IP a quien se le asigno después y el tiempo de uso de la IP. Para la asignación de IP‟s, DHCP incluye tres métodos; Asignación manual o Estática, Asignación automática y Asignación dinámica. En la asignación estática se configura una única IP la cual tendrá que conservar para poder tener acceso a una red determinada en caso de que se haga cambio de una red tendrá que asignarse una nueva IP que contenga los parámetro de la nueva red. En la asignación automática se configura una dirección IP de forma permanente la primera vez que se realiza la petición a al servidor DHCP y hasta que el cliente termina de ocupar la dirección IP. La asignación dinámica es el único método de reutilización de direcciones IP, para esto el administrador de la red configura previamente un rango de direcciones IP‟s, las cuales serán solicitadas al servidor DHCP conforme las tarjetas de red de los clientes enciendan y mediante un procedimiento entre el cliente y el servidor DHCP en un tiempo controlable se lleva acabo la asignación de la dirección IP. Esto facilita la configuración de nuevos ordenadores cliente conectados a una red. 22 Figura 1.6 Servidor DHCP 1.1.7 Servidor de Aplicaciones Un servidor de aplicaciones es un software que proporciona aplicaciones a los equipos o dispositivos cliente, por lo general a través de Internet y utilizando el protocolo http. Los servidores de aplicación se distinguen de los servidores web por el uso extensivo del contenido dinámico y por su frecuente integración con bases de datos. Además, Un servidor de aplicaciones es un producto basado en un componente que se encuentra en el plano medio de la arquitectura central de un servidor. Proporciona servicios de „middleware‟, es decir, trabaja como un intermediario para la seguridad y el mantenimiento, además de proveer acceso a los datos. Un servidor de aplicación maneja la mayoría de las transacciones relacionadas con la lógica y el acceso a los datos de la aplicación (esto se solía llamar „centralización‟, hace algún tiempo...). La ventaja principal de un servidor de aplicaciones es la facilidad para desarrollarlas, puesto que éstas no necesitan ser programadas y en cambio, se arman a partir 23 de módulos provistos por el servidor de aplicaciones. Por ejemplo, un wiki es un servidor de aplicación que permite a los usuarios crear contenido dinámico a partir del ensamble de los artículos. Más aún, las enciclopedias en la red son un wiki ensamblado que entrega una enciclopedia almacenada en un sistema de ficheros, cuyos cambios a la enciclopedia se hallan almacenados en una base de datos. El término servidor de aplicaciones se aplica a todas las plataformas , y hay muchas variaciones sobre el tema, por lo que resulta un poco ambiguo. El término se utiliza para referirse a los servidores de aplicaciones basadas en Web, como el control de las plataformas de comercio electrónico integrado, sistemas de gestión de contenido de sitios Web y asistentes o constructores de sitios de Internet. Por esta razón, algunos los llaman también „servidor web‟. Uno de los ejemplos destacados es el de Sun Microsystems, plataforma J2EE. Los servidores de aplicaciones Java se basan en la Plataforma Java ™ 2, Enterprise lEdition (J2EE ™). J2EE utiliza un modelo de este tipo y, en general, incluye un nivel Cliente, un nivel Medio, y un EIS. El servidor de tipo Cliente puede contener una o más aplicaciones o navegadores. La Plataforma J2EE es del Nivel Medio y consiste en un servidor Web y un servidor EJB. (Estos servidores son también llamados "contenedores".) También podría haber sub- niveles adicionales en el nivel intermedio. El nivel del Sistema Enterprise Information System contiene las aplicaciones existentes, archivos y bases de datos. 24 CAPITULO II. BASES DE DATOS ¿Qué es una Base de Datos? Una base de datos es un almacén que nos permite guardar grandes cantidades de información de forma organizada para que luego podamos encontrar y utilizar fácilmente. Una base de datos es un sistema formado por un conjunto de datos almacenados en discos que permiten el acceso directo a ellos y un conjunto de programas que manipulen ese conjunto de datos. Entre las principales características de los sistemas de base de datos podemos mencionar: Independencia lógica y física de los datos. Redundancia mínima. Acceso concurrente por parte de múltiples usuarios. Integridad de los datos. Consultas complejas optimizadas. Seguridad de acceso y auditoría. Respaldo y recuperación. Acceso a través de lenguajes de programación estándar. Figura 2.1 Funcionamiento de una Base de Datos 25 2.1 Modelos de bases de datos Un modelo de datos es un contenedor de datos y métodos para almacenar y recuperar información de esos contenedores. Los modelos de datos son abstracciones que permiten la implementación de un sistema eficiente de base de datos por lo general se refieren a algoritmos y conceptos matemáticos. 2.1.1 Bases de datos jerárquicas Éstas son bases de datos que almacenan su información en una estructura jerárquica. Los datos se organizan en una forma similar a un árbol en donde un nodo padre de información puede tener varios hijos. El nodo que no tiene padres es llamado raíz, y a los nodos que no tienen hijos se los conoce como hojas. Las bases de datos jerárquicas son especialmente útiles en el caso de aplicaciones que manejan un gran volumen de información y datos muy compartidos permitiendo crear estructuras estables y de gran rendimiento. Una de las principales limitaciones de este modelo es su incapacidad de representar eficientemente la redundancia de datos. Figura 2.2 Base de Datos Jerárquica 26 2.1.2 Base de datos de red En este modelo se permite que un mismo nodo tenga varios padres (posibilidad no permitida en el modelo jerárquico). Ofrece una solución eficiente al problema de redundancia de datos. Figura 2.3 Base de Datos de Red 2.1.3 Bases de datos transaccionales Son bases de datos cuyo fin es el envío y recepción de datos a grandes velocidades, estas bases son muy poco comunes y están dirigidas por lo general al entorno de análisis de calidad, datos de producción e industrial, se caracteriza por recolectar y recuperar los datos a la mayor velocidad, por lo tanto la redundancia y duplicación de información no es un problema como con las demás bases de datos, permiten algún tipo de conectividad a bases de datos relacionales. 2.1.4 Bases de datos relacionales Modelo utilizado para modelar problemas reales y administrar datos dinámicamente. Su característica fundamental es el uso de relaciones. Estas relaciones podrían considerarse en forma lógica como conjuntos de datos llamados tuplas. En este modelo, el lugar y la forma 27 en que se almacenen los datos no tienen relevancia (a diferencia de otros modelos como el jerárquico y el de red). La información puede ser recuperada o almacenada mediante consultas que ofrecen una amplia flexibilidad y poder para administrar la información. El lenguaje más habitual para construir las consultas a bases de datos relacionales es SQL, Structured Query Language o Lenguaje Estructurado de Consultas, un estándar implementado por los principales motores o sistemas de gestión de bases de datos relacionales. Durante su diseño, una base de datos relacional pasa por un proceso al que se le conoce como normalización de una base de datos. Figura 2.4 Base de Datos Relacional 2.1.5 Bases de datos multidimensionales Son bases de datos para desarrollar aplicaciones muy concretas, como creación de Cubos OLAP. Los campos o atributos de una tabla pueden ser de dos tipos, o bien representan dimensiones de la tabla, o bien representan métricas que se desean estudiar. 28 Figura 2.5 Base de Datos Multidimensional 2.1.6 Bases de datos orientadas a objetos Este modelo es propio de los modelos informáticos orientados a objetos, trata de almacenar en la base de datos los objetos completos (estado y comportamiento). Una base de datos orientada a objetos es una base de datos que incorpora todos los conceptos importantes del paradigma de objetos: Encapsulación - Propiedad que permite ocultar la información al resto de los objetos, impidiendo así accesos incorrectos o conflictos. Herencia - Propiedad a través de la cual los objetos heredan comportamiento dentro de una jerarquía de clases. Polimorfismo - Propiedad de una operación mediante la cual puede ser aplicada a distintos tipos de objetos. En bases de datos orientadas a objetos, los usuarios pueden definir operaciones sobre los datos como parte de la definición de la base de datos. Una operación se especifica en dos partes. La interfaz de una operación incluye el nombre de la operación y los tipos de datos 29 de sus argumentos. La implementación de la operación se especifica separadamente y puede modificarse sin afectar la interfaz. Los programas de aplicación de los usuarios pueden operar sobre los datos invocando a dichas operaciones a través de sus nombres y argumentos, sea cual sea la forma en la que se han implementado. Esto podría denominarse independencia entre programas y operaciones. Figura 2.6 Base de Datos Orientada a Objetos 2.1.7 Bases de datos documentales Permiten la indexación a texto completo, y en líneas generales realizar búsquedas más potentes. 2.1.8 Bases de datos deductivas Un sistema de base de datos deductiva, es un sistema de base de datos que permite hacer deducciones a través de inferencias. Se basa en reglas y hechos que son almacenados en la base de datos. 2.2 Sistema de Gestión de Base de Datos (SGBD) Los Sistemas de Gestión de Bases de Datos (en inglés DataBase Management System) son un tipo de software muy específico, dedicado a servir de interfaz entre la base de datos, el 30 usuario y las aplicaciones que la utilizan. Se compone de un lenguaje de definición de datos, de un lenguaje de manipulación de datos y de un lenguaje de consulta. Figura 2.7 Componentes del SGBD 2.3 Entidad-Relación Los diagramas o modelos entidad-relación (denominado por su siglas, ERD “Diagram Entity relationship”) son una herramienta para el modelado de datos de un sistema de información. Estos modelos expresan entidades relevantes para un sistema de información, sus inter-relaciones y propiedades. 31 Figura 2.8 Entidad - Relación Cardinalidad de las Relaciones: El diseño de relaciones entre las tablas de una base de datos puede ser la siguiente: Relaciones de uno a uno: una instancia de la entidad A se relaciona con una y solamente una de la entidad B. Figura 2.9 Relación uno a uno 32 Relaciones de uno a muchos: cada instancia de la entidad A se relaciona con varias instancias de la entidad B. Figura 2.10 Relación uno a muchos Relaciones de muchos a muchos: cualquier instancia de la entidad A se relaciona con cualquier instancia de la entidad B. 33 Figura 2.11 Relación muchos a muchos 2.4 Estructura de una Base de Datos Una base de datos, con el fin de ordenar la información de manera lógica, posee un orden que debe ser cumplido para acceder a la información de manera coherente. Cada base de datos contiene una o más tablas, que cumplen la función de contener los campos. Por consiguiente una base de datos posee el siguiente orden jerárquico: Tabla Campos Registros Lenguaje 2.5 MYSQL MySQL es un sistema de gestión de base de datos relacional, multihilo y multiusuario desarrollado como software libre y gestionado por distintos lenguajes de programación. Permite la creación de cualquier sistema de registro de usuarios y funcionalidades avanzadas de un proyecto WEB. Utiliza un sistema de administración relacional de bases 34 de datos, archiva datos en tablas separadas en vez de colocar todos los datos en un gran archivo lo que permite flexibilidad y velocidad. Las tablas están conectadas por relaciones definidas que hacen posible combinar datos de diferentes tablas. Existen varias APIs que permiten acceder a las bases de datos MySQL, incluyendo C, C++, C#, Pascal, Delphi (via dbExpress), Eiffel, Smalltalk, Java (con una implementación nativa del driver de Java), Lisp, Perl, PHP, Python, Ruby,Gambas, REALbasic (Mac y Linux), (x)Harbour (Eagle1), FreeBASIC, y Tcl cada uno de estos utiliza una API específica. También existe un interfaz ODBC, llamado MyODBC que permite a cualquier lenguaje de programación que soporte ODBC comunicarse con las bases de datos MySQL. También se puede acceder desde el sistema SAP, lenguaje ABAP. 35 CAPITULO III. LENGUAJES DE PROGRAMACION WEB Un lenguaje de programación es un idioma diseñado para expresar comandos que interprete una maquina. Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, expresar algoritmos con precisión, o como modo de comunicación humana. Está formado de un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones Con el comienzo de Internet y la programación Web, se desfasaron los diseños gráficos tradicionales, con lo que se empezaron a diseñar interfaces concretas para este medio, buscando ficheros pequeños para facilitar la carga de los mismos. La programación Web se orientaba a un diseño muy cargado e interactuando con el usuario, mientras que al empezar a competir con millones de Web se ha optado más por el diseño sencillo y de fácil comprensión. 3.1 HTML Es un lenguaje estático para el desarrollo de sitios Web (HyperText Markup Language, en español Lenguaje de Marcas Hipertextuales). Es el lenguaje de marcado predominante para la elaboración de páginas web, es usado para describir la estructura y el contenido en forma de texto, así como para complementar el texto con objetos tales como imágenes. HTML se escribe en forma de etiquetas. HTML puede incluir un script, el cual puede afectar el comportamiento de navegadores Web y otros procesadores de HTML. HTML también es usado para referirse al contenido del tipo de MIME text/html o todavía más ampliamente como un término genérico para el HTML, ya sea en forma descendida del XML o en forma descendida directamente de SGML . 36 HTML utiliza etiquetas o marcas, que consisten en breves instrucciones de comienzo y final, mediante las cuales se determinan la forma en la que debe aparecer en su navegador el texto, así como también las imágenes y los demás elementos, en la pantalla del ordenador. El diseño en HTML aparte de cumplir con las especificaciones propias del lenguaje debe respetar unos criterios de accesibilidad web, siguiendo unas pautas, o las normativas y leyes vigentes en los países donde se regule dicho concepto. 3.2 PHP Es un lenguaje de programación utilizado para la creación de sitio web. PHP (PHP Hypertext Pre-processor ). PHP es un lenguaje de script interpretado en el lado del servidor utilizado para la generación de páginas web dinámicas, embebidas en páginas HTML y ejecutadas en el servidor. No necesita ser compilado para ejecutarse. Para su funcionamiento necesita tener instalado Apache o IIS con las librerías de PHP. La mayor parte de su sintaxis ha sido tomada de C, Java y Perl con algunas características específicas. Los archivos cuentan con la extensión (php).Soporta en cierta medida la orientación a objeto. Clases y herencia. Es un lenguaje multiplataforma: Linux, Windows, entre otros. Capacidad de conexión con la mayoría de los manejadores de base de datos: MysSQL, PostgreSQL, Oracle, MS SQL Server, entre otras. Es capaz de acceder a archivos, ejecutar comandos y abrir conexiones de red en el servidor. Estas propiedades hacen que cualquier cosa que sea ejecutada en un servidor web sea insegura por naturaleza. 37 Su diseño está orientado a facilitar la creación de página Web, es posible crear aplicaciones con una interfaz gráfica para el usuario, también puede ser usado desde la línea de órdenes, Cuando el cliente hace una petición al servidor para que le envíe una página Web, el servidor ejecuta el intérprete de PHP. Éste procesa el script solicitado que generará el contenido de manera dinámica. El resultado es enviado por el intérprete al servidor, quien a su vez se lo envía al cliente. Mediante extensiones es también posible la generación de archivos PDF, Flash, así como imágenes en diferentes formatos. Permite la conexión a diferentes tipos de servidores de bases de datos tales como MySQL, Postgres, Oracle, ODBC, DB2, Microsoft SQL Server, Firebird y SQLite. Tiene la capacidad de ser ejecutado en la mayoría de los sistemas operativos, tales como UNIX (y de ese tipo, como Linux o Mac OS X) y Windows, y puede interactuar con los servidores de Web más populares ya que existe en versión CGI, módulo para Apache, e ISAPI. Es libre, por lo que se presenta como una alternativa de fácil acceso. Figura 3.1 Funcionamiento PHP 38 3.3 CSS Las hojas de estilo en cascada (Cascading Style Sheets), CSS es un lenguaje usado para definir la presentación de un documento estructurado escrito en HTML o XML (y por extensión en XHTML). El W3C (World Wide Web Consortium) es el encargado de formular la especificación de las hojas de estilo que servirán de estándar para los agentes de usuario o navegadores. La idea que se encuentra detrás del desarrollo de CSS es separar la estructura de un documento de su presentación. La información de estilo puede ser adjuntada tanto como un documento separado o en el mismo documento HTML. Existen tres caminos diferentes para aplicar las reglas de estilo a una página Web. Externa Es una hoja de estilo que está almacenada en un archivo diferente al archivo donde se almacena el código HTML de la página Web. Esta es la manera de programar más potente, porque separa completamente las reglas de formateo para la página HTML de la estructura básica de la página. Interna Es una hoja de estilo que está incrustada dentro de un documento HTM se usa cuando se quiere proporcionar alguna característica a una página Web en un simple fichero Línea Es un método para insertar el lenguaje de estilo de página, directamente, dentro de una etiqueta HTML. 39 3.4 Javascript Este es un lenguaje interpretado que no requiere compilación. JavaScript es un lenguaje de scripting basado en objetos, utilizado para acceder a objetos en aplicaciones. Principalmente, se utiliza integrado en un navegador Web permitiendo el desarrollo de interfaces de usuario mejoradas y páginas Web dinámicas. Es un dialecto de ECMAScript y se caracteriza por ser un lenguaje basado en prototipos, con entrada dinámica y con funciones de primera clase.. JScript es la implementación de ECMAScript de Microsoft, muy similar al JavaScript de Netscape, pero con ciertas diferencias en el modelo de objetos del navegador que hacen ambas versiones sean incompatibles con frecuencia. Javascript puede incluirse en cualquier documento y es compatible con HTML en el navegador del cliente, ya sea PHP, Active Server Pages, ASP, JSP y SVG. Incluir código directamente en una estructura HTML es una práctica invasiva y no recomendada. El método correcto que define la W3C es incluir javascript como un archivo externo, tanto por cuestiones de accesibilidad, como práctica y velocidad en la navegación. 40 CAPITULO IV. DISEÑO E IMPLEMENTACION 4.1 Requisitos y Análisis Para los requisitos del Gestor de Cuestionarios, primeramente fue necesario crear una base de datos, la cual contendrá toda la información correspondiente a los cuestionarios, información de usuarios y la información de los cuestionarios contestados. Para ello se realizo un análisis en el cual se considero crear 4 tablas relacionadas, que contendrán todo lo correspondiente a la creación de cuestionarios y la obtención de la información que arrojara el cuestionario así como una tabla donde se almacenara los usuarios que administraran el sistema y los que contestaran cuestionarios dando así mayor seguridad a nuestro sistema y que no cualquier persona haga uso de la aplicación. Esta última tabla puede relacionarla, pero dependerá del rubro donde se incorpore el sistema o puede utilizar una base de datos con usuarios ya existente e incorporarse. Todo esto se muestra en el diagrama de entidad relación siguiente: Figura 4.1 Diagrama Entidad-Relación 41 Tres de las tablas corresponden a la información de los cuestionarios así como de sus preguntas y respuestas, estas tablas son; Cuestionarios: contendrá toda la información correspondiente al cuestionario, como lo es el nombre, la fecha de creación y un identificador de cuestionario como lo muestra la siguiente tabla. Campo Tipo ID_CUEST int(4) NOM_CUEST varchar(80) FECHA timestamp Cotejamiento Atributos Nulo UNSIGNED No utf8_general_ci Predeterminado Extra auto_increment No No CURRENT_TIMESTAMP Figura 4.2 Tabla cuestionarios. Preguntas: contendrá todas las preguntas de todos los cuestionarios así como la información que corresponderá a cada una de las preguntas, como lo es la pregunta, el tipo de pregunta, instrucciones de la pregunta, si es requerido que se conteste, un numero identificador de pregunta y un numero de relación con algún cuestionario como es mostrado en la siguiente tabla. Campo Tipo Cotejamiento Nulo Extra ID_PREG int(4) No ID_CUEST int(4) No PREGUNTA varchar(400) utf8_general_ci No INSTRUCCIONES varchar(200) utf8_general_ci Sí NULL REQ tinyint(1) Sí NULL TIPO set('TEXT', 'CHECKBOX', 'RADIO') utf8_general_ci auto_increment No Figura 4.3 Tabla preguntas Respuestas: contendrá todas las respuestas y la información que corresponda como lo es un identificador de respuesta, un identificador que se relaciona con la pregunta, un valor de respuesta y el texto de la respuesta. 42 Campo Tipo Cotejamiento Nulo ID_RESP int(4) No ID_PREG int(4) No RESPUESTA varchar(40) VALOR tinyint(4) utf8_general_ci Predeterminado Extra auto_increment No Sí NULL Figura 4.4 Tabla respuestas La cuarta tabla de cuestionarios son los resultados del cuestionario: Data: contendrá la información proveniente del cuestionario contestado como lo es los identificadores de cuestionario, pregunta y respuesta, así como el valor de dicha respuesta y un campo de data donde se registrara el texto de la respuesta en el caso que sea cerrada tendrá el texto de la respuesta mostrado en pantalla y en caso que corresponda a una pregunta abierta, contendrá todo lo escrito por la persona que contesta. Campo Tipo Cotejamiento Nulo ID_REGIS int(4) No ID_PREG int(4) No ID_RESP int(4) No ID_CUEST int(4) No VALOR smallint(6) Sí DATA varchar(400) utf8_general_ci Predeterminado Extra auto_increment NULL No Figura 4.5 Tabla data Nuestra quinta tabla es la de usuarios: esta tabla contendrá a los usuarios que podrán acceder al sistema, ya sea en la administración, como en la sección donde se contestaran los cuestionarios. Tendrá la información como el nombre de usuario, contraseña y un identificador de usuario. Campo Tipo Cotejamiento Atributos Nulo ID_USUARIO int(4) USUARIO varchar(150) utf8_general_ci No PASS varchar(20) utf8_general_ci No set('ADMIN', 'USER') utf8_general_ci No TIPO No Extra auto_increment Figura 4.6 Tabla usuarios 43 4.2 Diseño del Sistema Se considero que el sistema debía estar dividido en dos partes, una para quien se hará cargo de la gestión de los cuestionarios, la explotación de la información y la administración de los usuarios y para quienes solo contestaran cuestionarios, con esto dotando al sistema de mayor seguridad para intrusiones de personas malintencionadas. Para ello creamos una pagina con un formulario, esta pagina esta encargada de obtener la información, para que se realice una consulta a nuestra base de datos y verificar que existe el usuario, en caso de existir, ver que tipo de usuario es y direccionarlo a su sección, en caso contrario no dejara en esta pagina sin lograr ingresar al sistemas. Una vez verificada la existencia del usuario se crea una variable de sesión y si este es administrador se direccionara a la página principal de la administración de nuestro sistema donde se encontrara con los siguientes menús. LOGIN Administrador Operador Administrador Cuestionarios Data Operador Salir Contestar Salir principal.php Autenticar contesta_cuestionario.php . Autenticar Siguiente Regresa Figura 4.7 Vista Login 44 Administración del Sistema Figura 4.8 Menús administración del sistema Si el usuario es tipo user, se direccionara a la sección de la operación del sistema, que es donde se selecciona el cuestionario y se contesta. Operación del Sistema Figura 4.9 Menús operación del sistema El siguiente diagrama de flujo muestra lo que ocurre en el Login; 45 Login NO Usuario registrado SI Principal Administrador Tipo usuario Operador Elige cuestionario Figura 4.10 Diagrama de flujo Login Como ya se menciono la sección de administración contiene un menú con diferentes opciones y que describiremos a continuación. En el menú cuestionarios se pensó que debería contener todo aquello relacionado con la gestión de los cuestionarios y debería de ser secuencial para que el sistema sea sencillo, como lo puede ilustrar la figura 4.11: Figura 4.11.- Acciones cuestionarios 46 Con esto visualizamos como seria la vista de este menú en la figura 4.12: Figura 4.12 Vista cuestionarios Y para seguir la secuencia de la información se creo el siguiente un diagrama de flujo que nos muestra como, la información es requerida, si se encuentra es procesada y almacenada. Preguntas Cuestionarios Nuevo Modificar Registra datos de cuestionario Registra cambios del cuestionario Almacena datos Almacena datos Confirmación de cuestionario registrado Confirmación de cambios Eliminar Elimina usuario en la BD Respuestas Vista previa Muestra vista previa del cuestionario Figura 4.13 Diagrama de flujo Cuestionarios 47 Una vez creado el cuestionario, se procede a crear las preguntas para, así que se seleccionara el cuestionario y damos clic en preguntas y nos enviara a una página donde se podrá gestionar lo referente a las preguntas, tal como se muestra en la figura 4.14. Figura 4.14 Acciones preguntas Al igual que en cuestionarios se creo una vista como guía, la cual contendrá las respuestas ingresadas y botones para la gestión como se puede ver en la figura 4.15. Figura 4.15 Vista preguntas Basándonos en el siguiente diagrama de flujo para procesar y almacenar la información. 48 Cuestionarios Preguntas Respuestas Nuevo Modificar Eliminar Registra datos de pregunta Registra cambios en pregunta Elimina pregunta Almacena datos Almacena datos Confirmación de pregunta registrada Confirmación de cambios Figura 4.16 Diagrama de flujo Preguntas Ya con las preguntas creadas pasaremos a crear las respuestas a cada una de las preguntas, esta parte puede ser como el usuario lo considere mas conveniente ya que puede crear las respuestas después de ingresar una pregunta y no crear todas las preguntas y después todas las respuestas. En esta parte solo hará la gestión de las preguntas, aquí es mas simple que cuestionarios y preguntas como lo vemos en la figura 4.17. Figura 4.17 Acciones respuestas 49 La vista de esta sección es sencilla y con pocas acciones como lo vemos a continuación Figura 4.18 Vista respuestas En su diagrama de flujo se muestra como la información es requerida para ser procesada Preguntas Respuestas Nuevo Eliminar Registra datos de respuesta Elimina respuesta Almacena datos Confirmación de respuesta registrado Figura 4.19 Diagrama de flujo de Respuestas 50 Ahora pasaremos a ver el menú de data este es uno de los mas sencillos, ya que se pensó que solo tendría una acción la cual es obtener la información de un cuestionario como lo observamos en las figuras 4.20 y 4.21. Y mostrarla en un archivo separado por comas CSV (Comma Separated Values), para su posterior análisis de esta información. Figura 4.20 Acciones data Figura 4.21 Vista data El flujo de la obtención de la información lo podemos observar en la imagen siguiente. 51 Data Seleccionar cuestionario Vista previa Extraer cuestionario Genera archivo Figura 4.22 Diagrama de Flujo Data El menú de usuarios es sencillo, solo para limitar el acceso, para ello se pensó en una gestión sencilla como se observa en la figura 4.23 y 4.24. Con una vista similar a los demás menús. Figura 4.23 Acciones usuarios 52 USUARIOS Nuevo Eliminar NUEVO Guardar Regresar inserta_usuario .php Regresar Siguiente Regresa Figura 4.24 Vista usuarios Con un diagrama de flujo sencillo para procesar e ingresar la información a continuación Usuarios Nuevo Eliminar Registrar datos Usuario eliminado de la Base de Datos Usuario almacenado en la Base de Datos Confirmación de registro Figura 4.25 Diagrama de flujo de Usuarios 53 Ahora será el turno de la sección operativa, donde se pensó que fuera lo mas sencillo posible, donde solo seleccionáramos el cuestionario y posteriormente se procedería a contestarlo, lo podemos observar en la figura 4.26. Figura 4.26 Acciones área operativa La vista para esta parte debería solo contener la selección contesta el cuestionario, esto lo podemos observar en la figura 4.27. Figura 4.27 Vista área operativa 54 En ambas secciones se encuentra la opción en el menú de salir, el cual se encargara de destruir la variable de sesión almacenada en los archivos temporales del ordenador cliente. Confirmación de datos guardados Elige cuestionario Contesta cuestionario Almacena respuestas en Base de Datos Figura 4. 28 Diagrama de flujo Operador 55 4.3 Implementación En base al análisis diseñado para el sistema, se obtienen los siguientes resultados del sistema En la pantalla principal se encuentra el login (autentificación de usuarios), en esta pantalla se ingresa el usuario y se define el rol del usuario para enviarlo al modulo correspondiente del sistema ya sea administrativo u operativo, en caso de no existir el usuario no permite ingresar al sistema Figura 4.29 Pantalla Login En caso de que el usuario tenga perfil Administrador , se muestra la siguiente pantalla en la cual se tiene el menú Cuestionarios , Data y Usuarios 56 Figura 4.30 Pantalla Principal usuario Administrador En la opción de cuestionarios se tienen las opciones: nuevo, modificar, eliminar, crear preguntas (acceso al menú preguntas) y vista previa Figura 4.31 Pantalla menú Cuestionarios 57 Al elegir nuevo cuestionario, que es el primer paso en la creación del cuestionario o encuesta, se muestra el siguiente formulario en el cual se ingresa el nombre del cuestionario Figura 4.32 Pantalla Nuevo cuestionario En el caso de que se requiera modificar datos de un cuestionario existente, se ingresa a la opción modificar en la cual se guardan los cambios registrados Figura 4.33 Pantalla modificar Cuestionario 58 Para el modulo de preguntas, se tiene el siguiente menú, en el cual se pueden realizar altas, bajas y modificaciones de preguntas sobre el cuestionario previamente seleccionado, en este modulo también se encuentra el acceso a preguntas, sobre la pregunta seleccionada Figura 4.34 Pantalla Preguntas En la siguiente pantalla se muestra el formulario de los datos que se requieren para ingresar la pregunta nueva, en este podemos observar que se requiere nombre, instrucciones, tipo de respuesta y si esta pregunta debe tener carácter obligatorio al responder 59 Figura 4.35 Pantalla para ingresar Preguntas En la siguiente pantalla observamos el menú de respuesta a ingresar sobre la pregunta previamente seleccionada, en esta se tienen las opciones de nuevo y eliminar Figura 4.36 Pantalla ingreso de Respuestas 60 Para eliminar registros, se tiene como ejemplo la siguiente pantalla ya que en esta observamos como al eliminar un registro, en este caso un cuestionario manda una alerta de confirmación antes de realizar la acción, cabe mencionar que en el caso de cuestionarios elimina todos los registros implicados en este, es decir preguntas y respuestas, en el caso de preguntas elimina también sus respuestas. Figura 4.37 Eliminar cuestionarios La pantalla Vista Previa, nos muestra como su nombre lo indica una vista final del cuestionario que previamente capturamos, al seleccionar el cuestionario deseado, nos muestra sus preguntas y sus respuestas de los diferentes tipos solicitados, la vista que se muestra es la pantalla final que vera el usuario operador para contestar el cuestionario 61 Figura 4.38 Pantalla Vista previa Para la explotación de la información se tiene la opción data en la que se selecciona el cuestionario del cual se desea obtener la información contestada por los usuarios Figura 4.39 Pantalla Extracción de información 62 Este es un ejemplo de archivo de un cuestionario del cual se obtuvo información en formato Excel donde tenemos los ID de preguntas, respuestas y cuestionarios, y el valor asignado de cada pregunta, así como las respuestas de los usuarios Figura 4.40 Ejemplo archivo procesado de Datos En usuarios, administramos los usuarios de la aplicación, en este se dan las altas y bajas 63 Figura 4.41 Pantalla Usuarios Estos son los datos necesarios para el alta de un usuario, en este se asigna el perfil o rol que tendrá el usuario Figura 4.42 Pantalla Formulario de datos para usuarios nuevos 64 Cuando se ingresa al sistema con usuario operador la pantalla principal es en la que se selecciona el cuestionario que desea ser contestado Figura 4.43 Pantalla principal usuario Operador Figura 4.44 Pantalla para contestar cuestionario 65 Al contestar el cuestionario se recibe confirmación de que los datos fueron ingresados a la base de datos de manera satisfactoria, cabe mencionar que todas las altas del sistema funcionan de esta manera Figura 4.45 Pantalla confirmación de cuestionario contestado 66 CONCLUSIONES El sistema se ha desarrollado para un uso sencillo, dando así la oportunidad de enfocarse en el análisis y realización de las preguntas y respuestas, las cuales se adecuen a la obtención de la información deseada. Permitiéndonos así realizar diferentes tipos de cuestionarios, desde una simple pregunta para una encuesta hasta un estudio de mercado que contiene una gran numero de preguntas que sean consideradas para la obtención de la información, estas preguntas pueden ser abiertas o cerradas o la combinación de ambas, permitiéndonos así un cuestionario más completo y que cubra con las necesidades al momento de realizar un cuestionario. Otra de las características importantes del sistema es que permitirían ahorrar tiempos y costos de procesos, así como la explotación de la información obtenida, los cuales serán perceptibles desde el primer mes dando como resultado un menor tiempo de entrega de resultados al personal que se encargara de analizar la información obtenida de los cuestionarios. Se puede adaptar a algún sistema ya implantado, solo cumpliendo con características de plataforma anteriormente mencionados, así como también puede adaptarse a diferentes aéreas donde se presenten cuestionamientos de sus productos y/o servicios u opinión pública y así como evaluaciones y diagnósticos. Con estas características el sistema de gestión de cuestionarios pude posicionarse en un buen lugar en la recaudación de información vía web, y permitir hacer ahorros de costos, tiempos y hacer una pequeña contribución al medio ambiente en la menor utilización de papel y productos perjudícales al medio ambiente como seria el tóner. 67 En la realización de la aplicación hemos, considerado algunos módulos que complementarían el sistema, como son el envió de cuestionarios a celulares y la recepción de los cuestionarios contestados para su ingreso a nuestras bases de datos, permitiéndonos así una mayor movilidad en la obtención de la información avanzando y ayudándonos con las nuevas tecnologías que día a día presentan mayores aplicaciones. 68 ANEXOS Código fuente del Sistema de Gestión de Cuestionarios Index.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>LOGIN</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Ingreso a Sistema de Gestión de Encuestas y Cuestionarios</h3> <form id="form1" name="form1" method="post" action="fn_auth.php"> <!--Inserción de datos para ingreso al sistema--> <p>Ingresa tu nombre de usuario y contraseña</p> <table> <tr> <td><p>Usuario:</p></td> <td><input type="text" name="usuario" id="usuario" /></td> </tr> <tr> 69 <td><p>Contraseña:</p></td> <td><input type="password" name="pass" id="usuario" /></td> </tr> <tr> <td><input type="submit" value="Ingresar" /></td> </tr> </table> <br /> </form> </div> <div id="footer">Todos los derechos resevados</div> </div> </body> </html> fn_auth.php <?php //Se hace conexión a la BD require_once("fn_conect_mysql.php"); db_conect(); //Se hace una consulta a la tabla de usuarios y ver que usuarios existen $query = "SELECT * FROM usuarios WHERE USUARIO= '$usuario' && PASS = '$pass'"; $result = mysql_query($query); $row=mysql_fetch_array($result); if(mysql_num_rows($result)!=0) { //usuario y contraseña validos switch ($row[TIPO]) { case "ADMIN": session_start(); session_register("autentificado"); $autentificado = "si"; 70 header("Location: principal.php"); break; case "USER": session_start(); session_register("autentificado"); $autentificado = "si"; header("Location: contesta_cuestionario.php"); break; } } else { //si no existe lo regresa al logeo header ("Location: index.php"); } mysql_free_result($result); mysql_close(); ?> Principal.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>PROYECTO SEMINARIO</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> <ul> 71 <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Inicio</h3> <p>Sistemas gestor de cuestionarios y encuestas</p> <p>Esta aplicación esta creada para la ayuda de creación de encuestas y cuestionarios</p> <p>El uso de esta aplicación permitira a los usuarios enfocarse solo en la creación de dichas encuestas y cuestionarios</p> </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos resevados</div> </div> </body> </html> Cuestionarios.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 72 <title>CUESTIONARIOS</title> <link rel="stylesheet" type="text/css" href="css/default.css"> <!--Función para confirmar si se desea eliminar cuestionario--> <script language="JavaScript"> function aviso(){ if (!confirm("¿Esta seguro que desea ELIMINAR este cuestionario y todos sus registros?")) { return false; } else { document.location = url; return true; } } </script> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Cuestionarios</h3> <p>Seleccione un cuestionario y posteriormente la acción que desea realizar con el cuestionario.</p> <form id="form" name="form" method="post" action=""> <?php //Se hace la cónexion a la BD// require_once("fn_conect_mysql.php"); 73 db_conect(); //Se hace consulta a la tabla cuestionariios// $query = "SELECT * FROM cuestionarios"; $result = mysql_query($query); //Se crea Select y se manda llamar a la variable de la consuta y visualizar los cuestionarios //existentes en nuestra BD { echo "<select name='vista_cuest' size='0'>"; echo "<option selected='selected'>=================Selección de Cuestionarios=================</option>"; while ($row = mysql_fetch_array($result)) { echo "<option>"; echo "$row[NOM_CUEST]"; echo "</option>"; } } mysql_free_result($result); echo "</select>"; ?><br> <input type="submit" name="cuest_new" id="cuest_new" value="Nuevo" onclick="this.form.action='nuevo_cuestionario.php'"/> <input type="submit" name="cuest_new3" id="cuest_new3" value="Modificar" onclick="this.form.action='modifica_cuestionario.php'"/> <!--Se genera un link en el boton de borrar hacia la función de confirmación --> <a href="javascript:;" onclick="aviso(); return false;"> <input type="submit" name="cuest_new3" id="cuest_new5" value="Eliminar" onclick="this.form.action='borrar.php'"/> </a> <input type="submit" name="cuest_new4" id="cuest_new4" value="Preguntas" onclick="this.form.action='Preguntas.php'"/> <input type="submit" name="cuest_new6" id="cuest_new6" value="Vista previa" onclick="this.form.action='vista_previa.php'"/> </form> </div> <div id="left"> 74 <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Nuevo_cuestionario.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>CUESTIONARIO NUEVO</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> 75 <div id="content"> <h3>Nuevo cuestionario</h3> <!--Ingreso de nuevo cuestionario--> <form method="post" action="insertar_cuestionario.php"> <p>Ingresa el nombre del cuestionario</p><input name="NOM_CUEST" type="text" /> <p></p><input name= "FECHA" type="hidden" /> <BR /><BR /> <input type="submit" value="Guardar" /> <input type="submit" value="Regresar" onclick="this.form.action='Cuestionarios.php'"/> </form> </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechso reservados</div> </div> </body> </html> Insertar_cuestionario.php <html> <head> <title>INSERTAR NUEVO CUESTIONARIO</title> </head> <body> <h1>Insertar nuevo cuestionario</h1> 76 <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); //Condiciana a la variable de nuevo cuestionario a que si no tiene escrito nada muestre mensaje if(!$NOM_CUEST) { echo "No se han introducido datos"; exit; } //Se hace conexión a la BD db_conect(); //Se realiza la inserción del nuevo cuestionario $query = "INSERT INTO cuestionarios (NOM_CUEST) values ('$NOM_CUEST')"; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo mysql_affected_rows()." Cuestionario introducido en la base de datos."; ?> <BR /> <form id="form" name="form" method="post" action="Cuestionarios.php"> <input type="submit" value="REGRESAR" onClick="this.form.action='Cuestionarios.php'"/> </form> </body> </html> Modifica_cuestionario.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 77 <title>MODIFICA CUESTIONARIO</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Modificación de cuestionario</h3> <!--Ingreso de nuevos datos para modificar cuestionario --> <form method="post" action="modificar_cuestionario.php"> <? require_once("fn_conect_mysql.php"); db_conect(); //Consulta del ID del cuestionario para realizar la actualización de la información// echo "Nombre del cuestionario a modificar es: $vista_cuest"; $query = "SELECT ID_CUEST FROM cuestionarios WHERE NOM_CUEST = '$vista_cuest' "; $res = mysql_query($query); $row = mysql_fetch_array($res); echo "<br />El No. del cuest en MySQL es: $row[ID_CUEST] "; echo "<input name='MOD_CUEST' type='hidden' value = '$row[ID_CUEST]'/>"; ?> <p>Ingresa el nuevo nombre del cuestionario:</p><input name="NEW_NOM_CUEST" type="text" /> <BR /><BR /><input type="submit" value="Modificar" /> <input type="submit" value="Regresar" onclick="this.form.action='Cuestionarios.php'"/> </form> 78 </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Modificar_cuestionarios.php <html> <head> <title>MODIFICAR CUESTIONARIO</title> </head> <body> <h1>Modificación de cuestionario</h1> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); //Condiciana a la variable de nuevo cuestionario a que si no tiene escrito nada muestre mensaje if(!$NEW_NOM_CUEST) { echo "No se han introducido datos"; exit; } //Se hace conexión a la BD 79 db_conect(); //Se realiza la actualización del cuestionario seleccionado $query = "UPDATE cuestionarios SET NOM_CUEST = '$NEW_NOM_CUEST' WHERE ID_CUEST = '$MOD_CUEST' "; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo mysql_affected_rows()." Cuestionario introducido en la base de datos."; ?> <form id="form" name="form" method="post" action="Cuestionarios.php"> <input type="submit" name="cuest_new" id="cuest_new" value="REGRESAR" /> </form> </body> </html> Vista_previa.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>VISTA PREVIA</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> 80 </div> <div id="content"> <h3>Vista previa</h3> <?php //Se hace conexion con MySQL require_once("fn_conect_mysql.php"); db_conect(); //Muestra el nombre de cuestionario seleccionado. echo "Nombre del cuestionario seleccionado: $vista_cuest"; echo "<br>"; //Se realiza una consulta de los cuestionarios para saber su ID de cuestionario y utilizarlo en un campo hidden y pasarlo a una variable para ser procesado y de referencia para una consulta. $query1 = "SELECT ID_CUEST, NOM_CUEST FROM cuestionarios WHERE NOM_CUEST = '$vista_cuest' "; $res = mysql_query($query1); $row = mysql_fetch_array($res); echo "Número del cuestionario seleccionado: $row[ID_CUEST]"; echo "<input name='vista_cuest' type='hidden' value = '$row[NOM_CUEST]'/>"; echo "<br>"; echo "<br>"; //Se realiza una consula a la tabla de preguntas delimitada relacionadas a ese cuestionario. por ID de cuestionario que nos devolvera todas las preguntas $query2 = "SELECT ID_PREG, PREGUNTA FROM preguntas WHERE ID_CUEST = '$row[ID_CUEST]' "; $res2 = mysql_query($query2); //Consultas prueba para scar la respuestas. /* $query3 = "SELECT * FROM CUESTIONARIOS AS CUEST LEFT JOIN PREGUNTAS AS PREG ON CUEST.ID_CUEST= PREG.ID_CUEST LEFT JOIN RESPUESTAS AS RESP ON PREG.ID_PREG=RESP.ID_PREG WHERE NOM_CUEST = '$vista_cuest'";*/ /*$query3 = "SELECT RESPUESTA, TIPO, PREG.ID_PREG, RESP.ID_PREG FROM PREGUNTAS AS PREG LEFT JOIN RESPUESTAS AS RESP ON PREG.ID_PREG = RESP.ID_PREG WHERE ID_CUEST = '$row[ID_CUEST]' ORDER BY RESP.ID_PREG";*/ //$res3 = mysql_query($query3); //Ciclo para insertar preguntas mediante la consulta a MySQL de la tabla de pregunta for($i=1;$i<=$row2 = mysql_fetch_array($res2);$i++) 81 { echo "<br>"; echo "$i.-$row2[PREGUNTA]"; echo "<br>"; echo "<br>"; //Se realiza una consula a las tablas que estan relacionadas con el cuestionario seleccionado. $query3 = "SELECT RESPUESTA, TIPO, PREG.ID_PREG, RESP.ID_PREG FROM PREGUNTAS AS PREG LEFT JOIN RESPUESTAS AS RESP ON PREG.ID_PREG = RESP.ID_PREG WHERE PREG.ID_PREG = '$row2[ID_PREG]' ORDER BY RESP.ID_PREG"; $res3 = mysql_query($query3); // for($j=1;($j<= $row3=mysql_fetch_array($res3))&&($row2[ID_PREG]==$row3[ID_PREG]);$j++) //Ciclo para insertar respuestas mediante la consulta a MySQL de las tablas relacionadas al cuestionario seleccionado. for($j=1;$j<= $row3=mysql_fetch_array($res3);$j++) { //Dependiendo del tipo de pregunta se mostraran las respuestas que contenga la pregunta switch ($row3[TIPO]) { case "TEXT": echo "$row3[RESPUESTA]"; echo "<input name='$row3[PREGUNTA]' type='text' /> "; break; case "RADIO": echo "$row3[RESPUESTA]"; echo "<input name='$row3[PREGUNTA]' type='radio' /> "; break; case "CHECKBOX": echo "$row3[RESPUESTA]"; echo "<input name='$row3[PREGUNTA]' type='checkbox' /> "; break; } echo "<br>"; } } // mysql_free_result($res1); ?> 82 </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Borrar.php <html> <head> <title>ELIMINAR CUESTIONARIO</title> </head> <body> <h1>Cuestionario eliminado</h1> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); //Se hace conexión a la BD db_conect(); //Se realiza consulta para eliminar preguntas, respouestas que petenescan al cuestionario seleccionado así como la eliminación del cuestionario. $query = "DELETE cuestionarios, preguntas, respuestas FROM ( cuestionarios LEFT OUTER JOIN preguntas ON cuestionarios.id_cuest = preguntas.id_cuest 83 ) LEFT OUTER JOIN respuestas ON preguntas.id_preg = respuestas.id_preg WHERE cuestionarios.nom_cuest = '$vista_cuest' "; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo mysql_affected_rows()." Registros eliminados en la base de datos."; ?> <form id="form2" name="form2" method="post" action="Cuestionarios.php"> <input type="submit" value="Regresar" /> </form> </body> </html> Preguntas.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>PREGUNTAS</title> <link rel="stylesheet" type="text/css" href="css/default.css"> <!--Función para confirmar si se desea eliminar pregunta--> <script language="JavaScript"> function aviso(){ if (!confirm("¿Esta seguro que desea ELIMINAR esta pregunta y todos sus registros?")) { return false; } else { document.location = url; 84 return true; } } </script> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Ingreso de preguntas</h3> <form id="form" name="form" method="post" action=""> <?php //Se hace la cónexion a la BD// require_once("fn_conect_mysql.php"); db_conect(); //Se hace consulta a la tabla cuestionarios para crear las preguntas dentro del cuestionario seleccionado// echo "Nombre del cuestionario seleccionado: $vista_cuest"; echo "<br>"; $query1 = "SELECT ID_CUEST, NOM_CUEST FROM cuestionarios WHERE NOM_CUEST = '$vista_cuest' "; $res = mysql_query($query1); $row = mysql_fetch_array($res); echo "Numero del cuestionario seleccionado: $row[ID_CUEST]"; echo "<input name='vista_cuest' type='hidden' value = '$row[NOM_CUEST]'/>"; echo "<br>"; echo "<br>"; //Se hace consulta a la tabla de preguntas para conocer si ya hay preguntas// 85 $query = "SELECT * FROM PREGUNTAS WHERE ID_CUEST = '$row[ID_CUEST]' "; $result = mysql_query($query); //Se crea Select con las preguntas existentes en la BD que correspondan al cuestionario seleccionado { echo "<select name='vista_preg' size='10'>"; echo "<option value= '0' selected='selected'>=================Seleccion de Pregunta=================</option>"; while ($row = mysql_fetch_array($result)) { echo "<option>"; echo "$row[PREGUNTA]"; echo "</option>"; } } mysql_free_result($result); echo "</select>"; ?> <br /> <input type="submit" name="cuest_new" id="cuest_new" value="Nueva" onclick="this.form.action='nuevo_preguntas'"/> <input type="submit" name="cuest_new" id="cuest_new" value="Modificar" onclick="this.form.action='modifica_preguntas.php'"/> <!--Se crea link en el boton borrar hacia la función de confirmación --> <a href="javascript:;" onclick="aviso(); return false;"> <input type="submit" name="cuest_new3" id="cuest_new5" value="Eliminar" onclick="this.form.action='borrar_preguntas.php'"/> </a> <input type="submit" name="cuest_new" id="cuest_new" value="Respuestas" onclick="this.form.action='Respuestas.php'"/> <BR /><BR /> <input type="submit" value="Regresar" onclick="this.form.action='Cuestionarios.php'"/> </form> </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> 86 <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Nuevo_preguntas.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>INGRESO PREGUNTAS</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Ingreso de preguntas</h3> <form id="form" name="form" method="post" action=""> 87 <? //Se hace conexión a la BD require_once("fn_conect_mysql.php"); db_conect(); //Se hace consulta a la tabla de cuestionarios para tener obtener el ID de cuestionario echo "Nombre del cuestionario al que se agregaran las preguntas es: $vista_cuest"; $query = "SELECT ID_CUEST, NOM_CUEST FROM cuestionarios WHERE NOM_CUEST = '$vista_cuest' "; $res = mysql_query($query); $row = mysql_fetch_array($res); echo "<br />El No. del cuest en MySQL es: $row[ID_CUEST] "; echo "<input name='vista_cuest' type='hidden' value = '$row[NOM_CUEST]'/>"; echo "<input name='AGRE_ID_CUEST' type='hidden' value = '$row[ID_CUEST]'/>"; ?> <!--Se realiza el ingreso de la indormación de la pregunta --> <p>Ingresa la pregunta:</p> <input name="PREGUNTA" type="text" /> <p>Ingresa instrucciones para esta pregunta:</p> <textarea name="INSTRUCCIONES" cols="50" rows="3"></textarea> <br /> <p>Selecciona el tipo de pregunta</p> <select name="TIPO"> <option>text</option> <option>checkbox</option> <option>radio</option> </select> <p>Seleccionar si la pregunta es requerida</p><input name="REQ" type="checkbox" enable id="REQ" /> <br /> <input type="submit" name="cuest_new" id="cuest_new" value="Guardar" onclick="this.form.action='insertar_preguntas.php'"/> <input type="submit" value="Regresar" onclick="this.form.action='Preguntas.php'"/> </form> </div> 88 <div id="left"> <p fontcolor:white>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Insertar_preguntas.php <html> <head> <title>INSERTAR NUEVA PREGUNTA</title> </head> <body> <h1>Insertar nueva pregunta</h1> <form id="form2" name="form2" method="post" action="Preguntas.php"> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); //Condiciana a la variable de ID del cuestionario, de pregunta y tipo a que si no tiene escrito nada muestre mensaje if(!$AGRE_ID_CUEST || !$PREGUNTA || !$TIPO) { echo "No se han introducido datos"; exit; } //Se hace conexión a la BD 89 db_conect(); //Se hace consulta para mostrar el nombre y el ID del cuestionario al que se le agregara la pregunta echo "Nombre del cuestionario al que se agregaran las preguntas es: $AGRE_ID_CUEST"; $query = "SELECT ID_CUEST, NOM_CUEST FROM cuestionarios WHERE ID_CUEST = '$AGRE_ID_CUEST' "; $res = mysql_query($query); $row = mysql_fetch_array($res); echo "<input name='vista_cuest' type='hidden' value = '$row[NOM_CUEST]'/>"; //Se realiza la inserción de la nueva pregunta a la tabla preguntas $query = "INSERT INTO preguntas (ID_CUEST, PREGUNTA, INSTRUCCIONES, REQ, TIPO) values ('$AGRE_ID_CUEST', '$PREGUNTA', '$INSTRUCCIONES', '$REQ', '$TIPO')"; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo "<br>"; echo mysql_affected_rows()." Pregunta introducida en la base de datos."; ?> <input type="submit" name="cuest_new" id="cuest_new" value="REGRESAR" /> </form> </body> </html> Modifica_preguntas.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>MODIFICAR PREGUNTAS</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> 90 <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Ingreso de modificación de preguntas</h3> <form id="form" name="form" method="post" action="modificar_preguntas.php"> <?php //Se hace conexión a la BD require_once("fn_conect_mysql.php"); db_conect(); //Se hace consulta a la tabla de preguntas obteniendo el ID de pregunta para actualizar la información echo "Pregunta seleccionada: $vista_preg"; $query1 = "SELECT ID_PREG FROM preguntas WHERE PREGUNTA = '$vista_preg' "; $res = mysql_query($query1); $row = mysql_fetch_array($res); echo"<br>"; echo "No. de pregunta seleccionado: $row[ID_PREG]"; echo "<input name='vista_cuest' type='hidden' value = '$vista_cuest'/>"; echo "<input name='MOD_PREG' type='hidden' value = '$row[ID_PREG]'/>"; ?> <!--Se ingresa la nueva información para la pregunta seleccionada --> <p>Ingresa pregunta:</p> <input name="NEW_PREGUNTA" type="text" /> <p>Ingresa intrucciones para la pregunta:</p> <textarea name="NEW_INSTRUCCIONES" cols="60" rows="5"></textarea> <br /> 91 <p>Selecciona el tipo de pregunta:</p> <select name="NEW_TIPO"> <option>text</option> <option>checkbox</option> <option>radio</option> </select> <p>Selecciona si la pregunta sera requerida:</p> <input name="NEW_REQ" type="checkbox" enable value="" /> <br /> <input type="submit" name="cuest_new" id="cuest_new" value="Modificar" /> <input type="submit" name="cuest_new" id="cuest_new" value="Regresar" onclick="this.form.action='Preguntas.php'";/> </form> </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Modificar_preguntas.php <html> <head> <title>MODIFICAR PREGUNTAS</title> </head> 92 <body> <h1>Modificación de pregnta</h1> <form id="form" name="form" method="post" action="Preguntas.php"> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); //Condiciana a la variable de pregunta y tipo a que si no tiene escrito nada muestre mensaje if(!$NEW_PREGUNTA || !$NEW_TIPO) { echo "No se han introducido datos"; exit; } //Se hace conexión a la BD db_conect(); echo "<input name='vista_cuest' type='hidden' value = '$vista_cuest'/>"; //Se realiza la actualización de la pregunta seleccionada $query = "UPDATE preguntas SET PREGUNTA = '$NEW_PREGUNTA', INSTRUCCIONES = '$NEW_INSTRUCCIONES', REQ = '$NEW_REQ', TIPO = '$NEW_TIPO' WHERE ID_PREG = '$MOD_PREG' "; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo mysql_affected_rows()." Pregunta modificada en la base de datos."; ?> <input type="submit" name="cuest_new" id="cuest_new" value="Regresar" /> </form> </body> </html> Borrar_preguntas.php <html> <head> <title>ELIMINAR PREGUNTA</title> 93 </head> <body> <h1>Pregunta eliminada</h1> <form id="form2" name="form2" method="post" action="Preguntas.php"> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); //Se hace conexión a la BD db_conect(); echo "<input name='vista_cuest' type='hidden' value = '$vista_cuest'/>"; //Se realiza consulta para eliminar respuestas que petenescan a la pregunta seleccionada así como la eliminación de la pregunta. $query = "DELETE preguntas, respuestas FROM preguntas LEFT OUTER JOIN respuestas ON preguntas.id_preg = respuestas.id_preg WHERE preguntas.pregunta = '$vista_preg' "; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo mysql_affected_rows()." Registros eliminados en la base de datos."; ?> <input type="submit" value="Regresar" /> </form> </body> </html> Respuestas.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 94 <title>RESPUESTAS</title> <link rel="stylesheet" type="text/css" href="css/default.css"> <!--Función para confirmar si se desea eliminar pregunta--> <script language="JavaScript"> function aviso(){ if (!confirm("¿Esta seguro que desea ELIMINAR esta respuesta?")) { return false; } else { document.location = url; return true; } } </script> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Ingreso de respuestas</h3> <form method="post" action=""> <?php //Se hace conexión a la BD require_once("fn_conect_mysql.php"); db_conect(); 95 //Se hace consulta a la tabla preguntas obteniendo el ID de pregunta y realizar la insercion de las respuestas en la pregunta seleccionada// echo "Pregunta seleccionada: $vista_preg"; echo "<br>"; $query1 = "SELECT ID_PREG, PREGUNTA FROM preguntas WHERE PREGUNTA = '$vista_preg' "; $res = mysql_query($query1); $row = mysql_fetch_array($res); echo "No. de pregunta: $row[ID_PREG]"; echo "<input name='vista_cuest' type='hidden' value = '$vista_cuest'/>"; echo "<input name='vista_preg' type='hidden' value = '$row[ID_PREG]'/>"; echo "<br>"; echo "<br>"; //Se hace consulta a la tabla de respuestas para conocer si ya hay respuestas// $query = "SELECT * FROM RESPUESTAS WHERE ID_PREG = '$row[ID_PREG]' "; $result = mysql_query($query); //Se crea Select con las respuestas existentes en la BD que correspondan a la pregunta seleccionada { echo "<select name='vista_res' size='10'>"; echo "<option value= '0' selected='selected'>=================Selección de Respuesta=================</option>"; while ($row = mysql_fetch_array($result)) { echo "<option>"; echo "$row[RESPUESTA]"; echo "</option>"; } } mysql_free_result($result); echo "</select>"; ?> <BR /> <input type="submit" value="Agregar" onclick="this.form.action='nuevo_respuestas.php'"/> <!--Se crea link en el boton borrar hacia la función de confirmación --> 96 <a href="javascript:;" onclick="aviso(); return false;"> <input type="submit" name="cuest_new3" id="cuest_new5" value="Eliminar" onclick="this.form.action='borrar_respuestas.php'"/> </a> <input type="submit" value="Regresar" onclick="this.form.action='Preguntas.php'"/> </form> </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Nuevo_respuestas.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>AGREGAR RESPUESTAS</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> 97 <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Agregar respuesta</h3> <form method="post" action=""> <? //Se hace conexión a la BD require_once("fn_conect_mysql.php"); db_conect(); //Se hace una consulta a la tabla de preguntas para obtener el ID de la pregunta y guardar la respuesta en la pregunta seleccionada. echo "No. de la pregunta seleccionada: $vista_preg"; echo "<br>"; $query1 = "SELECT ID_PREG, PREGUNTA FROM preguntas WHERE ID_PREG = '$vista_preg' "; $res = mysql_query($query1); $row = mysql_fetch_array($res); echo "Nombre de la pregunta seleccionado: $row[PREGUNTA]"; echo "<input name='vista_cuest' type='hidden' value = '$vista_cuest'/>"; echo "<input name='vista_preg' type='hidden' value = '$row[PREGUNTA]'/>"; echo "<input name='agre_id_preg' type='hidden' value = '$row[ID_PREG]'/>"; ?> <p>Ingresa la respuesta:</p><input name="RESPUESTA" type="text" /> <p>Ingresa el valor de la respuesta:</p><input name= "VALOR" type="text" /> <BR /><BR /><input type="submit" value="Guardar" onclick="this.form.action='insertar_respuestas.php'"/> <input type="submit" value="Regresar" onclick="this.form.action='Respuestas.php'"/> </form> </div> <div id="left"> 98 <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Insertar_respuestas.php <html> <head> <title>INSERTAR NUEVA RESPUESTA</title> </head> <body> <h1>Insertar nueva respuesta</h1> <form id="form" name="form" method="post" action="Respuestas.php"> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); //Condiciana a la variable de pregunta seleccionada y de respuesta a que si no tiene escrito nada muestre mensaje if(!$vista_preg || !$RESPUESTA) { echo "No se han introducido datos"; exit; } //Se hace conexión a la BD db_conect(); 99 //Se hace consulta a la tabla preguntas para obtener ID de pregunta echo "Numero de pregunta al que se agregaran las respuestas es: $agre_id_preg"; $query = "SELECT ID_PREG, PREGUNTA FROM preguntas WHERE ID_PREG = '$agre_id_preg' "; $res = mysql_query($query); $row = mysql_fetch_array($res); echo "<br />El Nombre de pregunta es: $row[PREGUNTA] "; echo "<input name='vista_cuest' type='hidden' value = '$vista_cuest'/>"; echo "<input name='vista_preg' type='hidden' value = '$vista_preg'/>"; echo "<input name='vista_preg' type='hidden' value = '$row[PREGUNTA]'/>"; //Se realiza la inserción de la nueva respuesta a la tabla respuestas $query = "INSERT INTO RESPUESTAS (ID_PREG, RESPUESTA, VALOR) values ('$agre_id_preg','$RESPUESTA', '$VALOR')"; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo mysql_affected_rows()." Respuesta introducida en la base de datos."; ?> <input type="submit" name="cuest_new" id="cuest_new" value="Regresar" /> </form> </body> </html> Borrar_respuestas.php <html> <head> <title>BORRAR RESPUESTAS</title> </head> <body> <h1>Respuesta eliminada</h1> <form id="form2" name="form2" method="post" action="Respuestas.php"> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); 100 //Se hace conexión a la BD db_conect(); //Se hace consulta para obtener ID de pregunta echo "<input name='vista_cuest' type='hidden' value = '$vista_cuest'/>"; $query2 = "SELECT PREGUNTA, id_preg FROM preguntas WHERE ID_PREG = '$vista_preg' "; $res = mysql_query($query2); $row = mysql_fetch_array($res); echo "<input name='vista_preg' type='hidden' value = '$row[PREGUNTA]'/>"; //Se hace consulta para eliminar el usuario seleccionado $query = "DELETE FROM respuestas WHERE respuesta = '$vista_res' && id_preg = '$row[id_preg]'"; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo mysql_affected_rows()." Registros eliminados en la base de datos."; ?> <input type="submit" value="Regresar" /> </form> </body> </html> Data.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>EXTRACIÓN DE DATA</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> 101 <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Extración de información</h3> <p>Selecciona el cuestinario del que desees obtener la información.</p> <form id="form" name="form" method="post" action=""> <?php //Se hace conexión ala BD require_once("fn_conect_mysql.php"); db_conect(); //Se hace una consulta a la tabla de cuestionarios para seleccionar el cuestionario del que sacaremos la información $query = "SELECT * FROM cuestionarios"; $result = mysql_query($query); //Se crea select con todos los cuestionarios en la BD { echo "<select name='vista_cuest' size='0'>"; echo "<option selected='selected'>=================Selección de Cuestionarios=================</option>"; while ($row = mysql_fetch_array($result)) { echo "<option>"; echo "$row[NOM_CUEST]"; echo "</option>"; } } mysql_free_result($result); echo "</select>"; 102 ?> <input type="submit" name="cuest_new" id="cuest_new" value="Obtener" onclick="this.form.action='obten_csv.php'"/> </form> </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Obten_csv.php <?php header('Content-type: application/vnd.ms-excel; utf-8'); //header("Content-Type: application/x-octet-stream;"); header("Content-Disposition: attachment; filename= $vista_cuest.csv;"); //header("Pragma: no-cache"); //header("Expires: 0"); //Se hace conexión ala BD require_once("fn_conect_mysql.php"); db_conect(); $query = "SELECT * FROM CUESTIONARIOS WHERE NOM_CUEST = '$vista_cuest'"; $res = mysql_query($query); $row = mysql_fetch_array($res); $query2 = "SELECT * FROM DATA WHERE ID_CUEST = '$row[ID_CUEST]'"; 103 $res2 = mysql_query($query2); $campos = mysql_num_fields($res2); $i=0; while($i<$campos){ echo mysql_field_name ($res2, $i); echo ","; $i++; } echo "\n"; while($row2=mysql_fetch_array($res2)){ for($j=0; $j<$campos; $j++) { echo $row2[$j].","; } echo "\n"; } ?> Usuarios.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>USUARIOS</title> <link rel="stylesheet" type="text/css" href="css/default.css"> <!--Función para confirmar si se desea eliminar usuario--> <script language="JavaScript"> function aviso(){ if (!confirm("¿Esta seguro que desea ELIMINAR este usuario?")) { return false; } 104 else { document.location = url; return true; } } </script> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="index.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Usuarios registrados</h3> <form method="post" action=""> <? //Se hace conexión a la BD require_once("fn_conect_mysql.php"); db_conect(); //Se hace una consulta a la tabla de usuarios y ver que usuarios existen $query = "SELECT * FROM usuarios"; $result = mysql_query($query); //Se crea Select y se manda llamar a la variable de la consuta y visualizar los usuarios existentes en nuestra BD { echo "<select name='vista_user' size='10'>"; echo "<option selected='selected'>=================Usuarios registrados=================</option>"; 105 while ($row = mysql_fetch_array($result)) { echo "<option>"; echo "$row[USUARIO]"; echo "</option>"; } } mysql_free_result($result); echo "</select>"; ?> <BR /><BR /><input type="submit" value="Nuevo" onclick="this.form.action='ingresa_usuario.php'"/> <!--Se genera un link en el boton de borrar hacia la función de confirmación --> <a href="javascript:;" onclick="aviso(); return false;"> <input type="submit" name="cuest_new3" id="cuest_new5" value="Eliminar" onclick="this.form.action='borrar_usuario.php'"/> </a> </form> </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Ingresa_usuario.php <? include("page_auth.php");?> 106 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>INGRESO DE USUARIO</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Ingreso de usuario</h3> <form method="post" action=""> <!--Ingreso de nuevo usuario--> <p>Ingresa el nombre de usuario:</p><input name="USUARIO" type="text" /> <p>Ingresa la contraseña para este usuario:</p><input name="PASS" type="password" /> <p>Selecciona el tipo de usuario</p> <select name="TIPO"> <option>ADMIN</option> <option>USER</option> </select> <BR /><BR /> <input type="submit" value="Guardar" onclick="this.form.action='ingresar_usuario.php'"/> <input type="submit" name="regreso" id="regreso" value="Regresar" onclick="this.form.action='usuarios.php'"/> 107 </form> </div> <div id="left"> <p>Menú principal</p> <ul> <li><a href="Cuestionarios.php">CUESTIONARIOS</a></li> <li><a href="data.php">DATA</a></li> <li><a href="usuarios.php">USUARIOS</a></li> <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Ingresar_usuario.php <html> <head> <title>INGRESAR USUARIO</title> </head> <body> <h1>Ingresar usuario</h1> <form id="form2" name="form2" method="post" action="usuarios.php"> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); //Condiciana a la variable usuario, pass y tipo a que si no tiene escrito nada muestre mensaje if(!$USUARIO || !$PASS || !$TIPO) { echo "No se han introducido todos los datos"; exit; 108 } //Se hace conexión a la BD db_conect(); //Se realiza la inserción del nuevo usuario en la tabla de usuariois $query = "INSERT INTO USUARIOS (USUARIO, PASS, TIPO) values ('$USUARIO', '$PASS', '$TIPO')"; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo "<br>"; echo mysql_affected_rows()." Usuario registrado en la base de datos."; ?> <input type="submit" name="cuest_new" id="cuest_new" value="Regresar" /> </form> </body> </html> Borrar_usuario.php <html> <head> <title>BORRAR USUARIO</title> </head> <body> <h1>Borrar usuario</h1> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); //Se hace conexión a la BD db_conect(); //Se hace una consulta a la tabla de usuarios $query = "SELECT * FROM usuarios WHERE USUARIO ='$vista_user'"; $result = mysql_query($query); $row = mysql_fetch_array($result); 109 //Se realiza consulta para eliminar el usuario seleccionado. $query = "DELETE FROM USUARIOS WHERE ID_USUARIO='$row[ID_USUARIO]'"; $result = mysql_query($query); //Muestra la cantidad de filas afectadas si las hay if ($result) echo mysql_affected_rows()." Registros eliminados en la base de datos."; ?> <form id="form2" name="form2" method="post" action="usuarios.php"> <input type="submit" value="Regresar" /> </form> </body> </html> Contesta_cuestionario.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>CONTESTAR CUESTIONARIOS</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> 110 <div id="content"> <h3>Contestar cuestionario</h3> <p>Selecciona el cuestinario que desees contestar.</p> <form id="form" name="form" method="post" action=""> <?php //Se hace conexión ala BD require_once("fn_conect_mysql.php"); db_conect(); //Se hace una consulta a la tabla de cuestionarios para seleccionar el que se desea contestar $query = "SELECT * FROM cuestionarios"; $result = mysql_query($query); //Se crea select con todos los cuestionarios en la BD { echo "<select name='vista_cuest' size='0'>"; echo "<option selected='selected'>=================Selección de Cuestionarios=================</option>"; while ($row = mysql_fetch_array($result)) { echo "<option>"; echo "$row[NOM_CUEST]"; echo "</option>"; } } mysql_free_result($result); echo "</select>"; ?> <input type="submit" name="cuest_new" id="cuest_new" value="Contestar" onclick="this.form.action='contesta.php'"/> </form> </div> <div id="left"> <p>Menú principal</p> <ul> 111 <li><a href="salir_auth.php">SALIR</a></li> </ul> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Contesta.php <? include("page_auth.php");?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>:::CONTESTA:::</title> <link rel="stylesheet" type="text/css" href="css/default.css"> </head> <body> <div id="contenedor"> <div id="header"> <ul> <li><a href="principal.php">HOME</a></li> <li><a href="">NOSOTROS</a></li> <li><a href="">CONTACTANOS</a></li> </ul> </div> <div id="content"> <h3>Contesta cuestionario</h3> <form id="form" name="form" method="post" action=""> <?php //Se hace conexión a la BD 112 require_once("fn_conect_mysql.php"); db_conect(); //Muestra el nombre de cuestionario seleccionado. echo "Nombre del cuestionario seleccionado: $vista_cuest"; echo "<br>"; //Se realiza una consulta de los cuestionarios para saber su ID de cuestionario $query1 = "SELECT ID_CUEST, NOM_CUEST FROM cuestionarios WHERE NOM_CUEST = '$vista_cuest' "; $res = mysql_query($query1); $row = mysql_fetch_array($res); echo "No. del cuestionario seleccionado: $row[ID_CUEST]"; echo "<input name='vista_cuest' type='hidden' value = '$row[NOM_CUEST]'/>"; echo "<input name='id_cuest' type='hidden' value = '$row[ID_CUEST]'/>"; echo "<br>"; echo "<br>"; //Se hace una consulta a la tabla de preguntas que correspondan a l cuestionario seleccionado $query2 = "SELECT ID_PREG, PREGUNTA FROM preguntas WHERE ID_CUEST = '$row[ID_CUEST]' "; $res2 = mysql_query($query2); //Ciclo para insertar preguntas mediante la consulta a MySQL de la tabla de pregunta for($i=1;$i<=$row2 = mysql_fetch_array($res2);$i++) { echo "<br>"; echo "$i.-$row2[PREGUNTA]"; echo "<br>"; echo "<br>"; //Se realiza una consula a las tablas que estan relacionadas con el cuestionario seleccionado. $query3 = "SELECT RESPUESTA, TIPO, PREG.ID_PREG, RESP.ID_PREG, RESP.ID_RESP FROM PREGUNTAS AS PREG LEFT JOIN RESPUESTAS AS RESP ON PREG.ID_PREG = RESP.ID_PREG WHERE PREG.ID_PREG = '$row2[ID_PREG]' ORDER BY RESP.ID_PREG"; $res3 = mysql_query($query3); //Ciclo para insertar respuestas mediante la consulta a MySQL de las tablas relacionadas al cuestionario seleccionado. for($j=1;$j<=$row3 = mysql_fetch_array($res3);$j++) { //Dependiendo del tipo de pregunta se mostraran las respuestas que contenga la pregunta 113 /* echo "$row3[RESPUESTA]"; echo "<input type='$row3[TIPO]' name='$row3[PREGUNTA]' /> ";*/ switch ($row3[TIPO]) { case "TEXT": echo "$row3[RESPUESTA]"; echo "<input name='da[]' type='hidden' value = '$row[ID_CUEST], $row2[ID_PREG], $row3[ID_RESP], '/> "; echo "<input name='ta[]' type='text' value=''/> "; break; case "RADIO": echo "$row3[RESPUESTA]"; echo "<input name='data[$row3[ID_PREG]]' type='radio' value = '$row[ID_CUEST], $row2[ID_PREG], $row3[ID_RESP], \"$row3[RESPUESTA]\" ' /> "; break; case "CHECKBOX": echo "$row3[RESPUESTA]"; echo "<input name='data[]' type='checkbox' value = '$row[ID_CUEST], $row2[ID_PREG], $row3[ID_RESP], \"$row3[RESPUESTA]\" '/> "; break; } echo "<br>"; } } mysql_free_result($res); ?> <br /><br /><br /> <center> <input type="submit" name="cuest_new" id="cuest_new" value="Enviar" onclick="this.form.action='insertar_datos.php'"/> </form> </center> </div> <div id="footer">Todos los derechos reservados</div> </div> </body> </html> Inserter_datos.php <html> <head> 114 <title>CUESTIONARIO CONTESTADO</title> </head> <body> <h1>Cuestionario contestado</h1> <form id="form" name="form" method="post" action="contesta_cuestionario.php"> <?php //Pide el archivo de conexión a la BD require ("fn_conect_mysql.php"); /*if(!$NOM_CUEST) { echo "No se han introducido datos"; exit; } */ //Se hace conexión a la BD db_conect(); //Se coloca en variable el numero de registros en el arreglo de la variable de texto $indice_da= count($da); //Se crea ciclo para obtener los registros de las variables de texto for($x=0;$x<=($indice_da)-1;$x++) { //Se crea variable para concatenar dos variables de tipo array $dat =$da[$x]."\\'".$ta[$x]."\\'"; //echo "$dat<br>"; //Se inserta la variable con los array concatenados en otro array $data[]= $dat; } //Se coloca en variable el numero de registros que contiene la variable que servira para ingresar los registros de las preguuntas contestadas $indice= count($data); echo "Numero de preguntas contestadas = $indice<br>"; 115 //Se obtienen todos los registros del arreglo para su inserción mediante ciclo foreach foreach($data as $data) { $data= stripslashes($data); //echo "$data<br>"; //Se realiza la inserción de el cuestionario por respuesta contestada a la tabla de data $query = "INSERT INTO data (ID_CUEST, ID_PREG, ID_RESP, DATA) values ($data)"; $result = mysql_query($query); } //Muestra la cantidad de cuestionarios contestados si las hay if ($result) echo mysql_affected_rows()." Cuestionario contestado introducido en la base de datos."; ?> <BR /> <input type="submit" value="REGRESAR" /> </form> </body> </html> Page_auth.php <?php //usuario y contraseña validos @session_start(); if ($autentificado != "si") {//si no existe lo regresa al logeo session_destroy(); //header("Location: index.php"); echo "No eres usuario autentificado"; echo "<a href='index.php'>Autentificar</a>"; exit(); } ?> Salir_auth.php 116 <?php session_start(); session_destroy(); ?> <html> <head> <title>CONTENIDO NO SEGURO</title> </head> <body> <p>Ahora estas fuera de la aplicacion</p> <a href="index.php">Autentificar</a> </body> </html> 117 REFERENCIAS BIBLIOGRAFICAS Sergio, Ezequiel Rozic (2004) "Bases de Datos" MP Ediciones Users. Cap. 11. Pag.182 César, Pérez López (2005) "Servidor de Aplicaciones, red y Programación". AlfaOmega, Ra-Ma Madrid. Cap 12. Gustavo, Gabriel Poratti (2004) "Redes" MP Ediciones Users. Cap. 10 y 2. Francisco, Charte Ojeda (2005) "PHP 5" Anaya Multimedia. Cap 7. Direcciones Electrónicas. "Archivos y Bases de Datos" http://www.rena.edu.ve/cuartaEtapa "Arquitectura de Base de Datos para Web" http://www.mailxmail.com/curso-php-mysql-sql-8/arquitectura-base-datos-web 118