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