IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

PHP & Base de données Discussion :

Procedure stockee mysql fonctionne avec phpmyadmin mais ne renvoit rien avec PHP [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Pilote d'essais retraité
    Inscrit en
    Septembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Pilote d'essais retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 47
    Par défaut Procedure stockee mysql fonctionne avec phpmyadmin mais ne renvoit rien avec PHP
    Bonjour les spécialistes,
    j'espère que je poste au bon endroit...
    je me débats depuis une journée avec une procédure stockée mySQL. Celle ci fonctionne bien lorsque je la lance depuis phpMyAdmin et m'affiche les données correctement calculées. Son but est de calculer les jours de congés, repos, maladie hors week-end par navigant.
    Voici le résultat obtenu avec phpMyAdmin:
    Nom : Capture d’écran 2019-06-08 à 01.57.11.png
Affichages : 342
Taille : 21,8 Ko
    Lorsque j'appelle la fonction avec un script php, rien n'est retourné et pire lors de l’exécution d'autres requêtes suivantes j’obtiens l'erreur suivante:
    Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away in /homepages/13/d716355965/htdocs/clickandbuilds/Joomla/MyCMS/includesDA/dboperation.php:3601
    J'ai beau chercher je ne vois pas d'erreur dans la procédure qui provoquerait par exemple une boucle infinie.

    Voici le code de la procédure stockée:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    BEGIN
    	DECLARE Fin DATE;
        DECLARE done BOOLEAN DEFAULT FALSE;
        DECLARE p_trig VARCHAR(3);
        DECLARE p_current_trig VARCHAR(3) DEFAULT '';
        DECLARE p_start DATE;
        DECLARE p_end DATE;
        DECLARE p_nom VARCHAR(12);
        DECLARE joursConges INT DEFAULT 0;
        DECLARE joursRepos INT DEFAULT 0;
        DECLARE joursMaladie INT DEFAULT 0;
        DECLARE dateCourante DATE;
    	DECLARE jour INT;
     
    	DECLARE curseur_events CURSOR FOR SELECT trig, start_date, end_date, nom FROM eventsFiltered ORDER BY groupe, hierarchie, nom, start_date;
     
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     
    	IF Periode = 'mois' THEN
        	SET Fin = DATE_ADD(Debut, INTERVAL 1 MONTH);
        END IF;
    	IF Periode = 'trimestre' THEN
        	SET Fin = DATE_ADD(Debut, INTERVAL 3 MONTH);
        END IF;
    	IF Periode = 'semestre' THEN
        	SET Fin = DATE_ADD(Debut, INTERVAL 6 MONTH);
        END IF;
    	IF Periode = 'annee' THEN
        	SET Fin = DATE_ADD(Debut, INTERVAL 1 YEAR);
        END IF;
        SET Fin = DATE_SUB(Fin, INTERVAL 1 DAY);
     
    	DROP TEMPORARY TABLE IF EXISTS conge_repos_maladie;
     
    	CREATE TEMPORARY TABLE conge_repos_maladie (
    		trig VARCHAR(3), conges INT, repos INT, maladie INT
    	);
     
    	DROP TEMPORARY TABLE IF EXISTS eventsFiltered;
    	CREATE TEMPORARY TABLE eventsFiltered AS
    	SELECT e.pk, e.trig, e.groupe, e.hierarchie, 
    	(CASE WHEN e.start_date < Debut THEN Debut ELSE e.start_date END) AS start_date,
    	(CASE WHEN e.end_date > Fin THEN  Fin ELSE e.end_date END) AS end_date,
    	(CASE WHEN e.event_type = 2 OR e.event_type = 3 THEN 'Congés' ELSE et.nom END) AS nom, 
    	(CASE WHEN e.end_date > Fin THEN DATEDIFF(Fin, e.start_date) + 1 ELSE e.duration END) AS duration 
     
    	FROM eventsByNav e LEFT JOIN events_type et ON e.event_type = et.pk WHERE (e.start_date BETWEEN Debut AND Fin OR e.end_date BETWEEN Debut AND Fin) AND event_type IN (1,2,3,4) AND e.groupe IN (1,4);
     
    	SELECT trig INTO p_current_trig FROM eventsFiltered ORDER BY groupe, hierarchie LIMIT 1; -- récupération premier navigant
     
        OPEN curseur_events;
     
        loop_events: LOOP
        	FETCH curseur_events INTO p_trig, p_start, p_end, p_nom;
        	IF done THEN -- sauvegarde dernier enregistrement et sortie de boucle
    			INSERT INTO conge_repos_maladie (trig, conges, repos, maladie) VALUES (p_current_trig, joursConges, joursRepos, joursMaladie);
    			LEAVE loop_events; 	
    		END IF;
        	IF p_trig != p_current_trig THEN -- changement de navigant
    			INSERT INTO conge_repos_maladie (trig, conges, repos, maladie) VALUES (p_current_trig, joursConges, joursRepos, joursMaladie);
    			SET joursConges = 0;
    			SET joursRepos = 0;
    			SET joursMaladie = 0;
    			SET p_current_trig = p_trig;
    			SET dateCourante = p_start;
    			boucle1: WHILE  dateCourante <= p_end DO -- balayage de la période pour supprimer les WE
    				SET jour = DAYOFWEEK(dateCourante);
    				IF NOT (jour = 1 OR jour = 7) THEN
    					CASE
    						WHEN p_nom = 'Congés' THEN
    							SET joursConges = joursConges + 1;
    						WHEN p_nom = 'Récupération' THEN
    							SET joursRepos = joursRepos + 1;
    						WHEN p_nom = 'Maladie' THEN
    							SET joursMaladie = joursMaladie + 1;
    					END CASE;
    				END IF;
    				SET dateCourante = ADDDATE(dateCourante, 1);
    			END WHILE boucle1;
        	ELSE -- toujours le même navigant
        		SET dateCourante = p_start;
    			boucle2: WHILE  dateCourante <= p_end DO
    				SET jour = DAYOFWEEK(dateCourante);
    				IF NOT (jour = 1 OR jour = 7) THEN
    					CASE
    						WHEN p_nom = 'Congés' THEN
    							SET joursConges = joursConges + 1;
    						WHEN p_nom = 'Récupération' THEN
    							SET joursRepos = joursRepos + 1;
    						WHEN p_nom = 'Maladie' THEN
    							SET joursMaladie = joursMaladie + 1;
    					END CASE;
    				END IF;
    				SET dateCourante = ADDDATE(dateCourante, 1);
    			END WHILE boucle2;
    		END IF;
    	END LOOP loop_events;
     
    	CLOSE curseur_events;
     
    	SELECT * FROM conge_repos_maladie;	
    END
    ainsi que le code d'appel de la procédure:
    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
     
    function calculeCRM($debut, $periode)
    {
            try 
    	{
    		$stmt = $this->conn->prepare("CALL calculeCRM(:debut, :periode)");
    		$stmt->bindValue('debut', $debut, PDO::PARAM_STR);
    		$stmt->bindValue('periode', $periode, PDO::PARAM_STR);
    		$stmt->execute();
    		return $stmt->fetchAll(PDO::FETCH_ASSOC);
    	} 
    	catch (Exception $e) 
    	{
    		echo "Erreur: " . $e->getMessage();
            }
    }
    Voilà, je pense que j'ai tout dit et je ne sais plus quoi faire...

    J'utilise ce procédé ailleurs dans mon application sans aucun problème, c'est pourquoi je sollicite votre aide.

    Je suis preneur de toute remarque.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    comment tu initialises PDO ?
    ensuite essaie voir si ça tourne avec un $pdo->query("CALL calculeCRM('{$debut}', '{$periode}')")

  3. #3
    Membre chevronné

    Homme Profil pro
    Pilote d'essais retraité
    Inscrit en
    Septembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Pilote d'essais retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 47
    Par défaut
    Bonjour et merci de me répondre. En réponse à ta question, voici l'initialisation:
    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
     
    class DbConnect
    {
        private $conn;
     
        function __construct()
        {
        }
     
        function connect()
        {
            require_once 'config.php';
     
            $this->conn = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8mb4', DB_USERNAME, DB_PASSWORD);
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    		$this->conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
     
            return $this->conn;
        }
    }
    Ma classe DbOperation
    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
     
    <?php	
             class DbOperation
    	{
     		private $conn;
     
    		 //Constructor
    		 function __construct()
    		{
    			require_once dirname(__FILE__) . '/config.php';
    			require_once dirname(__FILE__) . '/dbconnect.php';
     
    			$db = new DbConnect();
    			$this->conn = $db->connect();
    		}
    		function calculeCRM($debut, $periode)
    		{
                       // la fonction du premier message
                    }
    ?>
    L'appel depuis ma page
    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
     
    <?php
    		if($_SERVER['REQUEST_METHOD']=='GET')
    		{
    			$debut = isset($_GET['deb']) ? new DateTime($_GET['deb']): new DateTime();
    			$periode = isset($_GET['per']) ? $_GET['per']: 'mois';
     
    			require_once '../includes/dboperation.php';
     
    			$mois = intval($debut->format('m'));
    			$annee = intval($debut->format('Y'));
    			$debut = $debut->setDate($annee, $mois, 1);			
     
    			$db = new DbOperation();
     
    			$CRM =  $db->calculeCRM($debut->format('Y-m-d'), $periode);
                            echo var_dump($CRM);
    		}
    ?>
    le echo var_dump($CRM); me renvoit array(0) {}

    Cela dit, ce qui m'étonne, c'est que tous les autres appels de fonction de la classe DbOperation fonctionnent correctement y compris les appels des autres procédures stockées.

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    ceci var_dump($_GET['deb']); donne quoi ?

  5. #5
    Membre chevronné

    Homme Profil pro
    Pilote d'essais retraité
    Inscrit en
    Septembre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Pilote d'essais retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 47
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    ceci var_dump($_GET['deb']); donne quoi ?
    Tout dépend des données envoyées.
    Soit je passe une date au format '2019-05-01' et j'obtiens '2019-05-01', soit je ne mets rien et par défaut je prends la date courante que je modifie pour prendre le premier jour du mois et selon la période sélectionner le calcule le dernier de jour du mois de la période considérée.

    En toute honnêteté, je pense que le problème vienne plutôt de la procédure stockée mais je ne vois pas où ?

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    C'est étrange ton problème... t'as essayé de porter ta procédure stockée en PHP ? Les traitements sont simples.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] requête avec sous requete qui fonctionne sur PhpMyAdmin mais pas avec un script PHP
    Par Park033 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 18/02/2017, 22h18
  2. Réponses: 2
    Dernier message: 31/05/2016, 14h18
  3. [MySQL] Requête fonctionne sur phpMyAdmin mais pas dans le code PHP
    Par cocobuck dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 24/02/2016, 10h23
  4. [Wamp] Requete fonctionne sous phpmyadmin mais pas en script php
    Par ben.IT dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 04/01/2010, 16h16
  5. Procedures Stockees MySql
    Par PatFal dans le forum XMLRAD
    Réponses: 1
    Dernier message: 21/02/2007, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo