Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO Cómo recuperar y enviar el objeto que trae la respuesta de MySQLi

Estas en el tema de Cómo recuperar y enviar el objeto que trae la respuesta de MySQLi en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, que tal. Mucho tiempo sin hacer PHP han pasado la cuenta y estoy pegado en un problema hace un par de días. Tengo un ...
  #1 (permalink)  
Antiguo 22/10/2015, 20:44
Avatar de SCY-FOX  
Fecha de Ingreso: septiembre-2007
Ubicación: Chile
Mensajes: 139
Antigüedad: 17 años, 3 meses
Puntos: 5
Pregunta Cómo recuperar y enviar el objeto que trae la respuesta de MySQLi

Hola, que tal.
Mucho tiempo sin hacer PHP han pasado la cuenta y estoy pegado en un problema hace un par de días.

Tengo un seudo CMS que construí hace mucho tiempo en php 5.0.
Ahora estoy en proceso de transformarlo y adecuarlo a las nuevas llamadas de MySQLi además de pasar de un formato estructurado normal a php OO.

Por un asunto de TOC (transtorno obsesivo compulsivo), quiero dejar la conexión a la BD en una clase en un archivo (conexion.php), tener un archivo con las clases y métodos de trabajo de este cms (funciones.php) y por otro lado un archivo index.php que sólo tenga en su mayoría, html sin tanto código php sólo el justo y necesario.

Hasta ahora, la conexión a la BD, funciona.
Y he podido enviar entre objetos el link de mysqli para poder ejecutar consultas.

Lo que NO puedo hacer es recuperar los datos en forma de array y poder retornarlos al lugar desde donde fue instanciado el objeto y generada la llamada al método.

Les pego mi código.

Conexion.php
Código:
<?php
    class DB {

        //Atributos
        private $errores;

        public $mysqli;
        

        //Metodos

        function __construct($errores = array()) {
            $this -> errors = $errores;
            $this -> conectar();
        }

        function conectar() {
            $servidor = "localhost";
            $usuario = "mcfly";
            $password = "123456";
            $database = "greatscott";

            if ($this -> mysqli == null)
            {
                $this -> mysqli = new mysqli($servidor, $usuario, $password, $database);
                
                if ($this->mysqli->connect_errno > 0)
                {
                    die('No puedo conectarme por [' . $this->mysqli->connect_error . ']');
                }
            }
            return $this -> mysqli;
        }
    }
?>
funciones.php

Código:
class FuncionesSitio {

	//Atributos
   	private $DB;

  	 public function __construct(DB $DB) {
     $this->DB = $DB;     
   }

   	//Metodos


       //Validacion Usuarios

	public function validarUsuario($username,$password){

		$respuesta = array();

		$query = "SELECT nombre, apellido, tipousuario  FROM m_usuarios WHERE username = ? AND password = ?";	


		$stmt = $this->DB->mysqli->stmt_init();
		
		if ($stmt = $this->DB->mysqli->prepare($query)) {			

			$stmt->bind_param("ss",$username, $password);
			$stmt->execute();
			$stmt->store_result();
			$stmt->bind_result($nombre, $apellido, $tipousuario);
			$meta = $stmt->num_rows();

			echo "Filas valor: " . $meta . "<br>";
						
		        while($stmt->fetch()) {
		            	$respuesta[] = $nombre . "|" . $apellido;
		        } 
				//Vaciar Recursos
				//$stmt->free_result();
		} else {
				    echo "Problemas realizando la consulta: [" . $this->DB->mysqli->error . "]";
				    die();
		}
		return $respuesta;
		
	}
}
?>
El problema de arriba es esa es la única forma en que he podido recuperar los valores de la BD usando Preparated Statements, haciendo un array separado por "palitos" | que después tendré que volver a limpiar.

mi archivo index.php

Código:
//Conecta a BD testing
include("config/conexion.php");
include("libreria/funciones.php");

//Nuevo Objeto de DB
$DB = new DB();

//Asigno el link a la BD a mi clase de funciones de página
$FS = new FuncionesSitio($DB);

session_start();

if (isset($_POST["enviar"])) {

	$username = $_POST["holi"];
	$password = $_POST["crayoli"];

	if ($valor[] = $FS->validarUsuario($username, $password) ) {
		
		//Si hay usuario, dame sesiones mamita
		$_SESSION['user_sitio'] = "ON";

		echo "Valores de Sesiones <br>";

		$_SESSION['nombre_user'] = $valor[1];
		$_SESSION['apellido_user'] = $valor[2];
		$_SESSION['privilegio_user'] = $valor[4];
		
		//Avísame que conectaste
		echo " <br>ARCHIVO INDEX - YEAH BABY<br>";
		echo $valor[1];
		foreach ($valor as $val) {
			echo $val;
		}

		//Envíame al admin con sesiones activas
		echo "<script>window.location=\"admin.php\";</script>";			

	} else {
//		die();
		echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=index.php?e=incorrecto\">"; 

	}

}
Llevo días tratando de solucionar esto. Soy un novato en PHP OO pero creo haber logrado hartos avances en este poco tiempo.

Si pueden ayudarme o darme algunos tips sobre poder recibir correctamente la info desde bd al hacer la pregunta con mysqli y "statements" preparados podría seguir y realizar las demás acciones básicas como editar, agregar o borrar...

HELP!!
  #2 (permalink)  
Antiguo 23/10/2015, 17:13
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 15 años, 3 meses
Puntos: 214
Respuesta: Cómo recuperar y enviar el objeto que trae la respuesta de MySQLi


Saludo
¡Ya po!

Pues revisando el tema del modo en que realizaste la consulta
con el bind_result definitivamente es un lío a la hora de
manejar la respuesta.

Pues se me ocurren estas opciones:

1. Realizar un explode.

Código PHP:
if ($valor[] = $FS->validarUsuario($username$password) ) 
$valor explode('|',$valor[0][0]); 

Y de ahí en adelante, ya se maneja con las variables que ya están ($valor[0], etc...)

Esto, pensandolo a futuro para consultas que traigan varios registros
se podría manejar en un solo ciclo
Ej
Código PHP:
if ($valor[] = $FS->validarUsuario($username$password) ) 
//vamos a suponer que vienen 2 valores
for($i 0$i sizeof($valor[0]); $i++)
{
$valor explode('|',$valor[0][$i]);
  foreach (
$valor as $val) {
     echo 
$val;
  }     



2. Cambiar el retorno para que devuelva un array, y aunque el explode
se evitaría, vendría la terapía de recorrer no uno, ni dos, sino 3 arreglos.

3. Cambiar el modo de obtener los datos, usar el query de mysqli,
y con eso sì se obtiene un fetch_array (1 registro) o un fetch_all (varios)
en cuyo caso se recorrería uno o máximo dos arreglos.

4. Hacer uso de adodb (para tu proyecto creo que vendrìa de perlas),
pues es liviano, fàcil de usar, y tiene el tema de bind params implementado
Ej
Código PHP:
$query "SELECT nombre, apellido, tipousuario  FROM m_usuarios WHERE username = ? AND password = ?";
$rs $DB->GetAll($query,array($username$password)); 

Pero al igual que el punto anterior, viene a dar uno o dos arreglos.

5. Hacer uso de un framework (Hay varias ofertas) que tienen tambièn ya
lo de bind params, y obtienen mejor los datos.
Código PHP:
$post['Post']['id']
// o 
$post->id 
En ambos casos usandolos directo cuando son solo 1 registro,
y en un foreach cuando son varios.

Así que ahora, como dijo el arquitecto, y su interlocutor antes que él:
'El tema es de elección'
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #3 (permalink)  
Antiguo 24/10/2015, 16:53
Avatar de SCY-FOX  
Fecha de Ingreso: septiembre-2007
Ubicación: Chile
Mensajes: 139
Antigüedad: 17 años, 3 meses
Puntos: 5
Respuesta: Cómo recuperar y enviar el objeto que trae la respuesta de MySQLi

Cita:
Iniciado por mortiprogramador Ver Mensaje

Saludo
¡Ya po!

Pues revisando el tema del modo en que realizaste la consulta
con el bind_result definitivamente es un lío a la hora de
manejar la respuesta.

Pues se me ocurren estas opciones:

1. Realizar un explode.

Código PHP:
if ($valor[] = $FS->validarUsuario($username$password) ) 
$valor explode('|',$valor[0][0]); 

Y de ahí en adelante, ya se maneja con las variables que ya están ($valor[0], etc...)

Esto, pensandolo a futuro para consultas que traigan varios registros
se podría manejar en un solo ciclo
Ej
Código PHP:
if ($valor[] = $FS->validarUsuario($username$password) ) 
//vamos a suponer que vienen 2 valores
for($i 0$i sizeof($valor[0]); $i++)
{
$valor explode('|',$valor[0][$i]);
  foreach (
$valor as $val) {
     echo 
$val;
  }     



2. Cambiar el retorno para que devuelva un array, y aunque el explode
se evitaría, vendría la terapía de recorrer no uno, ni dos, sino 3 arreglos.

3. Cambiar el modo de obtener los datos, usar el query de mysqli,
y con eso sì se obtiene un fetch_array (1 registro) o un fetch_all (varios)
en cuyo caso se recorrería uno o máximo dos arreglos.

4. Hacer uso de adodb (para tu proyecto creo que vendrìa de perlas),
pues es liviano, fàcil de usar, y tiene el tema de bind params implementado
Ej
Código PHP:
$query "SELECT nombre, apellido, tipousuario  FROM m_usuarios WHERE username = ? AND password = ?";
$rs $DB->GetAll($query,array($username$password)); 

Pero al igual que el punto anterior, viene a dar uno o dos arreglos.

5. Hacer uso de un framework (Hay varias ofertas) que tienen tambièn ya
lo de bind params, y obtienen mejor los datos.
Código PHP:
$post['Post']['id']
// o 
$post->id 
En ambos casos usandolos directo cuando son solo 1 registro,
y en un foreach cuando son varios.

Así que ahora, como dijo el arquitecto, y su interlocutor antes que él:
'El tema es de elección'
Muuchas gracias por todos los tips.

Por otro lado, encontré este tutorial , http://code.tutsplus.com/tutorials/t...nts--net-13661 que habla sobre el problema de recuperar columnas en donde no sabemos la cantidad de columnas que se recibirán, además del manejo de los datos recibidos por la consulta en si.

Utiliza una función que no conocía para nada y que voy a probar con mi intento de CMS para ver si funciona. Si queda y anda bien, publicaré acá el código para que otra persona pueda usarlo o solucionar el problema.

Sobre usar un framework aparte, al menos para este proyecto, creo que sería muy overkill considerando que solo debo hacer un administrador de fotos y eventos. (y que tengo poco tiempo para hacerlo) por lo que a futuro si me preocuparé de buscar alguno que me sirva :)

Gracias nuevamente!!
  #4 (permalink)  
Antiguo 24/10/2015, 17:08
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 15 años, 3 meses
Puntos: 214
Respuesta: Cómo recuperar y enviar el objeto que trae la respuesta de MySQLi

Saludo
Viendo el link que dejaste, lo que hace es llamar a la función interna
de la librería de la base de datos y le envía todos los parámetros
en un array, que previamente crea en un primer while.

Y luego realiza otro while por cada fila del resultado del query,
y dentro de este hace otro ciclo con un foreach que recorre
cada valor de la fila, para asignarlo a un arreglo,
y así tantas veces como registros haya.

Finalmente retorna, y de nuevo otro foreach para ya dibujar la info.

Total: 4 ciclos, 3 arreglos (Habrá que ver como se porta con mucha info)

Pero para lo que lo requieres, tal vez te vaya sin problema.
Suerte con eso.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Última edición por mortiprogramador; 24/10/2015 a las 17:29

Etiquetas: mysqli, objeto, php, respuesta
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 08:13.