• Lunes 23 de Diciembre de 2024, 00:08

Autor Tema:  Dudas con MySQL, SP con multiples parametros y PHP  (Leído 25385 veces)

ClaCS_85

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Dudas con MySQL, SP con multiples parametros y PHP
« en: Viernes 5 de Diciembre de 2008, 16:02 »
0
Hola que tal …hace unos días me estoy iniciando en el mundo de PHP y MySQL (ya que ya tengo tiempo desarrollando en .NET) y tengo las siguientes dudas…

1.   Como llamo a un MySQL stored procedure (SP)  con varios parámetros desde PHP??

He creado el siguiente SP

Código: Text
  1. CREATE DEFINER = 'root'@'localhost' PROCEDURE `_Proveedores`(IN _TipoConsulta TINYINT, IN _IdProveedor INTEGER, IN _NombreCompania VARCHAR(40), IN _Direccion VARCHAR(60), IN _Telefono VARCHAR(24), IN _NombreContacto VARCHAR(30), IN _CargoContacto VARCHAR(30),IN _listaInicio INTEGER)
  2. BEGIN
  3.  
  4.  
  5. /*UPDATE*/
  6. IF _TipoConsulta=1 THEN
  7. UPDATE proveedores
  8.    SET NombreCompañía = _NombreCompania,
  9.        Dirección = _Direccion,
  10.        Teléfono=_Telefono,
  11.        NombreContacto = _NombreContacto,
  12.        CargoContacto = _CargoContacto
  13.  WHERE IdProveedor=_IdProveedor;
  14.  
  15. /*LISTAR PROVEEDORES*/
  16. ELSEIF _TipoConsulta=2 THEN
  17. SELECT IdProveedor,NombreCompañía,Dirección,Teléfono,NombreContacto,CargoContacto
  18. FROM proveedores LIMIT _listaInicio,5;
  19.  
  20. /*INSERT*/
  21. ELSEIF _TipoConsulta=3 THEN
  22. INSERT INTO proveedores
  23.            (NombreCompañía
  24.            ,Dirección
  25.            ,Teléfono
  26.            ,NombreContacto
  27.            ,CargoContacto)
  28.      VALUES
  29.            (_NombreCompania
  30.            ,_Direccion
  31.            ,_Telefono
  32.            ,_NombreContacto
  33.            ,_CargoContacto);
  34.  
  35. /*DELETE*/
  36. ELSEIF _TipoConsulta=4 THEN
  37. DELETE FROM proveedores
  38. WHERE IdProveedor=_IdProveedor;
  39. END IF;
  40.  
  41. END;
  42.  

El SP no me genera ningún error al compilarlo …a simple vista si se entiende lo que deseo hacer no??
Bueno la cuestion es q este SP de acuerdo a los parámetros q se le pasen hara determinada cosa


En mi codigo PHP he intendado llamarlo dentro de una funcion asi:

Código: Text
  1.  
  2. $consulta="CALL _Proveedores(2,null,null,null,null,null,null,$listaInicio)";
  3.         $resultado=mysql_query($consulta,$cnn);
  4.  
  5.         while ($registro=mysql_fetch_array($resultado))
  6.         {
  7.             $coleccion[]=$registro;
  8.         }  
  9.              
  10.         mysql_close($cnn);
  11.        
  12.         return $coleccion;//esto seria lo q devuelve mi funcion
  13.  

Y he obtenido el error:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in…

Supongo que, o bien el SP esta siendo mal llamado…(tal vez no es con mysql_query) o estoy pasando mal los parámetros por lo q el SP no retorna ningun registro…

2.   Esta bien como asigno los parámetros al SP desde PHP??

Al llamar al SP este deberia devolverme un primer grupo de 5 Proveedores desde $listaInicio (x ejem si $listaInicio fuera 0  me devolveria los primeros 5 Proveedores ) y estos ser guardados en $coleccion

3.   Necesariamente  tengo que especificar los otros parámetros como null??

Estos parámetros innecesarios (en esta funcion) deben ser pasados como null desde el codigo PHP?? O desde el mismo SP?? … (Como se haria esto ultimo??)

Por ejem en . NET yo hago lo siguiente (Disculpas por poner este codigo .NET pero es solo con motivos a un mayor entendimiento a mi consulta …si se desea tal vez dsps se puede borrar jejeje )

Código: Text
  1. CREATE proc [dbo].[_Proveedores]
  2. @Tipoconsulta tinyint=null,
  3. @IdProveedor int=null,
  4. @NombreCompañía nvarchar(40)=null,
  5. @Dirección nvarchar(60)=null,
  6. @Teléfono nvarchar(24)=null,
  7. @NombreContacto nvarchar(30)=null,
  8. @CargoContacto  nvarchar(30)=null
  9. as
  10.  
  11. --UPDATE
  12. if @Tipoconsulta=1
  13. Begin
  14. UPDATE Proveedores
  15.    SET [NombreCompañía] = @NombreCompañía,
  16.        [Dirección] = @Dirección,
  17.        [Teléfono]=@Teléfono,
  18.        [NombreContacto] = @NombreContacto,
  19.        [CargoContacto] = @CargoContacto
  20.  
  21.  
  22.  WHERE IdProveedor=@IdProveedor
  23. End
  24.  
  25. --LISTAR PROVEEDORES
  26. else if @Tipoconsulta=2
  27. begin
  28. SELECT IdProveedor,NombreCompañía,Dirección,Teléfono,NombreContacto,CargoContacto
  29. FROM Proveedores
  30. End
  31.  
  32. …etc
  33. …etc
  34.  
  35.  

En este caso los parámetros del SP se pasan como null desde el mismo SP, esto me hace q al llamar el SP desde (x ejem) ASP.NET ya no declare como null todos los demas parámetros que no necesito para determinada funcion , es decir para listar todos los Proveedores solo tendria q pasarle el @Tipoconsulta=2 y el olvidarme del resto de param

En MySQL los parametros de los SP no llevan @ no??

Por lo dicho anteriormente mi funcion lo llamaria al SP de la sigte manera (desde ASP.NET con C#):

Código: Text
  1.  
  2. SqlCommand consultasql = new SqlCommand("_Proveedores", cnn);
  3. consultasql.CommandType = System.Data.CommandType.StoredProcedure;
  4. consultasql.Parameters.Add("@Tipoconsulta", System.Data.SqlDbType.TinyInt).Value = 2;
  5.  
  6.  
  7.  

Con esto ya no se tendria q poner null a todos los demas parametros q no son utilizados 

Creo q con todo esto se entendio lo q desearia poder hacer pero con MySQL y PHP…es esto posible???...un poco de orientación (o regaño por pensar en hacer cosas q no se pueden hacer jejeje) no me vendria nada mal 

…gracias por todo de antemano

Salu2 
« última modificación: Lunes 8 de Diciembre de 2008, 16:39 por ClaCS_85 »

shadow_rev

  • Miembro MUY activo
  • ***
  • Mensajes: 397
  • Nacionalidad: co
  • Un SPARTAN no muere en combate
    • Ver Perfil
    • http://shadowrev.blogspot.com
Re: Dudas con MySQL, SP con multiples parametros y PHP
« Respuesta #1 en: Viernes 5 de Diciembre de 2008, 16:42 »
0
Hola, y bienvenido al mundo de PHP :P

1. Por el error, deduzco que mysql_query no está arrojando el resultado (duh). Prueba haciendo var_dump($resultado) o print($resultado) antes de ejecutar el while. Si te arroja algo parecido a Resource Id #%% (% es un dígito de 0 a 9), puede que sea un bug del conector de mysql (una vez me pasó, misteriosamente se perdía la conexión con la base de datos entre instrucciones, y nunca supe el motivo). También puedes capturar los errores que te puedan salir de la consulta con mysql_error(), así te das cuenta si lo que pusiste en $consulta está bien construido.

2. Ni idea, nunca he trabajado con un SP o con un PL en PHP, aunque pronto voy a hacerlo en el trabajo :wacko:

3. Creo que eso depende mas bien del SP; no conozco aún lo que es programar en .NET, por eso no te sabría decir con certeza si eso se puede hacer o no en PHP.

:suerte:
Volará quien le ponga alas a sus sueños (Candidate for goddess)
Si el mal existe en este mundo, reside en el corazón de la humanidad (Edward D. Morrison - Tales of Phantasia)
Lo único que puedes cambiar del pasado, es lo que sientes por él en el presente (Lockon Stratos - Mobile Suit Gundam 00)
Ingeniero de Sistemas

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Dudas con MySQL, SP con multiples parametros y PHP
« Respuesta #2 en: Viernes 5 de Diciembre de 2008, 20:35 »
0
Para poder ejecutar procedimientos almacenados necesitas utilizar la extesion mysqli

http://www.php.net/manual/es/book.mysqli.php

tambien agradeceriamos que usaras las etiqueta [CODE] para publicar codigo


Saludo
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

ClaCS_85

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Dudas con MySQL, SP con multiples parametros y PHP
« Respuesta #3 en: Miércoles 17 de Diciembre de 2008, 15:24 »
0
Holas gente!...Sorry por la demora de contestar …ya saben q los trabajos finales de ciclo de la universidad, algunos trabajos q me caen de vez en cuando  y la enamorada …(sobre todo ella…ojala nunk lea esto…jajaja) quitan bastante tiempo Ademas no tengo inter en  casa y tengo q estar juntando mi sencillo para ir al ciber…jejeje…bueno esa es otra historia…lo importante es q ya estoy aquí de nuevo 

Ya he podido llamar el SP desde PHP con la ayuda de mysqli.dll y sus respectivos metodos …después de varios intentos…jejeje…
Puedo llamar al SP desde PHP pero mandandole parámetros q no sean nulos…he ahí el problema xq lo q yo necesito es eso
Según la logica del SP q quiero aplicar se le mandarian, de acuerdo a lo q se desee hacer, ciertos parámetros, unos seran no nulos y otros si, por ejemplo para hacer un UPDATE tendria q mandarle al SP los sgtes parámetros

_TipoConsulta=1
_IdProveedor=24
_NombreCompania=xxx
_Direccion=dir_xxx
_Telefono=777
_NombreContacto=yyy
_CargoContacto=zzz

Llamando al SP desde PHP de la siguiente manera

Código: Text
  1. $resultado = mysqli_query($cnn,"CALL SP_Proveedores(1,24,’xxx’,’dir_xxx’,777,’yyy’,’zzz’,null)");
  2.  

Los parámetros q serian varchar en MySQL se pasan entre comillas simples desde PHP??...supongo q los enteros no…no??...null no se pasaria entre comillas simples??

Como se observa el valor de _listaInicio seria null ya q no me sirviria para esta ocasión

Pero si quiero listar los proveedores de 5 en 5 utilizaria el TipoConsulta=2 de esta manera

Código: Text
  1. $resultado = mysqli_query($cnn,"CALL SP_Proveedores(2,null,null,null,null,null,null,$listaInicio)");
  2.  

Ahora se le pasaran como null los otros parámetros diferentes a _listaInicio (esta variable me sirve en el codigo para q me muestre los datos de 5 en 5 dependiendo de _listaInicio…si _listaInicio seria 0 me mostraria los 5 primeros registros, si fuera 5 me mostraria los segundos 5 registros y asi sucesivamente… Esto lo hago con el fin de poder hacer las paginaciones de la tabla )

Esa es la otra duda q tenia…ya q al hacer esto se genera un error en PHP debido a q el SP no retorna nada debido a los nulls…No se si estoy pasando mal las variables null o si desde PHP los null no se pasan de esa forma :S

Por eso les puse el codigo en .NET solo para ejemplos de ilustración

Código: Text
  1. CREATE proc [dbo].[_Proveedores]
  2. @Tipoconsulta tinyint=null,
  3. @IdProveedor int=null,
  4. @NombreCompañía nvarchar(40)=null,
  5. @Dirección nvarchar(60)=null,
  6. @Teléfono nvarchar(24)=null,
  7. @NombreContacto nvarchar(30)=null,
  8. @CargoContacto  nvarchar(30)=null
  9. as
  10.  

Como se ve las variables del SP se declaran como null desde el mismo SP

Y desde el codigo de la aplicación

Código: Text
  1. SqlCommand consultasql = new SqlCommand("_Proveedores", cnn);
  2. consultasql.CommandType = System.Data.CommandType.StoredProcedure;
  3. consultasql.Parameters.Add("@Tipoconsulta", System.Data.SqlDbType.TinyInt).Value = 2;
  4.  

Solo se agragarian los parametros q necesito sin necesidad de estar poniendo a los otros como null

Con respecto a si el SP esta bien implementado…tuve q corregir la parte del SP q hice cuando TipoConsulta=2 y donde utilizo la variable _listaInicio


Código: Text
  1. /*LISTAR PROVEEDORES*/
  2. ELSEIF _TipoConsulta=2 THEN
  3. SELECT IdProveedor,NombreCompañía,Dirección,Teléfono,NombreContacto,CargoContacto
  4. FROM proveedores LIMIT _listaInicio,5;
  5.  

Ya q se producia un error  al pasarle un valor parametrizado al LIMIT. Al parecer esto es un bug del MySQL 5 … creo…

La cuestion es q cuando postee el SP si me corria y no presentaba ningun error…cosas raras q a veces pasan… :S…bueno… buscando…buscando…encontre la solucion y cambie esa parte del codigo del SP por esta

Código: Text
  1. /*LISTAR PROVEEDORES*/
  2. ELSEIF _TipoConsulta=2 THEN
  3. SET @li=_listaInicio;
  4. PREPARE stmt FROM "SELECT * FROM proveedores LIMIT ?,5";
  5. EXECUTE stmt USING @li;
  6. DEALLOCATE PREPARE stmt;
  7.  

Bueno este dato puede servirles a muchos q tal vez en alguna oportunidad quieran utilizar el LIMIT con valores parametrizados  …
Hasta ahí todo bien…ahora el SP corre a la perfeccion…pero aun sigo teniendo las dudas de los parámetros nulos…

Gracias por todo de antemano

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Dudas con MySQL, SP con multiples parametros y PHP
« Respuesta #4 en: Jueves 18 de Diciembre de 2008, 09:42 »
0
Cita de: "ClaCS_85"

_TipoConsulta=1
_IdProveedor=24
_NombreCompania=xxx
_Direccion=dir_xxx
_Telefono=777
_NombreContacto=yyy
_CargoContacto=zzz

Llamando al SP desde PHP de la siguiente manera

Código: PHP
  1. $resultado = mysqli_query($cnn,"CALL SP_Proveedores(1,24,’xxx’,’dir_xxx’,777,’yyy’,’zzz’,null)");
  2.  

Seria bueno que nos mostraras el error que te arroja lo puedes obtener con
http://www.php.net/manual/es/mysqli.error.php

ahora no se si ese sea el codigo que estas utilizando pero estos caracteres son diferentes ( ’ != ' ) el que se necesita es el apostrofe ( ' )

Cita de: "ClaCS_85"
Los parámetros q serian varchar en MySQL se pasan entre comillas simples desde PHP??...supongo q los enteros no…no??...null no se pasaria entre comillas simples??

Como se observa el valor de _listaInicio seria null ya q no me sirviria para esta ocasión

Pero si quiero listar los proveedores de 5 en 5 utilizaria el TipoConsulta=2 de esta manera

Código: PHP
  1. $resultado = mysqli_query($cnn,"CALL SP_Proveedores(2,null,null,null,null,null,null,$listaInicio)");
  2.  

Si los text/Varchar deben de ir entre comillas simples o dobles (depende de como generes la cadena en php) lo mas comodo es la sencilla, los numericos pueden ir entre comillados o no, si se envia '' se hace solo el casting e inserta 0 en caso de una insercion

el null va sin comillas de ningun tipo la base de datos la reconocera como propia del DBMS esta bien como lo estas enviando solo indicanos que error te esta arrojando

y creo que te conviene separar mejor los SP en 2


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================