Page 1 sur 1

Problème de procédure stockée

Posté : 04 oct. 2007, 08:06
par casalboss01
Bonjour à tous,

je fais appel à une procédure stockée en MYSQL à partir de mon script PHP.

Cette procédure fonctionne:

Code : Tout sélectionner

CREATE PROCEDURE sp_select() BEGIN UPDATE .....; END$$
Si néanmoins j'essaye de concaténer la requête avec un string, ce que je fais pour passer une clause Where en paramêtre, cela ne fonctionne plus.

Code : Tout sélectionner

CREATE PROCEDURE `sp_select`(IN_WHERECLAUSE VARCHAR(200)) BEGIN SET @S = CONCAT ("UPDATE ....... WHERE ", INWHERECLAUSE); PREPARE STMT FROM @S; EXECUTE STMT ; END$$
Ceci ne veut pas fonctionner en PHP et me returne le message suivant:

Code : Tout sélectionner

PROCEDURE .... can't return a result set in the given context.
Donc, si j'essaye de concatener des strings pour créer une query un peu plus complexe, en PHP le tout me le refuse.

Est-ce que qqn aurait une solution miracle ? :-)

Merci d'avance

Casalboss01

Posté : 04 oct. 2007, 09:00
par Tracker
En bouquinant la doc, je suis tombé là dessus:
SQL syntax for prepared statements cannot be used within stored routines (procedures or functions), or triggers. This restriction is lifted as of MySQL 5.0.13 for stored procedures, but not for stored functions or triggers. However, a cursor cannot be used for a dynamic statement that is prepared and executed with PREPARE and EXECUTE. The statement for a cursor is checked at cursor creation time, so the statement cannot be dynamic.
Peux-tu tester directement l'exécution de ta procedure (PREPARE + EXECUTE) depuis le shell de mysql ?

Posté : 04 oct. 2007, 09:50
par casalboss01
Depuis l'interface la requête fonctionne sans problème, ce n'est que depuis php que j'ai ce problème.

Merci

Posté : 04 oct. 2007, 10:28
par zeus
Quel est le code PHP qui te permet d'exécuter cette procédure ?

Posté : 04 oct. 2007, 10:40
par casalboss01
Salut,

j'appelle avec mysql_query(call ma_procedure(clausewhere));

Merci

Posté : 04 oct. 2007, 10:51
par Tracker
Re,
Essaie de modifier ta procedure en ajoutant le mot clé IN devant le nom de ton paramètre. Ca reste à valider, mais le problème semble déjà avoir été abordé sur un autre forum.
CREATE PROCEDURE `sp_select`(IN IN_WHERECLAUSE VARCHAR(200))
BEGIN
SET @S = CONCAT ("UPDATE ....... WHERE ", INWHERECLAUSE);
PREPARE STMT FROM @S;
EXECUTE STMT ;
END$$
Le gars donnait également une autre solution:
After reading a bit farther, I found a message from Per-Erik Martin that solved my problem.
Adding the CLIENT_MULTI_STATEMENTS flag to my call to mysql_real_connect() fixes the problem.
Maybe this will also help some of you.
Thanks!