elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  [Ayuda] ¿Qué hice mal?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] ¿Qué hice mal?  (Leído 1,250 veces)
danny920825

Desconectado Desconectado

Mensajes: 175


Ver Perfil WWW
[Ayuda] ¿Qué hice mal?
« en: 19 Enero 2017, 19:37 pm »

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
  1. <html>
  2. <head>
  3. <meta charset="utf-8">
  4. <title>Documento sin título</title>
  5. </head>
  6. <form action="index.php" method="post">
  7. <h5>Ingrese el Nombre</h5>
  8. <input type="text" name="nombre">
  9. <h5>Ingrese el Apellido</h5>
  10. <input type="text" name="apellido">
  11. <h5>Ingrese el # Carnet</h5>
  12. <input type="text" name="ci">
  13. <div><input type="submit"></div>
  14. </form>
  15. <?php
  16. include("class.php");
  17.  
  18.  
  19. $nb=$_POST['nombre'];
  20. $ap=$_POST['apellido'];
  21. $ci=$_POST['ci'];
  22.  
  23.  
  24. $datos = new Datos();
  25. $datos->insertar($nb, $ap, $ci);
  26. //$datos->mostrar();
  27. $cont= count($datos);
  28. echo ("<table border='1'>");
  29. echo ("<tr>");
  30.                    echo ("<td>Nombre</td><td>Apellido</td><td>No. Carnet</td>");
  31. echo ("</tr>");
  32. for ($i=1; $i<=$cont; $i++)
  33. {
  34. $nombre=$datos->nombre;
  35. $apellido=$datos->apellido;
  36. $carnet=$datos->CI;
  37. echo ("<tr><td>".$nombre."</td><td>".$apellido."</td><td>".$carnet."</td></tr>");
  38. }
  39.                    echo ("</table>");
  40.  
  41.  
  42. ?>
  43. <body>
  44. </body>
  45. </html>
  46.  
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.


« Última modificación: 19 Enero 2017, 19:42 pm por danny920825 » En línea

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

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: [Ayuda] ¿Qué hice mal?
« Respuesta #1 en: 19 Enero 2017, 19:44 pm »

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



« Última modificación: 19 Enero 2017, 19:47 pm por drfunes » En línea

danny920825

Desconectado Desconectado

Mensajes: 175


Ver Perfil WWW
Re: [Ayuda] ¿Qué hice mal?
« Respuesta #2 en: 19 Enero 2017, 21:32 pm »

A ver, yo probé
Código
  1. $nombre=$datos[$i]->nombre;
y
Código
  1. $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
  1. <?php
  2.  
  3. class Datos
  4. {
  5.  
  6. var $nombre;
  7. var $apellido;
  8. var $CI;
  9.  
  10. function insertar($nb, $ap, $ci)
  11. {
  12. $this->nombre=$nb;
  13. $this->apellido=$ap;
  14. $this->CI=$ci;
  15. }
  16. function mostrar()
  17. {
  18. $this->nombre;
  19. $this->apellido;
  20. $this->CI;
  21.  
  22. }
  23.  
  24. }
  25.  
  26.  
  27. ?>
  28.  
En línea

"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno
#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.700



Ver Perfil WWW
Re: [Ayuda] ¿Qué hice mal?
« Respuesta #3 en: 20 Enero 2017, 08:10 am »

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
  1. <?php session_start(); ?>
  2. <html>
  3. <head>
  4.    <meta charset="utf-8">
  5.    <title>Documento sin título</title>
  6. </head>
  7. <body>
  8.    <form action="datos.php" method="post">
  9.        <label for="nombre">Ingrese el Nombre</label>
  10.        <input type="text" name="nombre">
  11.  
  12.        <label for="apellido">Ingrese el Apellido</label>
  13.        <input type="text" name="apellido">
  14.  
  15.        <label for="ci">Ingrese el # Carnet</label>
  16.        <input type="text" name="ci">
  17.  
  18.        <div>
  19.            <button type="submit">Enviar datos</button>
  20.        </div>
  21.    </form>
  22.  
  23.    <table border="1">
  24.        <tr>
  25.            <td>Nombre</td>
  26.            <td>Apellido</td>
  27.            <td>No. Carnet</td>
  28.        </tr>
  29.  
  30.        <?php
  31.  
  32.            include 'Persona.php';
  33.  
  34.            // Si hay datos de una sesión previa..
  35.            if(isset($_SESSION['datosPersona'])) {
  36.  
  37.                // Obtenerlos y convertirlos en datos usables.
  38.                $datos = unserialize($_SESSION['datosPersona']);
  39.  
  40.            } else {
  41.  
  42.                // Si no, declarar un array vacio.
  43.                $datos = array();
  44.  
  45.            }
  46.  
  47.  
  48.            // Si el usuario esta intentando añadir una nueva persona...
  49.            if(!empty($_POST)){
  50.  
  51.                $nombre = $_POST['nombre'];
  52.                $apellido = $_POST['apellido'];
  53.                $ci = $_POST['ci'];
  54.  
  55.                // Añadir un elemento al array de datos con una nueva persona.
  56.                $datos[] = new Persona($nombre, $apellido, $ci);
  57.  
  58.                // Guardar la sesión con los nuevos datos.
  59.                $_SESSION['datosPersona'] = serialize($datos);
  60.  
  61.            }
  62.  
  63.            // Imprimir los datos.
  64.            foreach($datos as $persona){
  65.  
  66.                echo '<tr>',
  67.                    '<td>', $persona->nombre, '</td>',
  68.                    '<td>', $persona->apellido, '</td>',
  69.                    '<td>', $persona->ci, '</td>',
  70.                    '</tr>';
  71.  
  72.            }
  73.  
  74.        ?>
  75.  
  76.    </table>
  77. </body>
  78. </html>


Y Persona.php contendrá la clase que es lo que más nos interesa.

Código
  1. class Persona {
  2.  
  3.    public $nombre, $apellido, $ci;
  4.  
  5.    public function __construct($nombre, $apellido, $ci){
  6.  
  7.        $this->nombre = $nombre;
  8.        $this->apellido = $apellido;
  9.        $this->ci = $ci;
  10.  
  11.    }
  12.  
  13. }

__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
En línea

danny920825

Desconectado Desconectado

Mensajes: 175


Ver Perfil WWW
Re: [Ayuda] ¿Qué hice mal?
« Respuesta #4 en: 22 Enero 2017, 23:01 pm »

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.
En línea

"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
hice un banner...
Diseño Gráfico
Diabolik Demon 8 2,186 Último mensaje 21 Julio 2005, 18:12 pm
por Diabolik Demon
Dos madres mas que hice
Diseño Gráfico
Toxico 5 1,913 Último mensaje 22 Julio 2005, 18:43 pm
por ....Gusto....
sist lince indumentaria ayuda ayuda!!!!!!!!!! problemon que hice en le trabajo
Software
paola03 1 3,673 Último mensaje 11 Marzo 2011, 01:09 am
por charola42
[Ayuda] Hice un programa con estructuras en C
Programación C/C++
Proxmond 0 671 Último mensaje 1 Junio 2014, 23:04 pm
por Proxmond
Qué hice mal ??
Electrónica
xpuns 6 7,690 Último mensaje 11 Abril 2018, 08:09 am
por animanegra
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines