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

  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.

  7. #7
    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
    comment tu g�res dans ta proc�dure stock�e les jours f�ri�s qui ne sont ni de la maladie ni des cong�s ni des repos.

  8. #8
    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
    comment tu g�res dans ta proc�dure stock�e les jours f�ri�s qui ne sont ni de la maladie ni des cong�s ni des repos.
    En fait dans la proc�dure stock�e, je n'avais encore impl�ment� les jours f�ri�s que je me r�servais pour plus tard...
    J'ai suivi tes conseils et j'ai cod� directement en PHP sur les enregistrements s�lectionn�s dans la p�riode et tout fonctionne bine y compris les jours f�ri�s qui ne sont pas dans les week-ends.

    Donc je passe le sujet en r�solu m�me si je n'ai pas compris ce qui clochait dans ma routine.

    Merci encore pour l'aide, bravo pour votre support et � bient�t peut-�tre.

    Eric

  9. #9
    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
    tiens pour les jours f�ri�s j'avais cod� un truc par ici

+ 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