Foros del Web » Programando para Internet » PHP »

Dudas con MySQL, SP con multiples parametros y PHP

Estas en el tema de Dudas con MySQL, SP con multiples parametros y PHP en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 05/12/2008, 08:38
 
Fecha de Ingreso: enero-2007
Mensajes: 63
Antigüedad: 17 años, 2 meses
Puntos: 2
Pregunta Dudas con MySQL, SP con multiples parametros y PHP

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

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)
BEGIN


/*UPDATE*/
IF _TipoConsulta=1 THEN
UPDATE proveedores
SET NombreCompañía = _NombreCompania,
Dirección = _Direccion,
Teléfono=_Telefono,
NombreContacto = _NombreContacto,
CargoContacto = _CargoContacto
WHERE IdProveedor=_IdProveedor;

/*LISTAR PROVEEDORES*/
ELSEIF _TipoConsulta=2 THEN
SELECT IdProveedor,NombreCompañía,Dirección,Teléfono,Nomb reContacto,CargoContacto
FROM proveedores LIMIT _listaInicio,5;

/*INSERT*/
ELSEIF _TipoConsulta=3 THEN
INSERT INTO proveedores
(NombreCompañía
,Dirección
,Teléfono
,NombreContacto
,CargoContacto)
VALUES
(_NombreCompania
,_Direccion
,_Telefono
,_NombreContacto
,_CargoContacto);

/*DELETE*/
ELSEIF _TipoConsulta=4 THEN
DELETE FROM proveedores
WHERE IdProveedor=_IdProveedor;
END IF;

END;

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:




$consulta="CALL _Proveedores(2,null,null,null,null,null,null,$list aInicio)";
$resultado=mysql_query($consulta,$cnn);

while ($registro=mysql_fetch_array($resultado))
{
$coleccion[]=$registro;
}

mysql_close($cnn);

return $coleccion;//esto seria lo q devuelve mi funcion

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 )

CREATE proc [dbo].[_Proveedores]
@Tipoconsulta tinyint=null,
@IdProveedor int=null,
@NombreCompañía nvarchar(40)=null,
@Dirección nvarchar(60)=null,
@Teléfono nvarchar(24)=null,
@NombreContacto nvarchar(30)=null,
@CargoContacto nvarchar(30)=null
as

--UPDATE
if @Tipoconsulta=1
Begin
UPDATE Proveedores
SET [NombreCompañía] = @NombreCompañía,
[Dirección] = @Dirección,
[Teléfono]=@Teléfono,
[NombreContacto] = @NombreContacto,
[CargoContacto] = @CargoContacto


WHERE IdProveedor=@IdProveedor
End

--LISTAR PROVEEDORES
else if @Tipoconsulta=2
begin
SELECT IdProveedor,NombreCompañía,Dirección,Teléfono,Nomb reContacto,CargoContacto
FROM Proveedores
End

…etc
…etc

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#):




SqlCommand consultasql = new SqlCommand("_Proveedores", cnn);
consultasql.CommandType = System.Data.CommandType.StoredProcedure;
consultasql.Parameters.Add("@Tipoconsulta", System.Data.SqlDbType.TinyInt).Value = 2;




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 
  #2 (permalink)  
Antiguo 05/12/2008, 09:57
Avatar de ACX_POISON  
Fecha de Ingreso: abril-2008
Ubicación: Talca-Chile
Mensajes: 750
Antigüedad: 16 años
Puntos: 7
Respuesta: Dudas con MySQL, SP con multiples parametros y PHP

creo que deverias asignarle a una variable el resultado de la consulta que armas en tu funcion y cuando retornes la variable va imprimes para ver que sea correcta, algo asi:

Código PHP:
function Proveedores()// poner todos los parametros de llegada y puedes poner el parametro ="NULL" si no le envias valor
{
  IF (
_TipoConsulta==1)
 { 
 
//consulta de actualizacion
 
cons="UPDATE proveedores SET NombreCompañía = '$ _NombreCompania' , Dirección =$_Direccion', Teléfono='$_Telefono', NombreContacto ='$ _NombreContacto', CargoContacto = '$_CargoContacto' WHERE IdProveedor=$_IdProveedor;
 }
 IF (_TipoConsulta==2)
 {
  cons=""
 }
...
...
...

return cons;

luego la llamas
$cons=Proveedores($v1,$v2.....);
echo"$cons<br>"; //imprimes la consulta
espero te sirva
__________________
Me junto con los que Saben, Queriendo Saber.
  #3 (permalink)  
Antiguo 05/12/2008, 09:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Dudas con MySQL, SP con multiples parametros y PHP

Hola ClaCS,

Lamentablemente la extensión de MySQL normal no dispone de una forma de llamar a SP, y menos con parámetros.

Te recomiendo veas en el manual y uses MySQLi, o en dado caso PDO.

Saludos
  #4 (permalink)  
Antiguo 05/12/2008, 10:41
 
Fecha de Ingreso: agosto-2004
Ubicación: Lima
Mensajes: 109
Antigüedad: 19 años, 8 meses
Puntos: 1
Respuesta: Dudas con MySQL, SP con multiples parametros y PHP

Como estas ClaCS, mira para ejecutar SP en Mysql puedes usar tambien ADODB que es una capa de abstraccion en php para accede a bases de datos te dejo un pequeño ejemplo en este link http://leotrux.wordpress.com/2007/12...sql-desde-php/
  #5 (permalink)  
Antiguo 05/12/2008, 10:50
Avatar de ACX_POISON  
Fecha de Ingreso: abril-2008
Ubicación: Talca-Chile
Mensajes: 750
Antigüedad: 16 años
Puntos: 7
Respuesta: Dudas con MySQL, SP con multiples parametros y PHP

ups!! creo que no era....

entonce ¿Que es SP?
__________________
Me junto con los que Saben, Queriendo Saber.
  #6 (permalink)  
Antiguo 05/12/2008, 11:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Dudas con MySQL, SP con multiples parametros y PHP

SP = Stored Procedure.

Saludos.
  #7 (permalink)  
Antiguo 17/12/2008, 08:03
 
Fecha de Ingreso: enero-2007
Mensajes: 63
Antigüedad: 17 años, 2 meses
Puntos: 2
Pregunta Respuesta: Dudas con MySQL, SP con multiples parametros y PHP

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:
…
$resultado = mysqli_query($cnn,"CALL SP_Proveedores(1,24,’xxx’,’dir_xxx’,777,’yyy’,’zzz’,null)");
…
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:
…
$resultado = mysqli_query($cnn,"CALL SP_Proveedores(2,null,null,null,null,null,null,$listaInicio)");
…
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:
CREATE proc [dbo].[_Proveedores]
@Tipoconsulta tinyint=null,
@IdProveedor int=null,
@NombreCompañía nvarchar(40)=null,
@Dirección nvarchar(60)=null,
@Teléfono nvarchar(24)=null,
@NombreContacto nvarchar(30)=null,
@CargoContacto  nvarchar(30)=null
as
…
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:
…
SqlCommand consultasql = new SqlCommand("_Proveedores", cnn);
consultasql.CommandType = System.Data.CommandType.StoredProcedure;
consultasql.Parameters.Add("@Tipoconsulta", System.Data.SqlDbType.TinyInt).Value = 2;
…
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:
/*LISTAR PROVEEDORES*/
ELSEIF _TipoConsulta=2 THEN
SELECT IdProveedor,NombreCompañía,Dirección,Teléfono,NombreContacto,CargoContacto
FROM proveedores LIMIT _listaInicio,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:
/*LISTAR PROVEEDORES*/
ELSEIF _TipoConsulta=2 THEN
SET @li=_listaInicio;
PREPARE stmt FROM "SELECT * FROM proveedores LIMIT ?,5";
EXECUTE stmt USING @li;
DEALLOCATE PREPARE stmt;
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
  #8 (permalink)  
Antiguo 17/12/2008, 11:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Dudas con MySQL, SP con multiples parametros y PHP

No se que tanto influya, pero puedes intentar usar NULL, en lugar de null para ver si con eso resuelves el valor.

Por otro lado desde tu consola de MySQL trata de correr la consulta asi como la tienes por ejemplo CALL SP_Proveedores( 2, NULL, NULL..) y ve si te da algun error.

Saludos.
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 09:08.