Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Tomar valores de una base de datos y colocarlos en un formulario

Estas en el tema de Tomar valores de una base de datos y colocarlos en un formulario en el foro de PHP en Foros del Web. Como están? A ver si pueden darme una ayuda para algo creo que sencillo. Necesito tomar los valores de una tabla y colocarlos en un ...
  #1 (permalink)  
Antiguo 02/03/2014, 21:45
 
Fecha de Ingreso: octubre-2008
Mensajes: 85
Antigüedad: 16 años, 1 mes
Puntos: 0
Tomar valores de una base de datos y colocarlos en un formulario

Como están?

A ver si pueden darme una ayuda para algo creo que sencillo.

Necesito tomar los valores de una tabla y colocarlos en un formulario en un select

Este sería el formulario a llenar
Código HTML:
Ver original
  1. <select name="Locales" size="1" simple>
  2. <option value="valor 1">Texto de opción 1</option>
  3. <option value="valor 2" selected>Texto de opción 2</option>
  4. <option value="valor 3">Texto de opción 3</option>
  5. <option value="valor 4">Texto de opción 4</option>

En valor 1 debería colocar el idlocal que tomo de la BD y en Texto de opción 1 el valor que tomo de nombre de la BD y así sucesivamente con los 4 locales.

Estoy creando una clase con las operaciones a realizar en MySQL puedo tomar bien los valores, pero no se como pasarlos al archivo registro.php para poder utilizarlo.

Si imprimo desde el metodo creado en la clase me funciona bien me muestra los locales pero realmente me gustaría crear el bucle en el archivo que contiene el formulario... Creo que es mejor o no???

esta es la clase
Código PHP:
Ver original
  1. class OpMySQL
  2. {
  3.     public $tabla;
  4.    
  5.     //Tomamos los locales para colocarlos en el formulario
  6.     public function tomarLocalesParaForm()
  7.     {
  8.         //Preparamos la conexion a la BD
  9.         $con = new mysqli(DB_HOST, DB_USUARIO, DB_PASSWORD, DB_DATABASE);
  10.         //Creamos la consulta
  11.         $sql = 'SELECT id_local, nombre FROM locales';
  12.        
  13.         //Preparamos la sentencia
  14.         $pre = $con->prepare($sql);
  15.         //Ejecutamos la sentencia
  16.         $pre->execute();
  17.         //Definimos las variables para guardar los valores devueltos por la consulta
  18.         $pre->bind_result($idlocal, $nombrelocal);
  19.        
  20.        
  21.     }

Lo único que se me ha ocurrido es colocar un bucle while y utilizar $pre->fetch para que mientras va realizando el bucle vaya guardando los datos en un array asociativo, y luego hago un return de dicho array, y creo otro bucle while que vaya recorriendo el array en la página del formulario y lo vaya llenando.

Pero tal vez hay alguna solución más sencilla.

Desde ya muchas gracias!
  #2 (permalink)  
Antiguo 02/03/2014, 23:25
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Tomar valores de una base de datos y colocarlos en un formulario

Código PHP:
Ver original
  1. class OpMySQL
  2. {
  3.     public $tabla;
  4.    
  5.     private $_con;
  6.     private $_stmt;
  7.    
  8.     public function __construct()
  9.     {
  10.         //Preparamos la conexion a la BD
  11.         $this->_con = new mysqli(DB_HOST, DB_USUARIO, DB_PASSWORD, DB_DATABASE);
  12.     }
  13.    
  14.     //Tomamos los locales para colocarlos en el formulario
  15.     public function tomarLocalesParaForm()
  16.     {
  17.         //Creamos la consulta
  18.         $sql = 'SELECT id_local id, nombre descripcion FROM locales';        
  19.         //Preparamos la sentencia
  20.         $this->_stmt = $this->_con->prepare($sql);
  21.         //Ejecutamos la sentencia
  22.         $this->_stmt->execute();
  23.     }
  24.    
  25.     public function lastQueryToCombo($params = array())
  26.     {
  27.         $combo = '<select id="'.$params['id'].'" name="'.$params['name'].'" '.($params['multiple'] ? 'multiple' : '').' '.($params['disabled'] ? 'disabled' : '').'>'
  28.         $resultado = $this->_stmt->get_result();
  29.         while($fila = $resultado->fetch_assoc())
  30.         {
  31.             $combo .= '<option value="'.$fila['id'].'" '.($params['default']==$fila['id'] ? 'selected' : '').'>'.$fila['descripcion'].'</option>';
  32.         }  
  33.         $combo .= '</select>';
  34.         return $combo;
  35.     }
  36. }

y lo llamas asi:

Código PHP:
Ver original
  1. $ob = new OpMySQL();
  2. $ob->tomarLocalesParaForm();
  3. echo($ob->lastQueryToCombo());

si lo emprolijas un poco, este metodo te servira para cualquier otra cosa que quieras hacer, se puede hacer de 10 maneras diferentes mas, solo es una idea
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #3 (permalink)  
Antiguo 03/03/2014, 06:01
 
Fecha de Ingreso: octubre-2008
Mensajes: 85
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Tomar valores de una base de datos y colocarlos en un formulario

Si así es como lo había pensado en primer momento, lo que no quería era hacer les impresiones desde la función en el archivo opmysql.

Mi idea era dejar el archivo de operaciones mysql solo para operaciones con la BD y no con impresiones.

Pero me resulta funcional si se me ocurre alguna otra idea lo cambiaré luego...

Además de eso muchas gracias por una aclaración que me has hecho sin yo haber preguntado, se me estaba complicando un poco saber que objetos declarar en la clase opmysql, por lo que veo declaras prácticamente todas las variables uqe se van a utilizar más de 1 vez. yo no sabía si estaba bien declarar el objeto con y el stmt y aparte muy logico de crear el metodo de conexión para no tener que escribirlo en cada metodo que cree luego para otras consultas.

Muchas gracias!

Última edición por matiD; 03/03/2014 a las 06:22
  #4 (permalink)  
Antiguo 03/03/2014, 06:57
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 7 meses
Puntos: 40
Respuesta: Tomar valores de una base de datos y colocarlos en un formulario

Esta muy bien planteado no querer tener código HTML en tus librerías, las hace muchísimo más reusables.

La solución es muy parecida a la que te ha dado el usuario NSD, pero en vez de hacer el bucle en la clase, lo que haría seria que el método que recoge la información de la base de datos, la devuelva sin ningun tipo de HTML
Código PHP:
$resultado $this->_stmt->get_result();
return 
$resultado
Y después en la vista donde quieras implementar eso, ya sería hacer el bucle, pero en la vista, no en la clase
Código PHP:
$datos $conection->lastQueryToCombo();
while(
$fila $datos->>fetch_assoc())
        {
            
//se imprimen los option
        

El código es solo un ejemplo, ya tu lo implementas con los nombres de variables/metodos correctos etc, espero que se haya entendido.

Un saludo
  #5 (permalink)  
Antiguo 03/03/2014, 07:01
 
Fecha de Ingreso: octubre-2008
Mensajes: 85
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Tomar valores de una base de datos y colocarlos en un formulario

Cita:
Iniciado por Heli0s Ver Mensaje
Esta muy bien planteado no querer tener código HTML en tus librerías, las hace muchísimo más reusables.

La solución es muy parecida a la que te ha dado el usuario NSD, pero en vez de hacer el bucle en la clase, lo que haría seria que el método que recoge la información de la base de datos, la devuelva sin ningun tipo de HTML
Código PHP:
$resultado $this->_stmt->get_result();
return 
$resultado
Y después en la vista donde quieras implementar eso, ya sería hacer el bucle, pero en la vista, no en la clase
Código PHP:
$datos $conection->lastQueryToCombo();
while(
$fila $datos->>fetch_assoc())
        {
            
//se imprimen los option
        

El código es solo un ejemplo, ya tu lo implementas con los nombres de variables/metodos correctos etc, espero que se haya entendido.

Un saludo
Muchas gracias a ambos, ya puedo marcar el tema como solucionado.

Espero no molestar a los usuarios del foro con tantas consultas
  #6 (permalink)  
Antiguo 03/03/2014, 12:13
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Tomar valores de una base de datos y colocarlos en un formulario

Cita:
Esta muy bien planteado no querer tener código HTML en tus librerías, las hace muchísimo más reusables.
Tienes toda la razon, cuanto menos html tengas es mejor, pero hay un detalle importante:
Código PHP:
Ver original
  1. $datos = $conection->lastQueryToCombo();

Con eso estarias sacando una propiedad privada de la clase al exterior, rompiendo completamnete el concepto de encapsulamiento, ya no puedes asegurar que la clase se va a comportar ciempre igual.

Poner html dentro del metodo es una chapuza pero que mantiene al objeto encapsulado, una forma realmente correcta de hacerlo seria asi:

Código PHP:
Ver original
  1. <?php
  2. class utiles
  3. {
  4.     public static selectStmtToCombo(mysqli_stmt $stmt, $params=array())
  5.     {  
  6.         $combo = '<select id="'.$params['id'].'" name="'.$params['name'].'" '.($params['multiple'] ? 'multiple' : '').' '.($params['disabled'] ? 'disabled' : '').'>'
  7.         $resultado = $stmt->get_result();
  8.         while($fila = $resultado->fetch_assoc())
  9.         {
  10.             $combo .= '<option value="'.$fila['id'].'" '.($params['default']==$fila['id'] ? 'selected' : '').'>'.$fila['descripcion'].'</option>';
  11.         }  
  12.         $combo .= '</select>';
  13.         return $combo;
  14.     }
  15. }
  16.  
  17.  
  18. class OpMySQL
  19. {
  20.     public $tabla;
  21.    
  22.     private $_con;
  23.     private $_stmt;
  24.    
  25.     public function __construct()
  26.     {
  27.         //Preparamos la conexion a la BD
  28.         $this->_con = new mysqli(DB_HOST, DB_USUARIO, DB_PASSWORD, DB_DATABASE);
  29.     }
  30.    
  31.     //Tomamos los locales para colocarlos en el formulario
  32.     public function tomarLocalesParaForm()
  33.     {
  34.         //Creamos la consulta
  35.         $sql = 'SELECT id_local id, nombre descripcion FROM locales';        
  36.         //Preparamos la sentencia
  37.         $this->_stmt = $this->_con->prepare($sql);
  38.         //Ejecutamos la sentencia
  39.         $this->_stmt->execute();
  40.         return  $this->_stmt;
  41.     }    
  42. }

Código PHP:
Ver original
  1. $ob = new OpMySQL();
  2. echo(utiles::selectStmtToCombo($ob->tomarLocalesParaForm()));

De esta forma, el html esta en una clase estatica llamada utiles, altamente reusable y mantenible que sirve para todas las clases del sistema, cambiando los parametros que recibe se puede personalizar el select tanto como se quiera.
Si bien la propiedad privada _stmt sale de la clase, no queda suelta en el sistema, sino que va a una clase estatica, el dia que se modifique el comportamiento de la clase, solo hay dos lugares para revisar, no todos los scripts que muestren un combo, saludos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #7 (permalink)  
Antiguo 03/03/2014, 12:31
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 7 meses
Puntos: 40
Respuesta: Tomar valores de una base de datos y colocarlos en un formulario

Te equivocas NSD, lo que sale no es el objeto privado, sino los datos que devuelve su metodo get_result(), es una practica muy tipica poner getters / setters de elementos privados para limitar su uso al externo, es completamente factible usarlo asi, y lo veo muchisimo mas reusable que metiendo los option, ninguna libreria debe llevar ninguna etiqueta html, nunca, es el método correcto, de hecho así se hace en MVC.

Un saludo
  #8 (permalink)  
Antiguo 03/03/2014, 14:35
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 6 meses
Puntos: 320
Respuesta: Tomar valores de una base de datos y colocarlos en un formulario

Cita:
es el método correcto, de hecho así se hace en MVC.
No te olvides lo que es un patrón de diseño: "Es una solución genérica a un tipo de problema en un tipo de contexto definido".
Si el problema es la administración del código, en el contexto de que muchas personas trabajan en el simultáneamente en un gran proyecto, MVC es la mejor solución, fuera de ese contexto, hay otros patrones mejores.

Si se nos dijo que MVC es lo mejor o lo correcto, no hay que repetirlo en todos lados, hay que analizar primero.

En este caso por MVC tendrías:

La clase OpMySQL.
Un controlador que agarra ese conjunto de resultados y los pasa a un array.
Una vista que recibe un array con los resultados y los muestra.
El procedimiento que los arma.

Si tubieses que armar otra clase que tambien muestra un resultado en un combo en otro lado tendrias:
La clase OpMySQL2.
El mismo controlador anterior.
Otra vista.
Otro procedimiento que los arma.

en terminos generales: 3*N+4 Lugares para cambiar codigo.

Si usas una clase estatica tienes:
La clase OpMySQL.
La clase estatica.
El procedimiento que los arma.

Si tubieses que armar otra clase que tambien muestra un resultado en un combo en otro lado tendrias:
La clase OpMySQL2.
La misma clase estatica.
Otro procedimiento que los arma.

en terminos generales: 2*N+3 Lugares para cambiar codigo.

Si en MVC quisieras cambiar como se muestra el select a lo largo de todo el sitio, tendrias que cambiar todas las vistas.
Si usando la clase estatica quisieras cambiar como se muestra el select a lo largo de todo el sitio, tendrias que cambiar en un solo lugar.


Si en MVC quisieras cambiar como se muestra un select determinado, terndrias que cambiar una sola vista.
Si usando la clase estatica quisieras cambiar como se muestra un select determinado tienes que cambiar un solo procedimiento.

La solucion correcta es la que mejor se adapta al contexto. Si nada sabemos del contexto como en este caso, decir que la forma correcta es como se haria en el patron MVC es poco acertado.

PD: Si se estuviera usando un patron MVC, la clase OpMySQL NUNCA contendria en su interior funciones nativas mysqli, en su lugar, usaria un controlador de una clase gestora de bases de datos, que usaria un controlador de otra clase que usaría mysqli

Saludos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #9 (permalink)  
Antiguo 03/03/2014, 14:45
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 7 meses
Puntos: 40
Respuesta: Tomar valores de una base de datos y colocarlos en un formulario

No he dicho que MVC sea absolutamente lo mejor y lo único que se deba usar, la solución correcta es la que mejor se adapta al contexto, esas son tus palabras, el usuario pedía una clase sin HTML para que sea mas reutilizable, y esa fue la solución que le dí, y la más reusable, ya que podría usarlo para mostrar esos mismos datos donde fuese, en una lista de options, en una tabla o sin formato.

Un saludo

Etiquetas: formulario, mysql, registro, select, sql, tabla, tomar, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:30.