[Ayuda] ¿Qué hice mal?

Iniciado por danny920825, 19 Enero 2017, 19:37 PM

0 Miembros y 1 Visitante están viendo este tema.

danny920825

Hola a todos. Cómo puedo hacer que un formulario que se procesa en la misma página incremente las variables?
Creo que no me hago entender así que dejo el código primero
Código (php) [Seleccionar]

<html>
<head>
<meta charset="utf-8">
<title>Documento sin título</title>
</head>
<form action="index.php" method="post">
<h5>Ingrese el Nombre</h5>
<input type="text" name="nombre">
<h5>Ingrese el Apellido</h5>
<input type="text" name="apellido">
<h5>Ingrese el # Carnet</h5>
<input type="text" name="ci">
<div><input type="submit"></div>
</form>
<?php
include(
"class.php");


$nb=$_POST['nombre'];
$ap=$_POST['apellido'];
$ci=$_POST['ci'];


$datos = new Datos();
$datos->insertar($nb$ap$ci);
//$datos->mostrar();
$contcount($datos);
echo ("<table border='1'>");
echo ("<tr>");
                    echo (
"<td>Nombre</td><td>Apellido</td><td>No. Carnet</td>");
echo ("</tr>");
for ($i=1$i<=$cont$i++)
{
$nombre=$datos->nombre;
$apellido=$datos->apellido;
$carnet=$datos->CI;
echo ("<tr><td>".$nombre."</td><td>".$apellido."</td><td>".$carnet."</td></tr>");
}
                    echo (
"</table>");


?>

<body>
</body>
</html>

Pues lo que pasa es que si cuando se muestran los datos, trato de insertar otros datos, lo que hace es que los sobreescribe, no los añade a la lista.
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

drfunes

#1
Creo que debería ser $nombre=$datos[$i]->nombre; O $datos->user($i)->nombre, en donde user identifique al usuario mediante el parámetro $i.

El [$i] que usas determinaría el carácter e $i su posición, en cambio el $i tú lo pretendes usar para seleccionar cada registro (o persona).
Eventualmente debes modificar la clase Datos(); que invocas en class.php


danny920825

A ver, yo probé
Código (php) [Seleccionar]
$nombre=$datos[$i]->nombre; y
Código (php) [Seleccionar]
$nombre=$datos->nombre($i);
y da un error tamaño olimpiada. No sé cómo añadir un nuevo registro a esa clase. No sé a qué te refieres con modificar la clase Datos. Aquí te dejo el código de dicha clase para que me expliques si puedes con bases:

Código (php) [Seleccionar]

<?php 

class Datos
{

var $nombre;
var $apellido;
var $CI;

function insertar($nb$ap$ci)
{
$this->nombre=$nb;
$this->apellido=$ap;
$this->CI=$ci;
}
function mostrar()
{
$this->nombre;
$this->apellido;
$this->CI;

}

}


?>

"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

#!drvy

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.php

Para 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.

Código (php) [Seleccionar]
<?php session_start(); ?>
<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.
                
$datos unserialize($_SESSION['datosPersona']);

            } else {

                
// Si no, declarar un array vacio.
                
$datos = array();

            }


            
// Si el usuario esta intentando añadir una nueva persona...
            
if(!empty($_POST)){

                
$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.

Código (php) [Seleccionar]
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

danny920825

Digamos que lo de la funcion mostrar() si tenia los return pero de tanto romperme la cabeza lo quite antes de publicar buscando alguna otra alternativa. Desconocía lo de serializar las sessiones y tengo que estudiar más acerca de los arrays. Ya entendi que las variables se "reinician" cuando recargas la página. Es que hubo un tiempo en que programé en C++ (lo básico pues fue en la escuela) y las variables se incrementaban con un ciclo, pero aqui no tenía forma de hacer eso. Sé que en una Base de Datos es más facil guardar los datos y leerlos luego, pero buscaba alguna forma que supuestamente fuera menos complicada, pero creo que no lo es.

Sobre lo de escribir el código más limpio... LECCION APRENDIDA. Gracias por siempre brindar de tu tiempo para enseñar a los que empezamos. Espero mejorar con la ayuda de ustedes. Hasta la próxima duda.
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno