Foros del Web » Programando para Internet » PHP »

Validar cuestionario

Estas en el tema de Validar cuestionario en el foro de PHP en Foros del Web. Hola: Estoy haciendo un cuestionario en linea y ando atorado en el proceso de validación, que no hayo cómo hacer. He visto en algunos sitios ...
  #1 (permalink)  
Antiguo 19/07/2006, 22:28
 
Fecha de Ingreso: febrero-2005
Mensajes: 135
Antigüedad: 12 años, 9 meses
Puntos: 0
Exclamación Validar cuestionario

Hola:

Estoy haciendo un cuestionario en linea y ando atorado en el proceso de validación, que no hayo cómo hacer.

He visto en algunos sitios que la página se valida antes de ser enviada e indica los campos que han faltado coloreando el texto, pero no he encontrado alguna muestra.

La cuestión es que el validador detecte si hay alguna pregunta que no esté contestada y antes de dar los resultados indique que se conteste la(s) pregunta(s).

¿Me explico?

Aquí la liga al cuestionario.

http://ensemblesys.com/curso/examen_ecologia2.php

Y también deseo algo un poco más complicado, que una vez dados los resultados también se muestren las respuestas incorrectas. Supongo que eso sería más fácil de hacer con una base de datos. El cuestionario actual está hecho con puro código directo.

Aquí doy el código del calificador (realmente algo muuuy sencillo, soy novato en esto del PHP):

Código PHP:
$preg1 $_POST['preg1'];
$preg2 $_POST['preg2'];
$preg3 $_POST['preg3'];
$preg4 $_POST['preg4'];
$preg5 $_POST['preg5'];
$preg6 $_POST['preg6'];
$preg7 $_POST['preg7'];
$preg8 $_POST['preg8'];
$preg9 $_POST['preg9'];
$preg10 $_POST['preg10'];
$preg11 $_POST['preg11'];
$preg12 $_POST['preg12'];
$preg13 $_POST['preg13'];
$preg14 $_POST['preg14'];
$preg15 $_POST['preg15'];
$preg16 $_POST['preg16'];
$preg17 $_POST['preg17'];
$preg18 $_POST['preg18'];
$preg19 $_POST['preg19'];
$preg20 $_POST['preg20'];
$preg21 $_POST['preg21'];
$preg22 $_POST['preg22'];
$preg23 $_POST['preg23'];
$preg24 $_POST['preg24'];
$preg25 $_POST['preg25'];
$preg26 $_POST['preg26'];
$preg27 $_POST['preg27'];
$preg28 $_POST['preg28'];
$preg29 $_POST['preg29'];
$preg30 $_POST['preg30'];
$preg31 $_POST['preg31'];
$preg32 $_POST['preg32'];
$preg33 $_POST['preg33'];
if (isset(
$_POST['preg34'])){
    
$preg34 $_POST['preg34'];
};
if (isset(
$_POST['preg35'])){
    
$preg35 $_POST['preg35'];
};
if (isset(
$_POST['preg36'])){
    
$preg36 $_POST['preg36'];
};
if (isset(
$_POST['preg37'])){
    
$preg37 $_POST['preg37'];
};
if (isset(
$_POST['preg38'])){
    
$preg38 $_POST['preg38'];
};
if (isset(
$_POST['preg39'])){
    
$preg39 $_POST['preg39'];
};
if (isset(
$_POST['preg40'])){
    
$preg40 $_POST['preg40'];
};

$contador 0;

if (
$preg1 == "") {
    
$contador $contador 1;
};
if (
$preg2 == d) {
    
$contador $contador 1;
};
if (
$preg3 == a) {
    
$contador $contador 1;
};
if (
$preg4 == c) {
    
$contador $contador 1;
};
if (
$preg5 == b) {
    
$contador $contador 1;
};
if (
$preg6 == f) {
    
$contador $contador 1;
};
if (
$preg7 == e) {
    
$contador $contador 1;
};
if (
$preg8 == h) {
    
$contador $contador 1;
};
if (
$preg9 == a) {
    
$contador $contador 1;
};
if (
$preg10 == d) {
    
$contador $contador 1;
};
if (
$preg11 == f) {
    
$contador $contador 1;
};
if (
$preg12 == g) {
    
$contador $contador 1;
};
if (
$preg13 == c) {
    
$contador $contador 1;
};
if (
$preg14 == b) {
    
$contador $contador 1;
};
if (
$preg15 == i) {
    
$contador $contador 1;
};
if (
$preg16 == e) {
    
$contador $contador 1;
};
if (
$preg17 == d) {
    
$contador $contador 1;
};
if (
$preg18 == b) {
    
$contador $contador 1;
};
if (
$preg19 == c) {
    
$contador $contador 1;
};
if (
$preg20 == a) {
    
$contador $contador 1;
};
if (
$preg21 == a) {
    
$contador $contador 1;
};
if (
$preg22 == b) {
    
$contador $contador 1;
};
if (
$preg23 == a) {
    
$contador $contador 1;
};
if (
$preg24 == a) {
    
$contador $contador 1;
};
if (
$preg25 == a) {
    
$contador $contador 1;
};
if (
$preg26 == c) {
    
$contador $contador 1;
};
if (
$preg27 == b) {
    
$contador $contador 1;
};
if (
$preg28 == b) {
    
$contador $contador 1;
};
if (
$preg29 == c) {
    
$contador $contador 1;
};
if (
$preg30 == c) {
    
$contador $contador 1;
};
if (
$preg31 == a) {
    
$contador $contador 1;
};
if (
$preg32 == c) {
    
$contador $contador 1;
};
if (
$preg33 == c) {
    
$contador $contador 1;
};
if (empty(
$preg34)) {
    
$contador $contador 1;
};
if (!empty(
$preg35)) {
    
$contador $contador 1;
};
if (empty(
$preg36)) {
    
$contador $contador 1;
};
if (!empty(
$preg37)) {
    
$contador $contador 1;
};
if (!empty(
$preg38)) {
    
$contador $contador 1;
};
if (!empty(
$preg39)) {
    
$contador $contador 1;
};
if (empty(
$preg40)) {
    
$contador $contador 1;
};
$resultado $contador 10 40;

echo 
"
<p>Este es tu resultado <strong>$resultado</strong>sobre un máximo de 10</p>
<p>Tuviste <strong>$contador</strong> aciertos de 40</p>
"

Gracias
  #2 (permalink)  
Antiguo 19/07/2006, 23:25
Avatar de devildriver  
Fecha de Ingreso: julio-2006
Mensajes: 118
Antigüedad: 11 años, 5 meses
Puntos: 0
De acuerdo Espero q te sirva

Hola amigo yo tambien soy nuevo en esto de php, pero espero en ayudarte en eso, Segun lo que entiendo es que tu tiene un sin fin de preguntas en tu cuestionario que por logica deben ser contestadas, bueno yo empleo lo siguiente cuando necesito validar que una variable no este vacia.


<? if (!$pregunta1 || !$pregunta2 || !$pregunta3 || !$pregunta..N+1 || )
{
echo " Debe llenar todos los campos, gracias!";?> //Redireccionalo atras
}

else { AQUI TE MUESTRO LOS RESULTADOS DEL CUESTIONARIO}

En cuanto a lo otro que te muestre las respuesta a sus errores puedes simplemente hacer un llamado de sus respuestas a una pagina (osea trasladas las respuestas del encuestado en la pagina resultado) y ahi tu deberias ponerle obviamente su puntuacion y las respuestas de todas al lado. y tienes dos opciones diria yo, o pones que el encuestado, a lo criollo vea en q se equivoco o simplemente que te compare cada variable de las respuestas dadas por el encuestado con variables que son las respuestas correctas y si son iguales que te diga correcta y si no incorrecta. bueno amigo espero ayudarte me gustaria saber si te fui de utilidad, me mandas un privado o yo abro tu tema a ver como vas. Saludos
  #3 (permalink)  
Antiguo 20/07/2006, 17:42
 
Fecha de Ingreso: febrero-2005
Mensajes: 135
Antigüedad: 12 años, 9 meses
Puntos: 0
Gracias Delvildriver.

Estoy implementando la primera solución de la validación.

Con respecto a los resultados correctos, encontré una página en la que más o menos se hace lo que deseo:

pagina

En esta página al darle en enviar, sin llenar algo, colorea de naranja las opciones que son obligatorias y fueron omitidas. Aunque el formato de dicho sitio no es php.

Aun no encuentro cómo hacerlo.

Saludos.
  #4 (permalink)  
Antiguo 20/07/2006, 21:39
Avatar de devildriver  
Fecha de Ingreso: julio-2006
Mensajes: 118
Antigüedad: 11 años, 5 meses
Puntos: 0
Eso de los colores de verdad que no se que hacer.
  #5 (permalink)  
Antiguo 21/07/2006, 05:49
Avatar de franquero  
Fecha de Ingreso: julio-2005
Mensajes: 179
Antigüedad: 12 años, 5 meses
Puntos: 1
Hola yconoclasta, te voy a plantear cómo hago yo los formularios con php. Creo que te puede ayudar con la validación.

1. En el formulario incluyo un input hidden (campo oculto)
Código PHP:
<input type="hidden" name="enviado" value="1"
2. La estructura del formulario, dependiendo de si ha sido enviado o no:
Código PHP:
if (array_key_exists("enviado"$_POST)) {
   
validar();
} else {
   
mostrar_formulario();

3. mostrar_formulario
Código PHP:
function mostrar_formulario() {
print<<<HTML
//El formulario se carga en esta misma página
<form action="$_SERVER
[PHP_SELF]" method="post">
<input type="radio" name="....
...
...
...
<input type="hidden" name="enviado" value="1">
<input type="submit" value="Enviar!">
</form>
HTML;

4. validar()
Código PHP:
function validar() {
//creamos un array para guardar los errores
$errores = array();
//añadimos tantos errores como fallos haya en el formulario
if (!$_POST['pregunta1']) {
   
$errores[] = 'Debe responder la pregunta 1';
}
if (!
$_POST['pregunta2']) {
   
$errores[] = 'Debe responder la pregunta 2';
}
....
//Comprobamos el array. Si tiene errores los listamos y volvemos
//a imprimir el formulario. Si no hay errores lo procesamos
if ($errores) {
   print 
'<ul>';
   foreach (
$errores as $err) {
   print 
'<li>' $err '</li>';
   }
   print 
'</ul>';
   
mostrar_formulario();
} else {
   
procesar();
}

5. procesar()
Aquí haces lo que quieras con las respuestas, sabiendo que están todas respondidas correctamente

6. Tienes que tener en cuenta que si hay algún error y el formulario se vuelve a imprimir, se perderán las respuestas que hubiera dado el usuario, por eso es conveniente recuperarlas y volver a imprimirlas en el formulario (Por lo que he leído tu formulario se basa en opciones radio, pero en caso de tener campos como text, textarea, select, se puede hacer lo mismo fácilmente):
Código PHP:
//creamos la funcion
function recuperar_respuesta($nombre,$valor) {
if ((
array_key_exists($nombre$_POST)) AND ($_POST[$nombre] == $valor)) {
$check "checked=\"checked\"";
} else {
$check '';
}
return(
$check);
}
//la aplicamos a cada pregunta
$recuperar1a recuperar_respuesta('pregunta1''a');
$recuperar1b recuperar_respuesta('pregunta1''b');
$recuperar1c recuperar_respuesta('pregunta1''c');

//la incluimos en el formulario
<input type="radio" name="pregunta1" value="a" $recuperar1a>Respuesta a<br>
<
input type="radio" name="pregunta1" value="b" $recuperar1b>Respuesta b<br>
<
input type="radio" name="pregunta1" value="c" $recuperar1c>Respuesta c<br
Espero que te sea de ayuda.
Saludos
__________________
Es una suerte que la sociedad libre sea más productiva, porque de no haberlo sido jamás se habría tolerado.
  #6 (permalink)  
Antiguo 21/07/2006, 06:20
Avatar de franquero  
Fecha de Ingreso: julio-2005
Mensajes: 179
Antigüedad: 12 años, 5 meses
Puntos: 1
Cita:
Iniciado por yconoclasta
En esta página al darle en enviar, sin llenar algo, colorea de naranja las opciones que son obligatorias y fueron omitidas. Aunque el formato de dicho sitio no es php.
Saludos.
Esto de los colores no lo he hecho nunca, pero supongo que no debe ser muy complicado. No sé si maquetas tu formulario con CSS o tablas, usaré de ejemplo el bgcolor de una tabla:
Código PHP:
function color_error($nombre) {
if ((
array_key_exists("enviado"$_POST)) AND (!$_POST[$nombre])) {
$color "bgcolor=\"#FF0000\"";
//Si lo haces con CSS: $color = "<div id=\"error\">"
} else {
$color '';
//Si lo haces con CSS: $color = "<div id=\"bien\">"
}
return(
$color);
}

//aplicamos la función
$color1 color_error('pregunta1');

//en la función mostrar_formulario()
...
<
td $color1>Pregunta 1:<br>
<
input type="radio" ....>Respuesta a<br>
<
input type="radio" ....>Respuesta b<br>
...
</
td
No lo he probado, y puede que haya formas de hacerlo más rápido, pero no caigo ahora mismo

Saludos
__________________
Es una suerte que la sociedad libre sea más productiva, porque de no haberlo sido jamás se habría tolerado.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:55.