> Faqs > Recibir valores de formulario de múltiples campos mediante PHP para insertar vía PDO

Recibir valores de formulario de múltiples campos mediante PHP para insertar vía PDO

Estoy haciendo una app web para control de asistencia y quiero de una tabla seleccionada, en un campo select ponga a cada alumno si es presente o ausente.

Esto lo he hecho mediante un form y pdo, pero me inserta el último valor pero no sé cómo ponerlo para que me inserte todos, si poner un foreach o no se, a ver si me podéis indicar como hacerlo.

Os pongo mi codigo.

  1. primero os pongo el form.
<?php
//incluye la clase Libro y CrudLibro
require_once('crud_libro.php');
require_once('libro.php');
$crud=new CrudLibro();
$libro= new Libro();
//obtiene todos los libros con el método mostrar de la clase crud
$libro=$crud->mostrar_sele($_GET['id']);


?>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.min.js">
</script>


<html>
<head>
<title>Mostrar Libros</title>

<link rel="stylesheet" type="text/css" href="style/tabla.css" />

<img src="img/judolorenzo.jpg"><br><br>

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>jQuery UI Datepicker - Default functionality</title>

 

<link rel="stylesheet" href="//code.jquery.com/ui/1.13.0/themes/base/jquery-ui.css">
<link rel="stylesheet" href="/resources/demos/style.css">
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script src="https://code.jquery.com/ui/1.13.0/jquery-ui.js"></script>
<script>
$( function() {
$( "#datepicker" ).datepicker({dateFormat: "yy-mm-dd"});
} );


</script>
</head>
<body>
<form action='administrar_libro.php' method='post'>
<p>Selecciona Fecha: <input type="text" id="datepicker" name='date' required></p>

<table border=1>
<head>
<td>Idalumno</td>
<td>Nombre</td>
<td>Apellidos</td>
<td>Asistencia</td>

</head>
<body>

<?php foreach ($libro as $libro2) {?>
<tr>
<td> <input type='text' name='id' value='<?php echo $libro2->getId()?>'></td>
<td> <input type='text' name='nombre' value='<?php echo $libro2->getNombre()?>'></td>

 

<td> <input type='text' name='apellidos' value='<?php echo $libro2->getApellidos()?>'></td>


<td><select v-model="employee.status" class="form-control" name='estado'>
<option disabled value="unset">--Select--</option>
<option value="presente">Presente</option>
<option value="ausente">Ausente</option>
</select> </td>


</tr>
<?php }?>
</body>
<input type='hidden' name='asistencia' value='asistencia' >
</table><BR><br>

<input type='submit' value='Guardar' name="guardar">

<a href="index.php">Volver</a>
</form>
</body>
</html>
  1. luego paso los datos a un php de administracion para tratar los datos recibidos del form.
}elseif(isset($_POST['asistencia'])){


$libro2->setNombre($_POST['nombre']);
$libro2->setApellidos($_POST['apellidos']);
// $libro->setAnio_nacimiento($_POST['fecha']);

$libro2->setEstado($_POST['estado']);
$libro2->setId($_POST['id']);
$libro2->setFecha($_POST['date']);

//llama a la función asistencia definida en el crud
$crud->asistencia($libro2);

echo '<div class="alert alert-success">Has registrado correctamente la asistencia del día.</div>';

print "<pre>"; print_r($_REQUEST); print "</pre>\n";

y por ultimo el del crud del libro que inserta en mysql

// método para insertar asistencia, recibe como parámetro un objeto de tipo libro
public function asistencia($libro2){
$db=Db::conectar();
$asistencialibros=[];
$insert=$db->prepare('INSERT INTO asistencia values (NULL,:nombre,:apellidos,:estado,:id, :date)');


$insert->bindvalue('nombre',$libro2->getNombre());
$insert->bindvalue('apellidos',$libro2->getApellidos());

$insert->bindvalue('estado',$libro2->getEstado());
$insert->bindvalue('id',$libro2->getId());
$insert->bindvalue('date',$libro2->getFecha());
//

$insert->execute();

Respuestas

Tu problema realmente no parece ser con PDO, dado que como dices te llega a insertar un valor. El problema es cómo estás construyendo el formulario.

Básicamente si puedes tener varios libros en el formulario, tienes que poner a cada uno de los campos de cada libro algo para que se diferencien los unos de los otros.

El problema en tu código es que todos los campos <input> del nombre del libro se llaman igual:

<input type='text' name='nombre' value='<?php echo $libro2->getNombre()?>'>

Eso no puede ser, porque entonces por mucho que tengas varios campos, lo que ocurre es que solamente te llega el valor de 1, que es justamente lo que estás percibiendo.

Tendrías que concatenar en el atriburo "name" el identificador del libro, para que el campo de formulario cambie el "name" para cada <input> y así puedas recibirlos todos.

<input type='text' name='nombre<?php echo $libro2->getId()?>' value='<?php echo $libro2->getNombre()?>'>

Otra alternativa es poner como unos corchetes en el name de los campos de texto <input>, lo que te asegurará que esos campos se envíen todos, tratándolos como un array, en cuyo caso los podrás recibir con un bucle.

<input type='text' name='nombre[]' value='<?php echo $libro2->getNombre()?>'>

Entonces para recibir todos los nombres usarás un bucle foreach, de esta manera.

foreach($_POST['nombre'] as $nombre) {
    echo $nombre . '<br>';
}
Julian
581 18 47 36