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 :

Fonction très longue [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 137
    Points : 92
    Points
    92
    Par défaut Fonction très longue
    Bonjour, à tous et à toutes,

    j'ai créé une fonction qui me permet de parcourir l'arborescence de mes compte comptables, cependant cette fonction est extrêmement lourde puisque l'affichage désiré est correcte mais que j'ai une erreur due au temps maximum de 30 seconde dépassé (je pourrais le mettre a 5 minutes mais la n'est pas mon but d'attendre 5 minutes à chaque fois.
    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
     
     
    function account_overview($i="")
    	{
    		try
    		{
    			$bdd = new PDO('mysql:host=localhost;dbname=accounting', 'root', '');
    		}
    			catch(Exception $e)
    		{
    				die('Erreur : '.$e->getMessage());
    		}
    		if(($i < 1000) OR ($i=""))
    		{
    			$rsearch = $bdd->query('SELECT acc_name, code FROM compte_comptable WHERE parent_code="'.$i.'"');
    			while($search = $rsearch->fetch())
    			{
    				echo $search['code'].' - '.$search['acc_name'].'</br>';
    				account_overview($search['code']);
    			}
    		}
    	}			
    account_overview();
    ca va beaucoup plus vite avec 4-5 boucle while et plein de code mais je voulais essayer de condenser et de faire une fonction qui me fasse le tout en un. Si quelqu'un peut m'aider à optimiser cette dernière je l'en remercie d'avance.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    avec une jointure en une requete c'est réglé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT c2.acc_name, c2.code 
    FROM compte_comptable c1, compte_comptable c2
    WHERE c1.parent_code= c2.code

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Je pense que le principal rallentissement de ta fonction résulte du fait que la connection PDO est systématiquement initialisées à chaque appel (dans une fonction récursive, on peut aisément comprendre ce que ça implique).

    Il faudrait plutôt donner l'instance PDO à manger à la fonction pour économiser cette initialisation inutile.

    Tu devrais d'ailleurs éviter de faire des die dans ton code: la vie continue en cas d'erreur. De plus, l'utilisateur n'a pas grand chose à faire des messages d'erreurs MySQL

    Donc voici une version revue de ta fonction (j'ai pas testé évidement):
    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
    function account_overview (PDO $pdo, $code = "", & $results) {
        if ($code > 1000)
           return;
        if (!$pdo)
            throw new RuntimeException("Expecting a valid PDO instance");
        if (!$results)
            $results = array();
        try {
            $stmt = $pdo->prepare('SELECT acc_name, code FROM compte_comptable WHERE parent_code=:code');
            $stmt->bindParam(':code', $code, PDO::PARAM_STR);
            if (!$stmt->execute())
                throw new RuntimeException("Query Error");
     
            $stmt->setFetchMode(PDO::FETCH_ASSOC);
            foreach ($stmt as $row) {
                $result[$row['code']] = $row['acc_name'];
                account_overview($pdo, $row['code'], $results);
            }
     
            return $results;
        }
        catch (Exception $e) {
            trigger_error((string)$e, E_USER_WARNING);
            return false;
        }
    }
    comme l'a mentionné stealth, tu auras meilleur compte à utiliser une jointure mais au moins ça te donne des pistes pour l'écriture d'algos récursifs

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 137
    Points : 92
    Points
    92
    Par défaut merci de vos réponses
    @stealth35:
    Effectivement c'est mon code actuel et il compte 350 ligne car mes embranchements de comptes comptables ont une profondeur de 4 ex: (1 - actif / 10 actif circulant / 100 Actifs circulant disponibles / 1000 caisse). Je voulais simplement essayer de faire une fonction automatique parcourant le tout.

    @Benjamin Delespierres:
    J'ai réussi à faire fonctionner ma function mettre l'instruction de PDO pour se connecter à l'intérieur était pas très judicieux. Après étude de ton code il me reste juste quelques questions.
    ! est un opérateur "NON logique", je comprend pas comment cette condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (!$pdo)
            throw new RuntimeException("Expecting a valid PDO instance");
    peut determiner si on a une instance PDO valide ? (un lien sur un cours ou un tuto me convient aussi parfaitement car j'ai pas trouvé).

    ou si j'ai compris il teste juste que l'instruction ne soit pas vide et avec le runtimeexception il crée une "Exception émise quand une erreur est rencontrée durant l'exécution." et il retournera faux avec un nom d'erreur E__USER_WARNING ?

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    En réalité on aurait pu se passer de cette vérification car $pdo ne peut pas être NULL (ça aurait été le cas si on avait mis PDO $pdo = NULL).
    Il faut également savoir qu'un instance de classe (un objet) est toujours évalué à true dans une expression booléene, peu importe ce qu'il contiens. Il en va de même pour les ressources.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 137
    Points : 92
    Points
    92
    Par défaut
    merci.

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

Discussions similaires

  1. fonction trés longue
    Par el-bey2 dans le forum Mathématiques - Sciences
    Réponses: 1
    Dernier message: 23/05/2011, 07h36
  2. Réponses: 2
    Dernier message: 07/02/2007, 18h31
  3. Réponses: 4
    Dernier message: 09/12/2005, 08h25
  4. Comment écrire une très longue variable dans un fichier ?
    Par hijodelanoche dans le forum Langage
    Réponses: 8
    Dernier message: 17/11/2005, 16h12
  5. Acquisition longue, très longue...
    Par pc.bertineau dans le forum Windows
    Réponses: 3
    Dernier message: 24/02/2005, 13h54

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