Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: mark182 en 15 Octubre 2010, 04:21 am



Título: Me dan una idea con una codigo?
Publicado por: mark182 en 15 Octubre 2010, 04:21 am
Lo que estoy haciendo es mostrar nombres y apellidos desde una BD, y a continuacion un input tipo text para poner la nota de un examen a cada uno de los nombres. Todo esto en un formulario que apunta a otra web que validara las notas.

El problema: estoy mostrando todo con un while (nombres e input) por lo tanto los input tienen el mismo name y nose como diferenciarlos entre ellos y asociarlos a cada nombre y apellido.

Habia pensado poner un contador ($i) dentro del while para saber cuantos alumnos son y poner este contador como name del input (concatenar) pero no me dio resultado, o al menos no lo codie correctamente.

Les dejo el codigo:

Código:
<?php
                echo '<form action="validar-notas.php?r='.$i.'" enctype="multipart/form-data" method="post">
                    <div class="tit-registro">
                        <hr />
                    </div>
                    <div class="datos">';
                   
                       
                        $busq=$conexion->ejecutarQuery("SELECT id_alum,nombre,apellido FROM alumnos WHERE
                        colegio='$_POST[colegio]' ORDER BY apellido,nombre ASC");
                        $i=0;             
                        if( $_POST['colegio'] == "Pedro B. Palacios 1º (ESB)")
                        {
                          echo '<table>
                                    <thead>
                                        <tr>
                                            <th>Apellido y Nombre</th>
                                            <th>Nota</th>
                                        </tr>
                                    </thead>'; 
                          while($alumnos= $conexion->resultadoQuery($busq))
                          {                             
                             echo  '<tr>
                                       <td>'.$alumnos['apellido'].' '.$alumnos['nombre'].'</td>
                                       <td class="nota"><input type="text" name="'.$i.'" maxlength="2" /></td>
                                    </tr>';                             
                             $i++;                                                                                                                               
                          }
                          echo '</table>';
                           
                        }
                    ?>

Si necesitan mas detalles me avisan. Muchas gracias.


Título: Re: Me dan una idea con una codigo?
Publicado por: Shell Root en 15 Octubre 2010, 05:24 am
No entendí xD. Es decir, tienes que ingresar los nombres y notas o solo las notas?. De ser cualquiera de las dos opciones, donde esta la sentencia INSERT?


Título: Re: Me dan una idea con una codigo?
Publicado por: #!drvy en 15 Octubre 2010, 17:48 pm
Puesto que seleccionas en el query el id_alum y suponinedo que es un auto_increment podrias poner de nombre al input ese id.
Código
  1. <td class="nota"><input type="text" name="'.$alumnos['id_alum'].'" maxlength="2" /></td>


Saludos


Título: Re: Me dan una idea con una codigo?
Publicado por: mark182 en 16 Octubre 2010, 22:46 pm
bien drvy | BSM algo asi habia pensado. Lo voy a probar y cualquier cosa vuelvo a molestar  ;D. Gracias


Título: Re: Me dan una idea con una codigo?
Publicado por: mark182 en 19 Octubre 2010, 02:40 am
Estuve probando el codigo de drvy | BSM  pero la verdad que nose como puedo ase para diferenciar cada input en la pagina de validacion de los mismos. Me dan una idea?


Título: Re: Me dan una idea con una codigo?
Publicado por: #!drvy en 19 Octubre 2010, 15:28 pm
Veras, según lo que entiendo primero les imprimes y luego apuntas a otra web para validarlos. La pregunta que tengo es como los validas ? me refiero. Que es lo que haces para validar que validas y todo eso.

Darte una idea ? hmm

ya que tienes el id_alum puesto de nombre al input podrías luego al enviar los datos buscar con una query si es id existe y tal. El problema es que no se exactamente lo que validas y para que lo haces entonces como mucho te doy un ejemplo que se me ocurre xD

pagina_imprime_notas.php
Código
  1. <?php
  2. // conexion base de datos "test"
  3. $conx = mysql_connect('localhost','root','');
  4. mysql_select_db('test',$conx);
  5.  
  6. // suponiendo que en la base de datos tengo 4 campos "id_alumn,nombre,apellido y nota"
  7. $resultado = mysql_query('SELECT * FROM alumnos ORDER BY id_alum');
  8.  
  9. // imprimo la tabla y el formulario
  10. print '<form action="validar.php" method="POST">';
  11. print '<table border="1">';
  12. print '<tr><th>Nombre</th><th>Apellido</th><th>Nota</th>';
  13.  
  14.  
  15. // saco los datos
  16. while($alumno = mysql_fetch_array($resultado))
  17.  {
  18. print '<tr><td>'.$alumno['nombre'].'</td>';
  19. print '<td>'.$alumno['apellido'].'</td>';
  20. print '<td><input type="text" name="notaalumno[]" value="'.$alumno['nota'].'">';
  21. print '<input type="hidden" name=idalumno[]" value="'.$alumno['id_alum'].'"></td></tr>';
  22.  }
  23.  
  24. // cierro la tabla y el formulario
  25. print '</table>';
  26. print '<hr><input type="submit" value="Validar"></form>';
  27.  
  28.  
  29. // cierro conexion mysql
  30. mysql_close($conx);
  31. ?>

validar.php
Código
  1. <?php
  2. // conexion base de datos "test"
  3. $conx = mysql_connect('localhost','root','');
  4. mysql_select_db('test',$conx);
  5.  
  6. if(isset($_POST['notaalumno']) && isset($_POST['idalumno']))
  7. {
  8. $i = 0;
  9. $cnt = count($_POST['idalumno']);
  10. while ($i < $cnt)
  11. {
  12. // imprimo ID del alumno
  13. print 'ID = '.$_POST['idalumno'][$i];
  14.  
  15. // imprimo NOTA del alumno obtenida mediante POST
  16. print ' NOTA = '.$_POST['notaalumno'][$i];
  17.  
  18. // compruebo si la nota es = que la de la base de datos
  19. // obtengo la nota asociada al ID del alumno enviado mediante POST
  20. $query = mysql_query('Select nota FROM alumnos WHERE id_alum ='.$_POST['idalumno'][$i]);
  21. $nota = mysql_fetch_array($query);
  22. print ' VALIDA? =';
  23. // en caso de valida imprime "Si" si no imprime "No"
  24. if($nota['nota'] == $_POST['notaalumno'][$i]) {print '<b>Si</b>';} else {print '<b>No</b>';}
  25. print '<br>';
  26. $i++;
  27. }
  28.  
  29. }
  30. // cierro conexion mysql
  31. mysql_close($conx);
  32. ?>

Lo que hace es poner un campo oculto que almacena el ID del alumno. Se puede mejorar y la seguridad es muy baja pero es solo pa que te sirva de referencia.


Saludos



Título: Re: Me dan una idea con una codigo?
Publicado por: mark182 en 19 Octubre 2010, 16:40 pm
Gracias por tu respuesta, lo que quiero validar es la nota (que sea del 1 al 10, que no sean letras, y en el caso que sea una letra, que sea una A unicamente). O sea, la nota la va a poner el usuario, no es un dato sacado de una base de datos. Por eso, necesito validarlo y guardarlo en una BD, y que cada nota este asociada al nombre y apellido que aparecen (que eso si esta sacado de una BD). Se entiende maso menos?

En tu ejemplo no entiendo porque pones de name un vector y luego cuando lo capturas con post no lo pones como vector. Por ejemplo:

Código:
print '<input type="hidden" name=idalumno[]" value="'.$alumno['id_alum'].'"></td></tr>';

Código:
 isset($_POST['idalumno'])


Título: Re: Me dan una idea con una codigo?
Publicado por: #!drvy en 19 Octubre 2010, 19:33 pm
Lo pongo porque asi tendria varios campos con el mismo nombre pero en forma de array que podre recuperar facilmente luego.
Código
  1. <?php
  2. // conexion base de datos "test"
  3. $conx = mysql_connect('localhost','root','');
  4. mysql_select_db('test',$conx);
  5.  
  6. if(isset($_POST['notaalumno']) && isset($_POST['idalumno']))
  7. {
  8. // definir $i como 0.
  9. $i = 0;
  10. // contar todos los inputs con nombre "idalumno"
  11. $cnt = count($_POST['idalumno']);
  12.  
  13. // mientras $i es menor a los inputs "idalumno" hacer while
  14. while ($i < $cnt)
  15. {
  16. // permitir solo 2 numeros o letra A.
  17. $regex = '/[a-zB-Z \/\'"]/';
  18. $nota = preg_replace($regex,'',substr($_POST['notaalumno'][$i],0,2));
  19.  
  20. // permitir solo numeros
  21. $alumno = (int)$_POST['idalumno'][$i];
  22.  
  23. // insertar en base de datos
  24. $query = mysql_query("UPDATE alumnos SET nota = '".$nota."' WHERE id_alum = ".$alumno);
  25.  
  26. // sumar +1
  27. $i++;
  28.  
  29. // imprimir
  30. print 'La nota del alumno con <b>ID</b>: '.$alumno.' ha sido actualizada.<br />';
  31. }
  32. }
  33.  
  34. // cierro conexion mysql
  35. mysql_close($conx);
  36. ?>

creo que esto es mas o menos lo que pides no ?

PD: La pagina inicial seria la misma excepto que
Código
  1. print '<td><input type="text" name="notaalumno[]" value="'.$alumno['nota'].'">';
seria
Código
  1. print '<td><input type="text" name="notaalumno[]" value="">';

Saludos