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 récursive


Sujet :

PHP & Base de données

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Février 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 1
    Par défaut Fonction récursive
    Salut ,
    J’ai crée une fonction récursive en php qui fait le calcul de nombre d’heures passées sur une tache sachant que chaque tache peut avoir 0 ou plusieurs sous taches.
    En fait, J’ai 2 tables une pour les taches s’appelle ’tasks’ (colonnes : task_id,task_parent) et la deuxième ‘task_log’ là où on a fait l’enregistrement de nombre d’heures passées sur chaque tache (colonne :task_log_task, task_log_hours)
    task_log_task c’est le clé primaire de la table tasks.
    Mon soucis c’est quand j’ai intégré cette fonction dans ma classe (php) les deux clauses ‘else’, et plus précisément l’appelle de la fonction dans ces clauses, ne fonctionne pas,pourtant je l’ai testé ailleurs et elle fonctionne bien
    Je pense que la variable $nbh ne s’incrémente pas mais je ne sais pas pourquoi .
    Pourriez-vous m’aider ?


    PS : j’ouvrais la connexion dans la fonction main() , puis je faisais l’appelle au fonction CalculNH()


    Merci à vous de votre Précieuse aide

    J'utilise php5 et mysql5.

    voila le code:
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Par défaut
    Bonjour,

    Je ne sait pas si c'est ca, maisil y a quelques erreurs de syntaxe.

    Dans ton premier else tu utilise un mysql_fetch_array() et tu exploite le résultat de la forme $array['clé'] au lieu de $array[indice]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $resultat2=mysql_fetch_array($rs_calcul2);
    $nbh=$resultat2['somme_heure'];
    Correction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $resultat2=mysql_fetch_assoc($rs_calcul2);
    $nbh=$resultat2['somme_heure'];
    Tiens moi au jus !

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,
    Je n'ai pas eu le temps de voir le fichier attacher, mais le mieux c'est que tu nous montres le petit bout de code concerné.
    @firehist: Sans la deuxième paramètre , mysql_fetch_array retourne un tableau associatif et indexé donc son code est juste.

  4. #4
    Membre expérimenté Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Par défaut
    @ andry.aime
    mysql_fetch_array retourne un tableau indicé de 0 à x, à part si le second paramètre est MYSQL_ASSOC
    Or dans son code (qui est le fichier attaché) il vient prendre des valeurs de type $tableau["Valeur_champ_sql"]
    Donc je persiste à dire que je trouve là une ch'tite erreur de syntaxe...


    Ce qui pour moi explique le mauvais retour de ta fonction récursive en bout de branche quand tu écrit le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $resultat=mysql_fetch_array($rs_calcul);
    $nbh=$resultat['somme_heure'];
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $resultat2=mysql_fetch_array($rs_calcul2);
    $nbh=$resultat2['somme_heure'];
    J'espère bien me tromper.
    Si tu as d'autres pistes, à part sa pour moi, ta récursivité est correct.

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par firehist
    J'espère bien me tromper.
    Je pense que oui.

    La réponse est du coté de la doc, du paramètre 'result_type' :
    Citation Envoyé par doc php
    result_type
    Le type de tableau à récupérer. C'est une constante qui peut prendre les valeurs suivantes : MYSQL_ASSOC , MYSQL_NUM , et la valeur par défaut est MYSQL_BOTH .
    Par défaut c'est MYSQL_BOTH, donc on peut utilisier les 2 : Un index ou un nom.
    La doc :

    array mysql_fetch_array ( resource result , int result_type )

    mysql_fetch_array retourne un tableau qui contient la ligne demandée dans le résultat result et déplace le pointeur de données interne d'un cran.

    result
    La ressource de résultat qui vient d'être évaluée. Ce résultat vient de l'appel à la fonction mysql_query .

    result_type
    Le type de tableau à récupérer. C'est une constante qui peut prendre les valeurs suivantes : MYSQL_ASSOC , MYSQL_NUM , et la valeur par défaut est MYSQL_BOTH .

    Retourne un tableau qui correspond à la ligne récupérée ou FALSE s'il n'y a plus de lignes. Le type de tableau retourné depend de la définition du paramètre result_type . En utilisant MYSQL_BOTH (défaut), vous récupèrerez un tableau contenant des indices associatifs et numériques. En utilisant MYSQL_ASSOC , vous ne récupèrerez que les indices associatifs (comme le fonctionnement de la fonction mysql_fetch_assoc ), en utilisant MYSQL_NUM , vous ne récupèrerez que les indices numériques (comme le fonctionnement de la fonction mysql_fetch_row ).

    Si plusieurs colonnes portent le même nom, la dernière colonne aura la priorité. Pour accéder aux autres colonnes du même nom, vous devez utiliser l'index numérique, ou faire un alias pour chaque colonne. Pour les alias de colonnes, vous ne pourrez pas accéder aux contenus avec les noms originaux des colonnes.

    Requête avec duplication de nom de colonnes


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT table1.field AS foo, table2.field AS bar FROM table1, table2
    mysql_fetch_array avec MYSQL_NUM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    mysql_connect("localhost", "mysql_user", "mysql_password") or
    die("Impossible de se connecter : " . mysql_error());
    mysql_select_db("mydb");
     
    $result = mysql_query("SELECT id, name FROM mytable");
     
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
       printf("ID : %s  Nom : %s", $row[0], $row[1]);
    }
     
    mysql_free_result($result);
    ?>
    mysql_fetch_array avec MYSQL_ASSOC
    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
     
     
    <?php
    mysql_connect("localhost", "mysql_user", "mysql_password") or
    die("Impossible de se connecter : " . mysql_error());
    mysql_select_db("mydb");
     
    $result = mysql_query("SELECT id, name FROM mytable");
     
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
       printf("ID : %s  Nom : %s", $row["id"], $row["name"]);
    }
     
    mysql_free_result($result);
    ?>
    mysql_fetch_array avec MYSQL_BOTH

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    mysql_connect("localhost", "mysql_user", "mysql_password") or
    die("Impossible de se connecter : " . mysql_error());
    mysql_select_db("mydb");
     
    $result = mysql_query("SELECT id, name FROM mytable");
     
    while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
       printf ("ID : %s  Nom : %s", $row[0], $row["name"]);
    }
     
    mysql_free_result($result);
    ?>
    Note
    Performance

    Une chose importante à noter est que l'utilisation de mysql_fetch_array n'est pas significativement plus lent que l'utilisation de mysql_fetch_row , alors qu'il fournit des valeurs significatives ajoutées.
    Note

    Les noms des champs retournés par cette fonction sont sensibles à la casse .

    Je n'ai pas vraiment tout bien bien suivi pour cette fonction récursive, pas très bien compris en faite.
    Mais concernant la connexion de la Bdd, du $link plus particulièrement, tu pourrais peut être rendre cette variable global, ce qui éviterait de la "passer" en paramètre, et même de refaire une connexion dans la fonction.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function CalculNH($id_task) {
    	global $mylink
     
    }
    PS : j’ai besoin d’ouvrir la connexion au début de la fonction puisque la classe est déjà connectée à une autre base.
    Si les 2 Bdd sont sur le même serveur, normalement ce n'est pas utile, par contre, faudrait préciser dans la requête la base concernée.
    Exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Une 1ère requête :
    SELECT champ FROM base1.tableTruc ...
     
    // Une 2ème requête juste après, avec la même connexion
    SELECT champ FROM base2.tableMachin ...
    Ou alors, suffit juste d'utiliser mysql_select_db() pour préciser la Bdd concernée en "passant" le $mylink.

  6. #6
    Membre expérimenté Avatar de firehist
    Homme Profil pro
    Intégrateur Web Freelance
    Inscrit en
    Février 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur Web Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 151
    Par défaut
    @RunCodePhp
    Merci, j'avais pas lu entièrement la doc, pr moi assoc c'était uniquement indicé avec le nom des attributs et array pour les indices entiers

    Je vous laisse à la correction de ce post alors.

Discussions similaires

  1. fonction récursive: erreur
    Par calla29 dans le forum Débuter
    Réponses: 3
    Dernier message: 16/05/2006, 11h51
  2. [VB6] XML, fonction récursive de recherche
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/04/2006, 21h27
  3. [XSLT] fonction récursive à N niveaux
    Par Mike35 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/03/2006, 12h30
  4. Fonction récursive renvoi sur page d'erreur
    Par peck dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2005, 10h08
  5. Problème de fonction récursive avec un TcxDBTreeList
    Par isachat666 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/12/2005, 13h12

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