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

STMT en MYSQL

Estas en el tema de STMT en MYSQL en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, ya estoy por aquí otra vez. Estoy desarrollando una clase database para conectarme a mysql, y me gustaría que las consultas se lanzasen con ...
  #1 (permalink)  
Antiguo 05/02/2008, 11:46
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
STMT en MYSQL

Buenas, ya estoy por aquí otra vez.

Estoy desarrollando una clase database para conectarme a mysql, y me gustaría que las consultas se lanzasen con plantillas de la consulta por un lado y parámetros por otro, que he leido por ahí, que es interesante por temas de seguridad. Tengo la parte echa que realiza la consulta:

Código PHP:
 public function lanzar_query($query,$tipo,$parametros){
      
$this->stmt mysqli_prepare($this->link,$query);
      
$args array_merge(array($this->stmt), array($tipo), $parametros);
      
call_user_func_array('mysqli_stmt_bind_param',$args);
      
mysqli_stmt_execute($this->stmt);
      
mysqli_stmt_store_result($this->stmt); 
    } 

Donde un ejemplo de los datos con los que se invoca a esta función son estos:
Código PHP:
  $query "SELECT idUsuario, pass, DNI, nombre, apellidos, idOcupacion, profesor FROM M_USUARIOS WHERE USER = ? and PASS = ?";
  
$tipo ='ss';
  
$parametros = array();
  
$parametros[]="admin";
  
$parametros[]=md5('admin'); 
El problema lo tengo al intentar recuperar los datos, que tengo entendido que solo lo puedo hacer mediante las funciones mysqli_stmt_bind_result, para fijar las variables donde se van a almacenar los resultados, y mysqli_stmt_fetch, para obtener una fila, y lo quiero convertir en una matriz asociativa.

La función debería de ser algo así, (ya se que esta probablemente tiene cosas mal, porque llevo mil cambios, y me quedado con la ultima)

Código PHP:

public function query2array($params){
  
$row_array=array();
  
$resul_array=array();
  
$args=array_merge(array($this->stmt),$params);
   
call_user_func_array('mysqli_stmt_bind_result',$args); 
   while (
$row mysqli_stmt_fetch($this->stmt)) {
       foreach(
$params as $key => $value
           
$row_array[$key]=$value;
       
$resul_array[]=$row_array;
   }      
   return 
$resul_array;
 } 
Como he dicho antes, esta última función es solo para que os hagais una idea de lo que quiero, $params en teoría es un array del tipo

Código PHP:
  $parametros = Array();
  
$parametros ['idUsuario']="";
  
$parametros ["pass"]="";
  
$parametros ["DNI"]="";
  
$parametros ["nombre"]="";
  
$parametros ["apellidos"]="";
  
$parametros ["idOcupacion"]="";
  
$parametros ["profesor"]=""
La idea es hacer una función que valga para cualquier SELECT.

Espero haberme explicado bien.

Un saludo,
  #2 (permalink)  
Antiguo 05/02/2008, 12:15
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: STMT en MYSQL

Hola, creo que lo puedo hacer con mysqli_stmt_result_metadata, no obstante me gustaría saber vuestra opinión de usar este sistema, si merece la pena o no...

Un saludo,
  #3 (permalink)  
Antiguo 05/02/2008, 12:27
 
Fecha de Ingreso: octubre-2007
Mensajes: 6
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: STMT en MYSQL

el sistema esta bien, pero me da la sensación que será un poco lento ya que haces varios loops antes de tener el resultado
  #4 (permalink)  
Antiguo 05/02/2008, 13:15
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: STMT en MYSQL

Hola aloon,

La funcion encargada de convertir el resultado en un array no está implementada correctamente (la de los loops), no se muy bien del todo como hacerlo, porque al querer hacer algo estandarizado para todo tipo de consultas, es decir, para consultas que devuelvan distinto número de columnas de datos, ejemplo, que funcione para una "SELECT id, name..." igual que para un "SELECT id...". Para extraer la información usando STMT hay que llamar previamente a la funcion mysqli_stmt_bind_result e indicar las variables donde se van a almacenar los resultados, sacando fila a fila con mysqli_stmt_fetch. Espero explicarme bien. Os dejo la última función que estoy probando... sigo en las mismas :S

Código PHP:
public function query2array(){
  
  
$row_array = array();
  
$resul_array = array();
  
  while (
$field mysqli_fetch_field($this->resultado))
      
$row_array[$field->name]="";
  
  
$args array_merge(array($this->stmt),$row_array);
  
call_user_func_array('mysqli_stmt_bind_result',$args);
   
   while (
$row mysqli_stmt_fetch($this->stmt))
       
$resul_array[] = $row_array;
   return 
$resul_array;      

  #5 (permalink)  
Antiguo 05/02/2008, 14:47
 
Fecha de Ingreso: octubre-2007
Mensajes: 6
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: STMT en MYSQL

y porque no haces directamente un fechAll?
  #6 (permalink)  
Antiguo 05/02/2008, 14:59
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: STMT en MYSQL

Hola aloon, no se como va eso del fetchall, estoy intentando documentarme ahora mismo, si puedes ponerme un ejemplo te lo agradecería :), pero seguro que funciona con STMT?

Muchas gracias,

un saludo
  #7 (permalink)  
Antiguo 06/02/2008, 03:19
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: STMT en MYSQL

Hola, ya tengo una solución, de momento voy a tirar con esto si no se me ocurre ninguna forma de optimizarlo.

Código PHP:
public function query2array(){
      
$row_array = array();
      
$resul_array = array();
      
$args='$this->stmt,';
      while (
$field mysqli_fetch_field($this->resultado)){
          ${
$field->name}="";
          
$row_array[$field->name]="";
          
$args .= '${'."\"".$field->name."\"".'},';
      }
      
$args rtrim($args,',');
      eval(
"mysqli_stmt_bind_result($args);");
      while (
$row mysqli_stmt_fetch($this->stmt)){
           foreach(
$row_array as $key=>$value)
               
$row_array[$key] = ${$key};
           
$resul_array[] = $row_array;
      }
       return 
$resul_array;      
    } 
Me gustaría saber si alguien usa esto del STMT y si realmente merece la pena.

Un saludo
  #8 (permalink)  
Antiguo 06/02/2008, 08:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: STMT en MYSQL

No estoy muy familiarizado con la extensión MySQLi, pero porque no te mudas a la extensión PDO, que ya es ampliamente soportada en PHP 5.2?

Saludos.
  #9 (permalink)  
Antiguo 06/02/2008, 09:41
 
Fecha de Ingreso: diciembre-2007
Mensajes: 50
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: STMT en MYSQL

Hola GatorV,

Muchas gracias, lo cierto que no tengo ni idea de esta extensión, como de casi nada de PHP, voy dando palos de ciego, documentándome en diferentes webs y foros, estoy leyendo libros donde no se menciona la extensión que me comentas, asíque imagino que aunque es de la versión 5 ("La biblia del PHP 5"), se me ha quedado un poco "deprecated" xD. Voy a documentarme sobre PDO, y tan pronto tenga una solución/duda, la publico
Un saludo, y gracias otra vez
  #10 (permalink)  
Antiguo 06/02/2008, 09:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: STMT en MYSQL

PDO (PHP Data Objects)

Es una nueva extensión para PHP, con la que abstraes el motor de la base de datos, tiene "drivers" para diferentes bases de datos, entre ellas MySQL, y soporta cosas como preparar consultas con arreglos, etc.

Te recomiendo le des una leida, ya que es probable que en un futuro se utilize mucho mas PDO que los drivers nativos.

Saludos.
  #11 (permalink)  
Antiguo 06/02/2008, 09:52
 
Fecha de Ingreso: octubre-2007
Mensajes: 6
Antigüedad: 16 años, 7 meses
Puntos: 0
Re: STMT en MYSQL

Merodeador

perdona no existe fechAll en mysqli yo lo estoy utilizado en ZendFramework
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 04:39.