Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Appel fonctions stockées // Mysql


Sujet :

Zend_Db PHP

  1. #1
    Membre habitué
    Appel fonctions stockées // Mysql
    Bonjour à tous,

    Je suis en train de faire des fonctions stockées avec Mysql et Zend.

    Les procédures stockées, c ok.. les vues, c ok, mais pas les fonctions stockées.

    J'ai des erreurs de syntaxe ou alors le moteur mysql me dit la procédure is_test() n'existe pas (et oui, c une fonction)

    Par exemple, la fonction (qui aura des paramètres en fait) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BEGIN
    declare is_test bool;
     
    SELECT
    	count(`USR_ID`) > 0 INTO is_test 
    FROM
    	`utilisateur`;
     
    RETURN is_test;
     
    END


    Avec Zend :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    $dbAdapter = Zend_Registry::get('front_db');
    $func = 'CALL is_test()';
    $stmt= $dbAdapter->query($func);


    J'ai essayé plusieurs manieres de faire (comme pour les vues) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    $func = 'SELECT * FROM is_test()';


    Les 2 ne marchent pas, comment faire ?.

    Pour rappel, voici comment faire pour des procédures stockées et des vues (si çà peut aider quelqu'un ) :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $call = 'CALL sp_utilisateur_ins("'.
                    $data['USR_IDENTIFIANT'].'","'.
                    $data['USR_MOT_DE_PASSE'].'","'.
                    $data['USR_ADRESSE_EMAIL'].'","'.
                    $data['USR_CONTROLE'].'","'.
                    $data['USR_ROLE'].'","'.
                    $data['USR_CLE_ACTIVATION'].'","'.
                    '0","'.
                    $data['USR_DATE_CREATION'].'","'.
                    '1",'.
                    '@PAR_USR_ID)';
     
    $stmt = $dbAdapter->query($call);
    $row  = $dbAdapter->query("SELECT @PAR_USR_ID");
    $row  = $row->fetchAll();
     
    $insertId = (int)$row[0]['@PAR_USR_ID'];
     
     
    $rows= $dbAdapter->query("SELECT * FROM view_available_annonce");
    var_dump($rows->fetchAll());


    Merci
    Fabrice

  2. #2
    Membre expérimenté
    Bonjour,
    As tu essayé d'utiliser prepare et execute sur une instance de Zend_Db ?

    Ou regarde ce post :
    http://www.developpez.net/forums/d72...re-stocke-sql/

  3. #3
    Membre habitué
    Salut,

    Merci, mais non , çà c une autre syntaxe pour une procédure stockées, mais pas pour une fonction stockée. J'ai cette erreur :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SQLSTATE[42000]: Syntax error or access violation: 1305 PROCEDURE foo.is_utilisateur_existe does not exist


    Tout est là, le soucis vient des fonctions stockées.

    Une autre idée ?

    Fabrice

  4. #4
    Modérateur

    Salut,

    moi même je n'y suis jamais arrivé.
    Pour le coup, je crée une procédure stockée qui se charge d'encapsuler l'appel à la fonction stockée.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  5. #5
    Membre habitué
    Je crois que j'ai la solution (voir ici).

    Il faut faire comme ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BEGIN
    declare is_test bool;
     
    SELECT
    	count(`USR_ID`) > 0 INTO is_test 
    FROM
    	`utilisateur`
     
    WHERE `USR_ID` = param_utilisateur_id AND `USR_ROLE` = param_utilisateur_role;
     
    RETURN is_test;
     
    END


    et
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    $stmt = $dbAdapter->prepare("SELECT is_test(:id,:role)");
    $stmt->execute(array(':id'=>1,':role'=>'administrator'));
    print_r($stmt->fetchAll());


    Cela me renvoi ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Array ( [0] => Array ( [is_test('1','administrator')] => 0 ) )


    Voilà
    Fabrice