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
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Fonction récursive
    Bonjour à tous,

    Je fais appel à vous pour la première fois directement car je sèche vraiment et que je dois trouver une solution très rapidement.

    Voici mon pb :

    Je réalise une application flash avec une passerelle PHP pour accéder à ma BDD nommé AMFPHP. J'ai donc une classe PHP qui fonctionne trés bien avec plusieurs fonctions dedans sans pb.

    J'ai dû rajouter une fonction récursive en plus qui a pour but de générer un login et un pwd automatiquement et d'en faire un nouveau dans le cas où il existe déjà. Le pb est que dès que la récursivité s'enclenche ($this->generateLog($log2) ça me retourne null.

    Voici le code qui va plus vous parler :
    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
    function generateLogPwd($nom, $prenom, $date) {
    		$log=strtolower(substr($prenom, 0, 1).$nom);
    		$pwd=strtolower($prenom.$date);
    		$logGenerate=$this->generateLog($log);
    		$tab=array(login=>$logGenerate, pwd=>$pwd);
    		return $tab;
    	}
    	function generateLog($log2) {
    		static $nb=0;
    		$sql=mysql_query('SELECT login FROM member WHERE login="'.$log2.'"');
    		if(!mysql_num_rows($sql)){
    			return $log2;
    		}else{
    			$nb2++;
    			$log2=$log2.$nb2;
    			$this->generateLog($log2);
    		}
    	}
    Merci d'avance pour vos réponses.

    Stéphane.

  2. #2
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function generateLog($log2) {
    		static $nb=0;
    		$sql=mysql_query('SELECT login FROM member WHERE login="'.$log2.'"');
    		if(!mysql_num_rows($sql)){
    			return $log2;
    		}else{
    			$nb2++;
    			$log2=$log2.$nb2;
    			$this->generateLog($log2);
    		}
    	}
    Est-ce normal que tu aies $nb2 au lieu de $nb ?

    Cordialement.
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  3. #3
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Bonjour,


    Tout d'abord il vaudrait mieux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql=mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    $result = mysql_fetch_array($sql);
    	if($result['nb'] == 0){
    Ensuite, tu incrémente $nb2 dans ton else alors que c'est $nb que tu as déclaré plus haut. :/
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Tout d'abord merci pour vos réponses.

    J'ai fait les modifs selon vos dires mais rien de mieux.

    Je pense que le pb vient plutôt de la définition de la récursivité dans le else de generateLog.

    Voici le nouveau code :
    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
    function generateLogPwd($nom, $prenom, $date) {
    		$date=str_replace("/", "", $date);
    		$log=strtolower(substr($prenom, 0, 1).$nom);
    		$pwd=strtolower($prenom.$date);
    		$logGenerate=$this->generateLog($log);
    		$tab=array(login=>$logGenerate, pwd=>$pwd);
    		return $tab;
    	}
    	function generateLog($log2) {
    		static $nb2=0;
    		$sql=mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    		$result = mysql_fetch_array($sql);
    		if($result['nb'] == 0){
    			return $log2;
    		}else{
    			$nb2++;
    			$log2=$log2.$nb2;
    			$this->generateLog($log2);
    		}
    	}

  5. #5
    Membre confirmé Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Points : 576
    Points
    576
    Par défaut
    Salut,
    Il faudrait que tu nous donne le résultat de la fonction pour mieux déterminer le pb...
    Mais essaye ca :
    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 generateLogPwd($nom, $prenom, $date) {
    		$date=str_replace("/", "", $date);
    		$log=strtolower(substr($prenom, 0, 1).$nom);
     		$pwd=strtolower($prenom.$date);
    		$logGenerate=$this->generateLog($log);
    		$tab=array(login=>$logGenerate, pwd=>$pwd);
    		return $tab;
    	}
    function generateLog($log2,$nb2=0) {
     
    		$sql=mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    		//$result = mysql_fetch_array($sql);
    		$result=mysql_count_rows($sql);
                    if($result != 0){
    			return $log2;
    		}else{
    			$nb2++;
    			$log2=$log2.$nb2;
    			$this->generateLog($log2, $nb2);
    		}
    	}
    A voir, car sans avoir le resultat c pas simple...

    Guigo

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse.

    J'ai mis le résultat que cela me renvoyé.

    Lorsque dans la fonction récursive je passe dans le if il n'y a pas de pb mais lorsque je passe dans le else (que le login existe déjà) là ça me renvoie null au lieu de rajouter le chiffre $nb au bout du login déjà existant et de réessayer voir si il existe également.

    N.B. : mysql_count_rows n'existe pas !

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Même résultat avec ça :
    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 Tuteur {
    function Tuteur(){
    		include ("../includes/config.php");
    		$logAll="";
    	}
    function generateLog($log2,$nb2=0) {
    		$sql=mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    		$result = mysql_fetch_array($sql);
    		if($result['nb'] == 0){
    			$logAll=$log2;
    			return $logAll; //retourne (null) si il est passé une fois dans le else avant, et renvoi bien $log2 si il n'y passe pas
    		}else{
    			$nb2++;
    			$log2=$log2.$nb2;
    			$logAll=$this->generateLog($log2, $nb2);
    		}
    	}
    }

  8. #8
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Salut,

    Essaye ça, en mettant $nb2 dans l'autre méthode, car là, elle se remettait à 0 toute seule ...
    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 generateLogPwd($nom, $prenom, $date) {
                    static $nb2 = 0;
    		$log=strtolower(substr($prenom, 0, 1).$nom);
    		$pwd=strtolower($prenom.$date);
    		$logGenerate=$this->generateLog($log);
    		$tab=array(login=>$logGenerate, pwd=>$pwd);
    		return $tab;
    	}
     
     
    function generateLog($log2) {
    		$sql=mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    		$result = mysql_fetch_array($sql);
    		if($result['nb'] == 0){
    			return $log2; 
    		}else{
    			$nb2++;
    			$log2=$log2.$nb2;
    			$this->generateLog($log2);
    		}
    	}
    }
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Désolé même chose.

    Mais même quand je lance la fonction récursive seule ça me renvoie null si elle passe dans le else.

    Je détail un peu plus le but de ma fonction au cas où.

    J'envoie un login en argument, si celui là n'existe pas je le retourne sans modification.
    ex : $log2 = "logexistepas", il existe pas dans la bdd je le retourne sans modifs

    Si le login existe déjà je veux rajouter un chiffre à la suite et je regarde une nouvelle fois si ce nouveau login existe. Et ainsi de suite jusqu'à en trouver un qui n'existe pas.
    ex : $log2 = "user", il existe (donc passage dans le else), je rajoute $nb qui me donne $log2 = "user1" et je relance la vérification.
    C'est à ce moment je pense que l'argument $log2 devient null ou vide et donc repasse sans pb dans le if et me renvoie un champ vide ou null.

    J'ai essayé d'être plus clair mais je suis pas sûr d'y être arrivé

  10. #10
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Si si c'était clair ne t'inquiètes pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function generateLog($log2) {
    		$sql=mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    		$result = mysql_fetch_array($sql);
    		if($result['nb'] == 0){
    			return $log2; 
    		}else{
    			$nb2++;
                            echo $nb2;
    			$log2=$log2.$nb2;
                            echo $log2;
    			//$this->generateLog($log2);
    		}
    	}
    }
    Si tu mets un echo $nb2 et un echo $log2, ça vaut quoi ?

    Puis en décommentant ...
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je ne peux pas utiliser les echo avec AMFPHP j'ai donc fait ceci :

    essai 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function generateLog($log2) {
    		$sql=mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    		$result = mysql_fetch_array($sql);
    		if($result['nb'] == 0){
    			return $log2; 
    		}else{
    			$nb2++;
    			$log2=$log2.$nb2;
    			return $log2;
    			//$this->generateLog($log2);
    		}
    	}
    ça m'a bien retourné le login avec la bonne modif que je veux

    essai 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function generateLog($log2) {
    		$sql=mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    		$result = mysql_fetch_array($sql);
    		if($result['nb'] == 0){
    			return $log2; 
    		}else{
    			$nb2++;
    			$log2=$log2.$nb2;
    			//return $log2;
    			$this->generateLog($log2);
    		}
    	}
    Le grand retour de (null) !

    J'ai l'impression que la fonction ne se relance pas et donc qu'elle n'est pas récursive !

  12. #12
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Essaye comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $result = mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    $num_rows = mysql_num_rows($result);
     
    if($num_rows == 0)
    {
         ....
    }
    else
    {
         ....
    }
    De plus, peux-tu mettre une trace dans ton SGBD afin de voir ce que vaut log2 dans ta requête. D'ailleurs, sous quel SGBD travailles-tu ?

    Cdlt.
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je travaille avec MySQL mais malheureursement je n'ai pas accès à la bdd, mon client ne m'a pas transmis les accès car je n'en ai pas besoin normalement.

    J'ai tester la même fonction récursive (de toutes les façon que l'on a évoqué sans la bdd bien sûr) avec un fichier php bidon sur ma machine et je n'ai eu aucun pb à ce qu'elle fonctionne. Par contre je n'ai pas réussi en l'intégrant dans une classe PHP et don en utilisant le $this->.

  14. #14
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    Et si tu l'enlèves ? ou ?
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Voilà ce que j'ai réussi à faire :
    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
     
    function generateLogPwd($nom, $prenom, $date) {
    		$date=str_replace("/", "", $date);
    		$log=strtolower(substr($prenom, 0, 1).$nom);
    		$pwd=strtolower($prenom.$date);
    		$nb=0;
    		$logGenerate=$this->generateLog($log, $nb);
    		$tab=array(login=>$logGenerate, pwd=>$pwd);
    		return $tab;
    	}
    	function generateLog($log2, $nb2) {
    		$sql=mysql_query('SELECT COUNT(login) as nb FROM member WHERE login="'.$log2.'"');
    		$result = mysql_fetch_array($sql);
    		if($result['nb'] == 0){
    			return $log2; 
    		}else{
    			$nb2++;
    			//$log2=$log2.$nb2;
    			$log2=$this->generateLog($log2.$nb2, $nb2);
    			return $log2;
    		}
    	}
    Ca marche si on relance la fonction 1 fois par contre je ne sait pas si ça marche quand elle est relancé plusieurs fois.

  16. #16
    Membre averti Avatar de binouzzz19
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    385
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 385
    Points : 368
    Points
    368
    Par défaut
    C'est déjà pas mal, c'est qu'on avance ^^ ! Tiens nous au courant.
    Si ton labeur est dur et que tes résultats sont minces, rappelles-toi qu'un jour, le grand chêne a été un gland comme toi !

  17. #17
    Membre confirmé Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Points : 576
    Points
    576
    Par défaut
    Toute mes excuses pour la fct je parlais de celle ci :
    mysql_num_rows
    C'est un peu plus propre... Si tu as un résultat (quelqu'il soit) alors ça veut dire que le log exist..

    Je penses que ca devrait marcher...
    Tente des insertions dans ta BDD si tu peux avec une suite de log ex
    gui
    gui1
    gui2

    ... Tu vas voir tout de suite si la recursivité fonctionne comme tu veux

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