Necesitas un medio para almacenar dichos datos. En el momento en el que refrescas la pagina, PHP resetea todo y empieza a ejecutarlo de nuevo. Por tanto, no es que los sobre-escribas (que también) si no que directamente los escribes de nuevo. Hay varios metodos para guardar datos. Lo más común es que uses una base de datos ya que ahí son faciles de acceder, modificar y eliminar.. además de que son persistentes. Luego también puedes usar archivos pero los tienes que parsear (leer, escribir, guardar).
Y para este ejemplo, voy a usar sesiones. Una sesión es como una cookie pero se guarda al lado del servidor y puede contener muchos más datos. Por supuesto, la sesión es solo para el usuario que lo este usando.. es decir, la información no se comparte con otros.
Uso básico de sesiones | PHP.http://php.net/manual/es/session.examples.basic.phpPara empezar, es muy importante declarar el inicio de la sesión antes de imprimir cualquier cosa. Recordemos que las sesiones son cookies y las cookies van por cabeceras HTTP y las cabeceras HTTP van antes que el contenido.
<html>
<head>
<meta charset="utf-8">
<title>Documento sin título</title>
</head>
<body>
<form action="datos.php" method="post">
<label for="nombre">Ingrese el Nombre</label>
<input type="text" name="nombre">
<label for="apellido">Ingrese el Apellido</label>
<input type="text" name="apellido">
<label for="ci">Ingrese el # Carnet</label>
<input type="text" name="ci">
<div>
<button type="submit">Enviar datos</button>
</div>
</form>
<table border="1">
<tr>
<td>Nombre</td>
<td>Apellido</td>
<td>No. Carnet</td>
</tr>
<?php
include 'Persona.php';
// Si hay datos de una sesión previa..
if(isset($_SESSION['datosPersona'])) {
// Obtenerlos y convertirlos en datos usables.
} else {
// Si no, declarar un array vacio.
}
// Si el usuario esta intentando añadir una nueva persona...
$nombre = $_POST['nombre'];
$apellido = $_POST['apellido'];
$ci = $_POST['ci'];
// Añadir un elemento al array de datos con una nueva persona.
$datos[] = new Persona($nombre, $apellido, $ci);
// Guardar la sesión con los nuevos datos.
$_SESSION['datosPersona'] = serialize($datos);
}
// Imprimir los datos.
foreach($datos as $persona){
echo '<tr>',
'<td>', $persona->nombre, '</td>',
'<td>', $persona->apellido, '</td>',
'<td>', $persona->ci, '</td>',
'</tr>';
}
?>
</table>
</body>
</html>
Y
Persona.php contendrá la clase que es lo que más nos interesa.
class Persona {
public $nombre, $apellido, $ci;
public function __construct($nombre, $apellido, $ci){
$this->nombre = $nombre;
$this->apellido = $apellido;
$this->ci = $ci;
}
}
__construct se ejecuta nada más el objeto se inicializa (
new). Es util para hacer comprobaciones o para en este caso, poder indicarle valores a la clase a la hora de inicializarla y no usando una función aparte. Nota como tu función
mostrar() no tiene ningún sentido ya que ni haces uso de
return, ni hace falta usarla ya que las variables que declaramos son publicas y accesibles desde fuera.
Fíjate también en el uso de las funciones
serialize y
unserialize. Estas convierten objetos y contenido en general en un formato apto para guardarlo en el disco y para su posterior uso. Si vas a querer almancenar objetos ya inicializados con contenido dentro, te van a hacer falta.. aunque uses bases da datos.
Solucionado esto, déjame sugerirte algunas cosas:
Intenta escribir el código HTML de forma correcta. - Por ejemplo, todo el contenido lo tienes
antes de la etiqueta
<body> que es la que se supone que debería contener el contenido.
- Lo normal es usar
<label> como descriptor de un
input y no el
<h5>.
E, intenta escribir el PHP de forma clara y limpia. - Por ejemplo,
echo NO es una función. No lo uses como tal.
- Intenta imprimir el menor contenido posible con PHP. Es muy liante mezclar ambos (php y html) cuando solo con uno (el ultimo) puedes hacerlo casi todo. También afecta al tiempo de ejecución lo cual a gran escala puede darte dolores de cabeza. Lo digo porque imprimes el
<table> y el primer
<tr> cuando no hace falta.
- En vez de usar
count y
for, usa
foreach que hace lo mismo.
- Asegúrate de que estas tratando datos.. en el código que has puesto, llamas a
$_POST sin comprobar si este tiene contenido. PHP te va a tirar un
Notice avisándote pero como la mayoría lo tenéis desactivado, se os pasa por alto.
- Las funciones y las variables (métodos y propiedades) dentro de una clase, deberían tener un atributo de visibilidad.
public, protected y private. Más sobre eso aquí ->
http://php.net/manual/es/language.oop5.visibility.php- Y por ultimo, intenta entender el funcionamiento del código. Estas sobre-escribiendo
$datos constantemente y no lo tratas como un array cuando si debería serlo. No usas
return en
mostrar() esperando a que PHP se de cuenta mágicamente de que quieres devolver esos valores (cosa que no es así).
Saludos