Autor Tema: Procedimientos almacenados Mysql PHP llamado  (Leído 10895 veces)

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

Desconectado Kibalam

  • Trade Count: (3)
  • The Communiter-
  • *
  • Thank You
  • -Given: 11
  • -Receive: 30
  • Mensajes: 1602
Procedimientos almacenados Mysql PHP llamado
« : marzo 24, 2014, 01:21:13 pm »
Hola Amigos Communiters antes que nada perdón si mi pregunta es noob  x_x

Vengo por acá pedir un poco de instructoria, sucede que siempre he usado sentencias directas en php y ahora quiero optimizar mi codigo, usando las caracteristicas propias del motor (vistas, trigger,SP) pero me he trabado en los SP.

les explico, siempre lo he hecho así.

Código: (php) [Seleccionar]
$conex = @mysql_connect("localhost","usuario","pass") or die(mysql_error());
$db = @mysql_select_db($latabla,$conex) or die(mysql_error());
$sql1 = "SELECT * FROM tabla WHERE id = '$id'";
$result1 = mysql_query($sql1,$conex);
while ($row=mysql_fetch_array($result1,MYSQL_ASSOC))
{$dato = $row["colum"];}

como podrán ver sencillito pero funcional para mi :) 

ahora creandome unos procedimientos almacenados ya terminados por el lado del motor mysql los intento llamar así

Código: [Seleccionar]
$conex = @mysql_connect("localhost","usuario","pass") or die(mysql_error());
$db = @mysql_select_db($latabla,$conex) or die(mysql_error());
$sql1 = "call miprocediminento('valro',valor)";
$result1 = mysql_query($sql1,$conex);
while ($row=mysql_fetch_array($result1,MYSQL_ASSOC))
{$dato = $row["colum"];$segundodatoausar = $row["colum2"];}

como verán solo cambien en lugar de la sentencia select llame al SP, pero nada  :sad: no me muestra datos con el mysql_fetch_array

¿Sera que los SP se llaman diferente? alguien que me ilumine por favor XD

de antemano gracias.
saludos
Kibalam.
« Última Modificación: marzo 24, 2014, 01:54:10 pm por Kibalam »
"Esperar que la vida te trate bien porque seas buena persona es como esperar que un toro no te ataque porque seas vegetariano"

Desconectado rdoggsv

  • Administrator
  • Trade Count: (3)
  • The Communiter-
  • *
  • Thank You
  • -Given: 299
  • -Receive: 486
  • Mensajes: 6479
  • "Once you go arch , u never go back"
    • SV CommunitY
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #1 : marzo 24, 2014, 01:56:28 pm »
No veo adonde pusiste el procedimiento que has creado, veo que pusiste valro en lugar de valor ? , y tenes call en lugar de CALL, revisa si no es por esos typos que no te esta funcionando.

Desconectado Kibalam

  • Trade Count: (3)
  • The Communiter-
  • *
  • Thank You
  • -Given: 11
  • -Receive: 30
  • Mensajes: 1602
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #2 : marzo 24, 2014, 02:01:36 pm »
No veo adonde pusiste el procedimiento que has creado, veo que pusiste valro en lugar de valor ? , y tenes call en lugar de CALL, revisa si no es por esos typos que no te esta funcionando.

el procedimiento esta bien del lado del motor, ya lo he probado en un query y todo bien, lo del CALL y call tenia entendido que Mysql no era CS :S  ... ya voy a probar.

lo de valro lo puse solo para la referencia del valor que le paso, en realidad no es que lo tenga así, solo le paso un valor.
"Esperar que la vida te trate bien porque seas buena persona es como esperar que un toro no te ataque porque seas vegetariano"

Desconectado chepito123

  • Trade Count: (0)
  • Sv Full Member
  • *
  • Thank You
  • -Given: 9
  • -Receive: 43
  • Mensajes: 795
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #3 : marzo 24, 2014, 02:43:21 pm »
Te recomiendo que hagas uso de la función mysqli ya que la función mysql está quedando obsoleta te dejo algunos link para que leas un poco

Sobre el uso de mysqli
http://www.php.net/manual/es/book.mysqli.php

Función Mysql obsoleta

http://us3.php.net/manual/es/migration53.deprecated.php
http://www.forosdelweb.com/f18/anuncio-extension-mysql-considera-obsoleta-1008145/

Para que lo tomes en cuenta   :thumbsup: :thumbsup:
Lo que cuenta en la vida no es el mero hecho de haber vivido. Son los cambios que hemos provocado en las vidas de los demás lo que determina el significado de la nuestra

Desconectado vlad

  • Global Moderator
  • Trade Count: (10)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 104
  • Mensajes: 6342
    • Qualium.net
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #4 : marzo 24, 2014, 06:35:39 pm »
http://www.php.net/manual/en/mysqli.quickstart.stored-procedures.php

Te recomiendo seguir ese ejemplo, sobre todo porque también es bueno en estos casos que sepas obtener el valor de error de MySQL para mayor facilidad al encontrar errores!

Ademas verifica que el usuario de la base de datos con el que te estas conectando en tu codigo PHP tenga los permisos: CREATE ROUTINE, ALTER ROUTINE, EXECUTE (según sea necesario, no porque con el EXECUTE seria suficiente).

Desconectado Radiux

  • Trade Count: (17)
  • Sv Full Member
  • *
  • Thank You
  • -Given: 137
  • -Receive: 44
  • Mensajes: 910
    • SV Modding
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #5 : marzo 24, 2014, 07:54:09 pm »
Vaya, lo mas sencillo y primordial es

1)Crea tu propia Clase para acceder a la BD, esta clase es de mi autoria y aunque es una version muy basica de la que suelo usar, es  funcional.

Código: [Seleccionar]
<?php

class conexion
    
{
    
//propiedades
    
public $conexion;
    private 
$server='aqui va la ip de tu server';
    private 
$usuario='aqui va tu usuario de la bd';
    private 
$clave='aqui la clave de tu bd';
    private 
$bd='y por ultimo el nombre de tu bd';    
        
    
//METODOS
    
    //Conectarse a la DB
    
public function ConectarDB()
        {
        
$this->conexion=@new mysqli($this->server,$this->usuario,$this->clave,$this->bd);
        if (
$this->conexion->connect_error)
            die(
'Error de Conexion :(');
 
        }    
    
    
//Desconectarse a la DB
    
public function DesconectarDB()
        {
        
$this->conexion->close();
        }

      
    
//Ejecuta un query y retorna el resultado en un Array
    //Solo utilizar cuando el resultado del Query provenga de un Select
    //Ya sea un Select Directo o dentro de un SP
public function ObtenerResultado($QueryString)
{
$this->ConectarDB();
$Resultado=$this->conexion->query($QueryString); //Ejecucion del Query
$Datos=array(); //Declaracion Array donde almacenaremos nuestros datos
$i=0;
while($fila=$Resultado->fetch_array())
{
$Datos[$i]=$fila;
$i++;
}
$this->DesconectarDB();
return $Datos;
}
    
//Para obtener el resultado de ejecutar un query que no devuelve datos, como Insert,Delete,Update.
//Resultado retorna TRUE si el query se ejecuto correctamente.
public function ObtenerResultadoSimple($QueryString)
{
$this->ConectarDB();
$Resultado=$this->conexion->query($QueryString);
$this->DesconectarDB();
Return $Resultado;
}
    }
?>


2)Obvio incluir tu clase donde la necesites y llamar los Sps asi:
Código: [Seleccionar]
<?php 

require_once '../conexionMysql/Conexion.php';

function 
validarUsuario($usuario,$clave)

{

$cn=new Conexion;
$Datos=$cn->ObtenerResultado('Call validarUsuario("'.$usuario.'","'.$clave.'")');
return $Datos;
}

?>


Como explico en el codigo, la clase de conexion devuelve un Array simple y silvestre, mas que suficiente para leer los datos, crear tablas, etc...


3)Si realmente deseas optimizar el codigo, trata de programar utilizando conceptos de POO y no de programacion estructurada, esa repeticion de codigo cada vez que te necesites conectar seria un dolor horrible de cabeza si tuvieras que hacer un cambio, porque lo tendrias que hacer en todas y cada una de las paginas en las que te conectas.

4)Si vas a trabajar con Php seriamente, tambien te recomiendo que crees una clase con metodos para llenar y crear automaticamente selects, tablas y cualquier elemento html que actualmente tengas que crear y llenar con datos manualmente. Una buena DAL combinado con una clase de utilidades llena de funciones precocinadas para obtener y presentar datos te ahorran un 30% de la programada, y te evitas tener que aprenderte Frameworks con un sinfin de funciones que probablemente nunca uses.
« Última Modificación: marzo 24, 2014, 08:08:13 pm por Radiux »
Discutir en foros de Internet es como competir en las olimpiadas especiales: Aunque ganes, sigues siendo un retrasado.

Desconectado vlad

  • Global Moderator
  • Trade Count: (10)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 104
  • Mensajes: 6342
    • Qualium.net
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #6 : marzo 24, 2014, 11:35:26 pm »
1)Crea tu propia Clase para acceder a la BD, esta clase es de mi autoria y aunque es una version muy basica de la que suelo usar, es  funcional.

Solo un cometario con respecto a tu código presentado y es que veo que la conexion se crea y se destruye para cada consulta, esto puede resultar en un gran "overhead" innecesario si son muchas consultas a ejecutarse de forma consecutiva (seria un ciclo de: consultar pool de conexiones -> "SET" iniciales -> consuta -> Destruir conexion) , sería mejor que en el constructor de la clase conexion ubicaras el procedimiento de conectar a la BD y en el destructor el de desconectar (aunque realmente no es necesario porque al terminar el script libera automaticamente el recurso).

De esa forma podrias reutilizar la costosa (en tiempo) conexión a la BD en ->ObtenerResultado() y en ->ObtenerResultadoSimple() al eliminar en dichas funciones la instruccion de conectar y destruir.

Desconectado Kibalam

  • Trade Count: (3)
  • The Communiter-
  • *
  • Thank You
  • -Given: 11
  • -Receive: 30
  • Mensajes: 1602
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #7 : marzo 26, 2014, 08:27:27 am »
chepito123  esto estuve leyendo en estos días y desde que me comenzó a dar problema, note ese warning creo que tendré comenzar a migrar todo.

 
http://www.php.net/manual/en/mysqli.quickstart.stored-procedures.php

Te recomiendo seguir ese ejemplo, sobre todo porque también es bueno en estos casos que sepas obtener el valor de error de MySQL para mayor facilidad al encontrar errores!

Ademas verifica que el usuario de la base de datos con el que te estas conectando en tu codigo PHP tenga los permisos: CREATE ROUTINE, ALTER ROUTINE, EXECUTE (según sea necesario, no porque con el EXECUTE seria suficiente).


vlad creo que tomare tu consejo y usaré el ejemplo que ahí ponen es basicamente lo que necesito



Radiux Gracias por el codigo man, lo veré detenidamente y con respecto a lo de la programación estructurada, trabajo con include la conexión, pero si la orientare a POO
"Esperar que la vida te trate bien porque seas buena persona es como esperar que un toro no te ataque porque seas vegetariano"

Desconectado Kibalam

  • Trade Count: (3)
  • The Communiter-
  • *
  • Thank You
  • -Given: 11
  • -Receive: 30
  • Mensajes: 1602
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #8 : marzo 27, 2014, 03:51:53 pm »
Se que mal del alguno me va a regañar  :shock: pero me he quedado trabajo en algo que seguramente tiene una solución fácil  :embarassed:

vaya, lo tengo así.
Código: [Seleccionar]
<?php
$mysqli 
= new mysqli("example.com""user""password""database");
$totalmi 0$totalmo 0;
$result $mysqli->query("CALL calcucrts($preciof,'flat');");
while(
$strow mysqli_fetch_array($resultMYSQLI_ASSOC))

$bodyenvio .='<strong>'$subtomi 0$subtomo 0;
$bodyenvio .= ' '.$strow["num"].' certificado '.$strow["millas"].' millas<br>';
$subtomi $strow["num"]*$strow["millas"]; $subtomo $strow["num"]*$strow["crt"];
$totalmi += $subtomi$totalmo += $subtomo;
$bodyenvio .='</strong>';
}
?>


Suman y hace toda la vaina de lo mejor, funciona  :thumbsup:  pero sucede que lo tengo un un bucle (while) en donde se tiene que ejecutar varias veces y hacer esa evaluación repetidamente, pero solo lo hace la primera ocasión despues es como si no se ejecutase  x_x

y no tengo idea por que.


Saludos.

Kibalam
"Esperar que la vida te trate bien porque seas buena persona es como esperar que un toro no te ataque porque seas vegetariano"

Desconectado vlad

  • Global Moderator
  • Trade Count: (10)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 104
  • Mensajes: 6342
    • Qualium.net
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #9 : abril 01, 2014, 09:30:45 am »
Primero seria cambiar mysqli_fetch_array por mysqli_fetch_assoc (no es muy importante pero es lo que ocupas de todas formas).

Segundo despues de obtener el $result verifica con mysqli_num_rows cuantas filas estas obtiendo, para ver si el resultado de tu procedimiento almacenado no te esta devolviendo solo una fila.

Y si de casualidad estas recorriendo el resultado en otro loop ANTES del while que has puesto, hay que tomar en cuenta que tenes que hacer mysqli_data_seek a la fila 0 antes de volver a recorrerlo.

Desconectado Kibalam

  • Trade Count: (3)
  • The Communiter-
  • *
  • Thank You
  • -Given: 11
  • -Receive: 30
  • Mensajes: 1602
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #10 : abril 01, 2014, 05:59:43 pm »
Hola Vlad.

creo que no he sido claro con el código, le había puesto mysqli_fetch_array  por que el procedimiento almacenado me da mas de un resultado y lo pongo en el bucle pues lo evaluó.

pero ya vi que con, mysqli_fetch_assoc me va muy bien también.


una pregunta, ¿Tengo que hacer el mysqli_data_seek  aunque vuelva a hacer el llamado y ejecución del procedimiento ?

así.

Código: [Seleccionar]

<?php
$mysqli 
= new mysqli("example.com""user""password""database");
$totalmi 0$totalmo 0;
$result $mysqli->query("CALL calcucrts($preciof,'flat');");
while(
$strow mysqli_fetch_array($resultMYSQLI_ASSOC))

$bodyenvio .='<strong>'$subtomi 0$subtomo 0;
$bodyenvio .= ' '.$strow["num"].' certificado '.$strow["millas"].' millas<br>';
$subtomi $strow["num"]*$strow["millas"]; $subtomo $strow["num"]*$strow["crt"];
$totalmi += $subtomi$totalmo += $subtomo;
$bodyenvio .='</strong>';
}

// Segundo llamado 
// Son llamados diferente con resultado diferentes, pero solo me ejecuta el primero. 
$totalmi 0$totalmo 0;
$result $mysqli->query("CALL calcucrts($preciof,'conv');");
while(
$strow mysqli_fetch_array($resultMYSQLI_ASSOC))

$bodyenvio .='<strong>'$subtomi 0$subtomo 0;
$bodyenvio .= ' '.$strow["num"].' certificado '.$strow["millas"].' millas<br>';
$subtomi $strow["num"]*$strow["millas"]; $subtomo $strow["num"]*$strow["crt"];
$totalmi += $subtomi$totalmo += $subtomo;
$bodyenvio .='</strong>';
}


?>

"Esperar que la vida te trate bien porque seas buena persona es como esperar que un toro no te ataque porque seas vegetariano"

Desconectado vlad

  • Global Moderator
  • Trade Count: (10)
  • The Communiter-
  • *
  • Thank You
  • -Given: 53
  • -Receive: 104
  • Mensajes: 6342
    • Qualium.net
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #11 : abril 02, 2014, 09:35:13 am »
una pregunta, ¿Tengo que hacer el mysqli_data_seek  aunque vuelva a hacer el llamado y ejecución del procedimiento ?

No, en ese caso no es necesario, solo es necesario si es el mismo resultado que queres volver a recorrer.

Lo que si es necesario en tu caso de multiples llamados a procedimientos almacenados consecutivos es mysqli_free_result.

Código: [Seleccionar]

<?php
// Segundo llamado 
// Son llamados diferente con resultado diferentes, pero solo me ejecuta el primero. 
$totalmi 0$totalmo 0;

// Liberamos la referencia al resultado anterior - es necesario cuando hay llamadas consecutivas a procedimientos remotos y en general es buena practica hacerlo inmediatamente que ya no ocupes un resultado.
$result->free_result();

$result $mysqli->query("CALL calcucrts($preciof,'conv');");
while(
$strow mysqli_fetch_array($resultMYSQLI_ASSOC))
....


Adicionalmente verifica directamente en MySQL que calcucrts te devuelva lo que esperas al llamarlo con el 2do parametro como "conv"
« Última Modificación: abril 02, 2014, 09:48:39 am por vlad »

Desconectado Kibalam

  • Trade Count: (3)
  • The Communiter-
  • *
  • Thank You
  • -Given: 11
  • -Receive: 30
  • Mensajes: 1602
Re:Procedimientos almacenados Mysql PHP llamado
« Respuesta #12 : abril 02, 2014, 11:12:03 am »
Citar
Adicionalmente verifica directamente en MySQL que calcucrts te devuelva lo que esperas al llamarlo con el 2do parametro como "conv"

pues el resultado del SP está bien ya lo he probado directamente desde linea de comandos, se comporta dependiendo que parametros le mando.

con respecto a mysqli_free_result, lo estoy usando así.

Código: [Seleccionar]
<?php
$mysqli 
= new mysqli("example.com""user""password""database");
$totalmi 0$totalmo 0;
$result $mysqli->query("CALL calcucrts($preciof,'flat');");
while(
$strow mysqli_fetch_array($resultMYSQLI_ASSOC))

$bodyenvio .='<strong>'$subtomi 0$subtomo 0;
$bodyenvio .= ' '.$strow["num"].' certificado '.$strow["millas"].' millas<br>';
$subtomi $strow["num"]*$strow["millas"]; $subtomo $strow["num"]*$strow["crt"];
$totalmi += $subtomi$totalmo += $subtomo;
$bodyenvio .='</strong>';
}
mysqli_free_result($result);
// Segundo llamado 
// Son llamados diferente con resultado diferentes, pero solo me ejecuta el primero. 
$totalmi 0$totalmo 0;
$result $mysqli->query("CALL calcucrts($preciof,'conv');");
while(
$strow mysqli_fetch_array($resultMYSQLI_ASSOC))

$bodyenvio .='<strong>'$subtomi 0$subtomo 0;
$bodyenvio .= ' '.$strow["num"].' certificado '.$strow["millas"].' millas<br>';
$subtomi $strow["num"]*$strow["millas"]; $subtomo $strow["num"]*$strow["crt"];
$totalmi += $subtomi$totalmo += $subtomo;
$bodyenvio .='</strong>';
}
?>

lo que no entiendo y me pasa es lo siguiente.
  • En el primer recorrido del resultado todo va bien, me muestra lo que deseo y obtengo los valor, ¿porque en el segundo no?
  • ¿No debería de tomar nuevos resultados cuando vuelvo a llamar al SP?


por cierto, sigue sin funcionar  x_x
"Esperar que la vida te trate bien porque seas buena persona es como esperar que un toro no te ataque porque seas vegetariano"