Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => 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:


<?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 (php) [Seleccionar]
<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 (php) [Seleccionar]
<?php
// conexion base de datos "test"
$conx mysql_connect('localhost','root','');
mysql_select_db('test',$conx);

// suponiendo que en la base de datos tengo 4 campos "id_alumn,nombre,apellido y nota"
$resultado mysql_query('SELECT * FROM alumnos ORDER BY id_alum');

// imprimo la tabla y el formulario
print '<form action="validar.php" method="POST">';
print 
'<table border="1">';
print 
'<tr><th>Nombre</th><th>Apellido</th><th>Nota</th>';


// saco los datos
while($alumno mysql_fetch_array($resultado))
  {
print '<tr><td>'.$alumno['nombre'].'</td>';
print '<td>'.$alumno['apellido'].'</td>';
print '<td><input type="text" name="notaalumno[]" value="'.$alumno['nota'].'">';
print '<input type="hidden" name=idalumno[]" value="'.$alumno['id_alum'].'"></td></tr>';
  }

// cierro la tabla y el formulario
print '</table>';
print 
'<hr><input type="submit" value="Validar"></form>';


// cierro conexion mysql
mysql_close($conx);
?>


validar.php
Código (php) [Seleccionar]
<?php
// conexion base de datos "test"
$conx mysql_connect('localhost','root','');
mysql_select_db('test',$conx);

if(isset(
$_POST['notaalumno']) && isset($_POST['idalumno']))
{
$i 0;
$cnt count($_POST['idalumno']);
while ($i $cnt)
{
// imprimo ID del alumno
print 'ID = '.$_POST['idalumno'][$i];

// imprimo NOTA del alumno obtenida mediante POST
print ' NOTA = '.$_POST['notaalumno'][$i];

// compruebo si la nota es = que la de la base de datos
// obtengo la nota asociada al ID del alumno enviado mediante POST
$query mysql_query('Select nota FROM alumnos WHERE id_alum ='.$_POST['idalumno'][$i]);
$nota mysql_fetch_array($query);
print ' VALIDA? =';
// en caso de valida imprime "Si" si no imprime "No"
if($nota['nota'] == $_POST['notaalumno'][$i]) {print '<b>Si</b>';} else {print '<b>No</b>';} 
print '<br>';
$i++;
}

}
// cierro conexion mysql
mysql_close($conx);
?>


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:

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

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 (php) [Seleccionar]
<?php
// conexion base de datos "test"
$conx mysql_connect('localhost','root','');
mysql_select_db('test',$conx);

if(isset(
$_POST['notaalumno']) && isset($_POST['idalumno']))
{
// definir $i como 0.
$i 0;
// contar todos los inputs con nombre "idalumno"
$cnt count($_POST['idalumno']);

// mientras $i es menor a los inputs "idalumno" hacer while
while ($i $cnt)
{
// permitir solo 2 numeros o letra A.
$regex '/[a-zB-Z \/\'"]/';
$nota preg_replace($regex,'',substr($_POST['notaalumno'][$i],0,2));

// permitir solo numeros
$alumno = (int)$_POST['idalumno'][$i];

// insertar en base de datos
$query mysql_query("UPDATE alumnos SET nota = '".$nota."' WHERE id_alum = ".$alumno);

// sumar +1
$i++;

// imprimir
print 'La nota del alumno con <b>ID</b>: '.$alumno.' ha sido actualizada.<br />'
}
}

// cierro conexion mysql
mysql_close($conx);
?>


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

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

Saludos