elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  Llamar un procedimiento almacenado PL desde PHP.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Llamar un procedimiento almacenado PL desde PHP.  (Leído 5,499 veces)
Saberuneko


Desconectado Desconectado

Mensajes: 2.181



Ver Perfil WWW
Llamar un procedimiento almacenado PL desde PHP.
« en: 19 Marzo 2014, 16:57 pm »

Lenguajes:
PHP, PL/SQL
Problema:
No consigo que se ejecute ningún procedimiento PL/SQL almacenado desde mi script PHP.
Códigos:

Tablas:
Código
  1. /*GOODS TABLE, WILL CONTAIN ALL GOODS*/
  2. CREATE TABLE GOODS(
  3. ID INT(3) AUTO_INCREMENT,
  4. NAME CHAR(20) UNIQUE,
  5. IMGFILE CHAR(20),
  6. L_PRICE INT(4),
  7. S_PRICE INT(4),
  8. H_PRICE INT(4),
  9. C_PRICE INT(4),
  10. PRIMARY KEY(ID));
  11.  
  12. /*TRADERS TABLE, WILL CONTAIN ALL USERS AND THEIR DATA*/
  13. CREATE TABLE TRADERS(
  14. ID INT(3) AUTO_INCREMENT,
  15. USERNAME CHAR(20) NOT NULL,
  16. PASSWORD CHAR(20) NOT NULL,
  17. MAIL CHAR(40) NOT NULL,
  18. CREDITS CHAR(20) NOT NULL,
  19. PRIMARY KEY(ID));
  20.  
  21. /*STOCKS TABLE, WILL CONTAIN EACH USER'S (TRADER) STOCK*/
  22. CREATE TABLE STOCKS(
  23. GOOD_ID INT(3),
  24. TRADER_ID INT(3),
  25. AMMOUNT INT(10),
  26. AVG_BUY INT(4),
  27. FOREIGN KEY(GOOD_ID)
  28. REFERENCES GOODS(ID)
  29. ON DELETE CASCADE,
  30. FOREIGN KEY(TRADER_ID)
  31. REFERENCES TRADERS(ID)
  32. ON DELETE CASCADE);

Procedimiento Almacenado a llamar:
Código
  1. /*THIS PROCEDURE ALLOWS THE TRADERS TO BUY STOCKS*/
  2. CREATE PROCEDURE BUY_STOCK(P_GOOD INT,P_TRADER INT,P_AMMOUNT INT)
  3. BEGIN
  4. DECLARE V_PRICE, V_COST INT;
  5. SELECT C_PRICE INTO V_PRICE
  6. FROM GOODS
  7. WHERE ID = P_GOOD;
  8.  
  9. SET V_COST = V_PRICE*P_AMMOUNT;
  10.  
  11. IF HAS_CREDITS(P_TRADER,V_COST) THEN
  12. IF HAS_STOCK(P_GOOD,P_TRADER) THEN
  13. UPDATE STOCKS
  14. SET AMMOUNT = AMMOUNT + P_AMMOUNT
  15. WHERE GOOD_ID = P_GOOD
  16. AND TRADER_ID = P_TRADER;
  17. UPDATE STOCKS
  18. SET AVG_BUY = ((AVG_BUY*(AMMOUNT-P_AMMOUNT))+(V_PRICE*P_AMMOUNT))/AMMOUNT
  19. WHERE GOOD_ID = P_GOOD
  20. AND TRADER_ID = P_TRADER;
  21. ELSE
  22. INSERT INTO STOCKS
  23. VALUES(P_GOOD,P_TRADER,P_AMMOUNT,V_PRICE);
  24. END IF;
  25. UPDATE TRADERS
  26. SET CREDITS = CREDITS - V_COST
  27. WHERE ID = P_TRADER;
  28. END IF;
  29. END;

Código PHP que trata de llamar al procedimiento almacenado:
Código
  1. <?php
  2. session_name('trademaster');
  3.  
  4. if($_POST['transaction'] = "Buy")
  5. {
  6.  
  7. $good = $_POST['goodid'];
  8. $id = $_SESSION['id'];
  9. $ammount = $_SESSION['ammount'];
  10. $db = new PDO("mysql:host=localhost;dbname=trademaster", 'trader', '********');
  11.  
  12. $x = $db->prepare('CALL BUY_STOCK(:good, :trader, :ammount)');
  13.  
  14. $x->bindValue(':good', $good, PDO::PARAM_INT);
  15. $x->bindValue(':trader', $id, PDO::PARAM_INT);
  16. $x->bindValue(':ammount', $ammount, PDO::PARAM_INT);
  17.  
  18. $x->execute();
  19.  
  20. unset($db);
  21.  
  22. header("location:stocks.php");
  23. exit();
  24. }
  25. ?>

Error:
Código:
PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1370 execute command denied to user 'trader'@'localhost' for routine 'trademaster.BUY_STOCK'

Observaciones:
El usuario 'trader'@'localhost' que interactúa con la base de datos tiene los permisos de USAGE, SELECT, INSERT, UPDATE, DELETE y EXECUTE sobre todas las tablas de la base de datos (trademaster.*).

Queries hacia la base de datos con SELECT, INSERT y UPDATE funcionan.

El procedimiento almacenado funciona correctamente, ya lo he probado localmente desde una consola MySQL.

La password del objeto PDO la quité por razones evidentes.

Los valores POST y SESSION se recogen adecuadamente, lo he comprobado.


« Última modificación: 19 Marzo 2014, 20:34 pm por Saberuneko » En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: Llamar un procedimiento almacenado PL desde PHP.
« Respuesta #1 en: 19 Marzo 2014, 23:37 pm »

Realmente no veo el problema xD

Segun lecturas en SOF podrías probar..

- Meterte como root y

Código
  1. GRANT EXECUTE ON PROCEDURE trademaster.BUY_STOCK TO 'trader'@'localhost'

o cambiar PROCEDURE por FUNCTION.


Saludos



En línea

Saberuneko


Desconectado Desconectado

Mensajes: 2.181



Ver Perfil WWW
Re: Llamar un procedimiento almacenado PL desde PHP.
« Respuesta #2 en: 20 Marzo 2014, 00:01 am »

Olvidé mencionar que probé a utilizar como usuario root en el PHP para ver si era cosa de permisos. Y me devolvía el mismo error...

De todas formas, voy a probar a ver si tira poniendo el permiso en específico para los procedimientos almacenados...

Teniendo en cuenta que tengo 2 procedimientos que usan unas 2-3 funciones cada uno... ¿tendría que dar permisos de esta manera individual para cada función/procedimiento)?

--

EDIT: He probado, sigue sin funcionar dando los permisos específicos.
« Última modificación: 20 Marzo 2014, 00:06 am por Saberuneko » En línea

EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Llamar un procedimiento almacenado PL desde PHP.
« Respuesta #3 en: 20 Marzo 2014, 00:31 am »

Utiliza comillas dobles y prueba..

Código
  1. $x = $db->prepare("CALL BUY_STOCK(:good, :trader, :ammount)");
  2.  
En línea

Saberuneko


Desconectado Desconectado

Mensajes: 2.181



Ver Perfil WWW
Re: Llamar un procedimiento almacenado PL desde PHP.
« Respuesta #4 en: 20 Marzo 2014, 00:55 am »

Nada, lo mismo con comillas simples que comillas dobles. No hace nada y sigue devolviendo el mismo error.

Nota: En las demás consultas que no son llamadas (SELECT, INSERT, UPDATE y DELETE) uso comilla simple y funciona y también estoy metiendo parámetros.

Tiene pinta de que hay algún error de sintaxis en la cadena que se manda finalmente al servidor.

Curiosamente, si hago var_dump de $x me devuelve un valor tal que:
Código:
'CALL BUY_STOCK(:good, :trader, :ammount)'

Si hago un var_dump de un código similar hecho con MySQLI, devuelve:
Código:
'CALL BUY_STOCK(1,1,10)'
(que son los valores de las variables a las que hago Bind).

Si la operación la hago de la siguiente forma:

Código
  1. $x = $db->prepare('CALL BUY_STOCK(?,?,?)');
  2. $x->bindParam(1, $good, PDO::PARAM_INT);
  3. $x->bindParam(2, $id, PDO::PARAM_INT);
  4. $x->bindParam(3, $ammount, PDO::PARAM_INT);
  5.  

Lo que me devuelve var_dump es:
Código:
'CALL BUY_STOCK(?,?,?)'

Desgraciadamente, en todos estos casos, no funciona.

¿Qué puede estar mal o quedándose en el tintero?
« Última modificación: 20 Marzo 2014, 01:52 am por Saberuneko » En línea

Saberuneko


Desconectado Desconectado

Mensajes: 2.181



Ver Perfil WWW
Re: Llamar un procedimiento almacenado PL desde PHP.
« Respuesta #5 en: 20 Marzo 2014, 17:51 pm »

Al final he portado todo lo que tenía en PL a PHP.

Desgraciadamente, me surgió un nuevo problema con la base de datos. Voy a abrir un topic al respecto.
« Última modificación: 20 Marzo 2014, 19:30 pm por Saberuneko » En línea

EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Llamar un procedimiento almacenado PL desde PHP.
« Respuesta #6 en: 21 Marzo 2014, 02:33 am »

Quiero probar intentar encontrar el problema.. en version de mysql estas trabajando ?

Si te vuelve a generar problemas con GRANT y REVOKE, explica un poco que fue lo que hiciste u el error.
« Última modificación: 21 Marzo 2014, 02:34 am por EFEX » En línea

Saberuneko


Desconectado Desconectado

Mensajes: 2.181



Ver Perfil WWW
Re: Llamar un procedimiento almacenado PL desde PHP.
« Respuesta #7 en: 21 Marzo 2014, 12:52 pm »

Tiene pinta de que se le había corrompido algo, ya que reinstalar y volcar tablas, users y privilegios tal y como estaban al empezar todo funciona bien.

De todas formas, de volver a fallar, comento.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
llamar Procedimiento Almacenado
Programación Visual Basic
juanjoxx 0 1,351 Último mensaje 9 Septiembre 2008, 05:23 am
por juanjoxx
tabla temporal en procedimiento almacenado
Bases de Datos
OssoH 0 3,438 Último mensaje 21 Noviembre 2012, 21:58 pm
por OssoH
Problemas con procedimiento almacenado en mysql
Bases de Datos
3n31ch 1 2,727 Último mensaje 11 Septiembre 2015, 03:18 am
por 0roch1
Busqueda de Registro con Procedimiento Almacenado en Sql Server
Programación Visual Basic
hamiltonbl 1 2,178 Último mensaje 18 Agosto 2015, 04:36 am
por ThunderCls
crear procedimiento almacenado con select a tabla del sistema
Bases de Datos
d91 0 2,238 Último mensaje 27 Noviembre 2015, 19:56 pm
por d91
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines