Programación Web y Scripting > PHP
Dudas con MySQL, SP con multiples parametros y PHP
(1/1)
ClaCS_85:
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 ---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 THENUPDATE proveedores SET NombreCompañía = _NombreCompania, Dirección = _Direccion, Teléfono=_Telefono, NombreContacto = _NombreContacto, CargoContacto = _CargoContacto WHERE IdProveedor=_IdProveedor; /*LISTAR PROVEEDORES*/ELSEIF _TipoConsulta=2 THENSELECT IdProveedor,NombreCompañía,Dirección,Teléfono,NombreContacto,CargoContactoFROM proveedores LIMIT _listaInicio,5; /*INSERT*/ELSEIF _TipoConsulta=3 THENINSERT INTO proveedores (NombreCompañía ,Dirección ,Teléfono ,NombreContacto ,CargoContacto) VALUES (_NombreCompania ,_Direccion ,_Telefono ,_NombreContacto ,_CargoContacto); /*DELETE*/ELSEIF _TipoConsulta=4 THENDELETE FROM proveedoresWHERE 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:
--- Código: Text ---…… $consulta="CALL _Proveedores(2,null,null,null,null,null,null,$listaInicio)"; $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 )
--- Código: Text ---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)=nullas --UPDATEif @Tipoconsulta=1 BeginUPDATE Proveedores SET [NombreCompañía] = @NombreCompañía, [Dirección] = @Dirección, [Teléfono]=@Teléfono, [NombreContacto] = @NombreContacto, [CargoContacto] = @CargoContacto WHERE IdProveedor=@IdProveedorEnd --LISTAR PROVEEDORESelse if @Tipoconsulta=2beginSELECT IdProveedor,NombreCompañía,Dirección,Teléfono,NombreContacto,CargoContactoFROM ProveedoresEnd …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#):
--- Código: Text ---…… 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
shadow_rev:
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:
F_Tanori:
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
ClaCS_85:
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 ---…$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: Text ---…$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: Text ---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)=nullas…
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 ---…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: Text ---/*LISTAR PROVEEDORES*/ELSEIF _TipoConsulta=2 THENSELECT IdProveedor,NombreCompañía,Dirección,Teléfono,NombreContacto,CargoContactoFROM 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: Text ---/*LISTAR PROVEEDORES*/ELSEIF _TipoConsulta=2 THENSET @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 de antemano
F_Tanori:
--- 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 ---…$resultado = mysqli_query($cnn,"CALL SP_Proveedores(1,24,’xxx’,’dir_xxx’,777,’yyy’,’zzz’,null)");…
--- Fin de la cita ---
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 ---…$resultado = mysqli_query($cnn,"CALL SP_Proveedores(2,null,null,null,null,null,null,$listaInicio)");…
--- Fin de la cita ---
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
Navegación
Ir a la versión completa