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

Langage PHP Discussion :

function avec récursivité


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut function avec récursivité
    Bonsoir, bonsoir,

    J'ai un petit soucis avec une function dans laquel en cas d'erreur on relance la procédure, cependant de cette récursivité émane une erreur 500 et je ne comprends pas pourquoi.

    l'erreur se produit lorsque : $get_tinyurl est égal à une entrée existante dans la BDD; on tombe donc sur le "IF" correspondant à la ligne 67.

    Merci de votre aide.
    Bonne soiré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
     
    			<?php
     
    function generatkey($nbcaract){
        $word = "a,b,c,d,e,f,g,h,i,j,k,l,m,1,2,3,4,5,6,7,8,9,0";  
        $array=explode(",",$word);  
        shuffle($array);  
        $newstring = implode($array,"");  
        return substr($newstring, 0, $nbcaract);  
    }
    function Verif_tinyurl($tinyurl,$url,$ip,$browser,$date){
    	$bool_ok = false;
    	if (($tinyurl <> '') && ($url <> '') && ($ip <> '') && ($browser <> '') && ($date <> '')) {
    		require_once("/app_code/dal_sql.php");
    		$bool_exist_tiny = false;
    		$sql_SELECT1="SELECT tinyurl_tinyurl FROM ws_tinyurl WHERE tinyurl_tinyurl='".$tinyurl."'";
    		//echo 'DEBUG : '.$sql_SELECT1.'<br/>';
    		try {
    			$sql_EXECUTE1 = $pdo->prepare($sql_SELECT1);
    			$sql_EXECUTE1->execute();
    			$nbrows = $sql_EXECUTE1->rowcount();
     
    			while ($row = $sql_EXECUTE1->fetch()) {
    				if($row[0] = $tinyurl){$bool_exist_tiny = true; }
    			}
    		}
    		catch (Exception $e){
    			$msg = '<p>ERREUR PDO : ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage()."</p>";
    			echo $msg;
    		}
     
    		$bool_exist_url = false;
    		$sql_SELECT2="SELECT url_tinyurl FROM ws_tinyurl WHERE url_tinyurl='".$url."'";
    		//echo 'DEBUG : '.$sql_SELECT2.'<br/>';
    		try {
    			$sql_EXECUTE2 = $pdo->prepare($sql_SELECT2);
    			$sql_EXECUTE2->execute();
    			$nbrows = $sql_EXECUTE2->rowcount();
     
    			while ($row = $sql_EXECUTE2->fetch()) {
    				if($row[0] = $url){$bool_exist_url = true;}
    			}
    		}
    		catch (Exception $e){
    			$msg = '<p>ERREUR PDO : ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage()."</p>";
    			echo $msg;
    		}
     
    		if ((!$bool_exist_tiny) && (!$bool_exist_url)){
    			$sql_INSERT="INSERT INTO ws_tinyurl (tinyurl_tinyurl,url_tinyurl,user_ip_tinyurl,user_browser_tinyurl,date_crea_tinyurl) VALUES (?,?,?,?,?)";
    			$add_parameter=array($tinyurl,$url,$ip,$browser,$date);
    			try {
    				$sql_EXECUTE = $pdo->prepare($sql_INSERT);
    				$sql_EXECUTE->execute($add_parameter);
    				$nbrows = $sql_EXECUTE->rowcount();
    				$bool_ok = true;
    				$msg = 'votre miniurl : '.$tinyurl.'<br/>';
    				echo $msg;
    				$bool_ok = true;
    			}
    			catch (Exception $e){
    				$msg = '<p>ERREUR PDO : ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage().'</p>';
    				echo $msg;
    			}
    		}
    		else{
    			if ($bool_exist_tiny){
    				$g_tinyurl =  generatkey(8);
    				Verif_tinyurl($g_tinyurl,$url,$ip,$browser,$date);
    			}
    			if ($bool_exist_url){
    				$msg = '<p>l\'url ('.$url.') est déjà enregistré</p>';
    				echo $msg;
    			}			
    		}
    	}
    	else{echo 'DEBUG tiny : '.$tinyurl.'<br/> url : '.$url.'<br/> ip : '.$ip.'<br/> browser : '.$browser.'<br/> date : '.$date.'<br/>';}
     
    	return $bool_ok;
    }
     
    $ip = $_SERVER['REMOTE_ADDR'];
    $browser = $_SERVER['HTTP_USER_AGENT'];
    $date = date("Y-m-d H:i:s");
    $get_url = 'MONURL';
    $get_tinyurl = 'TINYURL'; //generatkey(6);
    if (Verif_tinyurl($get_tinyurl,$get_url,$ip,$browser,$date)) {
    	echo '<br/>OK<br/>';
    }
    else {
    	echo '<br/>PAS OK<br/>';
    }
     
    ?>

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    il y a quelque chose que je ne comprend pas dans le fonctionnement du code : quand l'URL indiqué a déjà une version raccourcie, la fonction cherche à créer un autre raccourci pour ce même URL ?

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 26
    Points : 43
    Points
    43
    Par défaut
    Sans regarder en détail ton code, il est possible que tu tournes en boucle indéfiniment en retombant toujours dans le IF générant une erreur 500 du serveur à la fin (crach mémoire ou autre ?)
    Construction d'une piscine : http://www.construire-sa-piscine.com
    Livraison de fleurs pour particulier : http://www.fleurs-en-gros.com

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut
    @mathieu, oui je sais il manque des "!$bool", je suis en phase de test, je n'ai donc pas encore mis ces conditions, vue que je contrôle les entrées ^^.
    et ce n'est pas ça qui cause l'erreur 500, car même en mettant les exceptions l'erreur est toujours là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (($bool_exist_tiny) && (!$bool_exist_url)){
    	$g_tinyurl =  generatkey(8);
    	Verif_tinyurl($g_tinyurl,$url,$ip,$browser,$date);
    	return Verif_tinyurl($g_tinyurl,$url,$ip,$browser,$date);
    }
    if (($bool_exist_url) && (!$bool_exist_tiny)){
    	$msg = '<p>l\'url ('.$url.') est déjà enregistré</p>';
    	echo $msg;
    	return $bool_ok;
    }
    @franckm1000, je sais bien que c'est une cause possible cependant je ne vois pas comment la boucle infinie pourrait être produite.

  5. #5
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 26
    Points : 43
    Points
    43
    Par défaut
    vue que je contrôle les entrées ^^.
    Tu ne contrôles pas grand chose à vrai dire...

    Ces deux conditions sont toujours vérifiées (il faut remplacer par ==)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if($row[0] = $url){$bool_exist_url = true;}
    if($row[0] = $tinyurl){$bool_exist_tiny = true; }
    -> Donc $bool_exist_url et $bool_exist_tiny sont toujours vrai.

    -> Donc tu passes TOUJOURS dans le else

    -> Donc tu relances Verif_tinyurl()

    -> Donc tu boucles indéfiniment

    -> Donc tu finis en erreur 500
    Construction d'une piscine : http://www.construire-sa-piscine.com
    Livraison de fleurs pour particulier : http://www.fleurs-en-gros.com

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par franckm1000 Voir le message
    Tu ne contrôles pas grand chose à vrai dire...
    ... vue que j'initialise les variables en fonction de ce qu'il y'a en BDD, je contrôle l'entrée ... enfin bon ^^

    Citation Envoyé par franckm1000 Voir le message
    Ces deux conditions sont toujours vérifiées (il faut remplacer par ==)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if($row[0] = $url){$bool_exist_url = true;}
    if($row[0] = $tinyurl){$bool_exist_tiny = true; }
    -> Donc $bool_exist_url et $bool_exist_tiny sont toujours vrai.

    -> Donc tu passes TOUJOURS dans le else
    ok pour le double "=", mais s'il n'y a aucune entrée sql je ne vois pas comment ($row[0] = $url) et ($row[0] = $tinyurl) peuvent toujours vrai ?

  7. #7
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 26
    Points : 43
    Points
    43
    Par défaut
    Par ce que dire que x = des pommes ou des poires ou rien ou ce que tu veux est toujours vrai...

    Si tu dis tinyurl = rien... eh ben OK c'est que c'est vrai !

    La comparaison entre 2 variables (qu'elles soient vides ou pas) se fera toujours sur le ==

    Vérifies simplement en faisant un echo, tu verras que ta variable $bool_exist_url renverra toujours 1

    Note :
    Si j'ai bien compris, tu veux tester l'existence d'une ligne pour une URL dans la table.
    je suis pas sûr de ton $row[0]. Ce serait pas plutôt $row['tinyurl_tinyurl'] ?
    Sinon, tu pourrais simplement tester si la requête t'as ramené au moins un résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if($sql_EXECUTE1->rowCount() > 0){
    //J'ai bien une ligne dans ma table...
    }
    Construction d'une piscine : http://www.construire-sa-piscine.com
    Livraison de fleurs pour particulier : http://www.fleurs-en-gros.com

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut
    Merci pour les précisions.

    Effectivement "count" est bien plus approprié au vue de l'utilisation que j'ai.

    j'ai donc corrigé le script suivant tes instrcutions, cependant j'ai toujours une erreur 500, lorsque que la fonction est ré-exécuté , alors que le bug me retourne se que je souhaite ...

    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
    function fct_tinyurl($tinyurl,$url,$ip,$browser,$date){
    	$bool_ok = false;
    	$bool_exist_url = false;
    	$bool_exist_tiny = false;
    	if (($tinyurl <> '') && ($url <> '') && ($ip <> '') && ($browser <> '') && ($date <> '')) {
    		require_once("/app_code/dal_sql.php");
     
    		// Verif l'existance de tinyurl
    		$sql_SELECT1="SELECT tinyurl_tinyurl FROM ws_tinyurl WHERE tinyurl_tinyurl='".$tinyurl."'";
    		//echo 'DEBUG : '.$sql_SELECT1.'<br/>';
    		try {
    			$sql_EXECUTE1 = $pdo->prepare($sql_SELECT1);
    			$sql_EXECUTE1->execute();
    			if(($sql_EXECUTE1->rowCount()) > 0){$bool_exist_tiny = true;}
    			// DEB DEBUG : ----------------------------
    			echo 'DEBUG : bool_tiny : ';
    			var_dump($bool_exist_tiny);
    			echo '<br/>';
    			// FIN DEBUG : ----------------------------
    		}
    		catch (Exception $e){
    			echo '<p>ERREUR PDO : ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage()."</p>";
    		}
     
    		// Verif l'existance de l'url
    		$sql_SELECT2="SELECT url_tinyurl FROM ws_tinyurl WHERE url_tinyurl='".$url."'";
    		//echo 'DEBUG : '.$sql_SELECT2.'<br/>';
    		try {
    			$sql_EXECUTE2 = $pdo->prepare($sql_SELECT2);
    			$sql_EXECUTE2->execute();
    			if(($sql_EXECUTE2->rowCount()) > 0){$bool_exist_url = true;}
    			// DEB DEBUG : ----------------------------
    			echo 'DEBUG : bool_url : ';
    			var_dump($bool_exist_url);
    			echo '<br/>';
    			// FIN DEBUG : ----------------------------
    		}
    		catch (Exception $e){
    			echo '<p>ERREUR PDO : ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage()."</p>";
    		}
     
    		if ((!$bool_exist_tiny) && (!$bool_exist_url)){
    			// Si tiny et url n'existe pas INSERT
    			$sql_INSERT="INSERT INTO ws_tinyurl (tinyurl_tinyurl,url_tinyurl,user_ip_tinyurl,user_browser_tinyurl,date_crea_tinyurl) VALUES (?,?,?,?,?)";
    			$add_parameter=array($tinyurl,$url,$ip,$browser,$date);
    			try {
    				$sql_EXECUTE3 = $pdo->prepare($sql_INSERT);
    				$sql_EXECUTE3->execute($add_parameter);
    				if (($sql_EXECUTE3->rowcount()) == 1){
    					$bool_ok = true;
    					echo 'votre miniurl : '.$tinyurl.'<br/>';
    				}
    			}
    			catch (Exception $e){
    				echo '<p>ERREUR PDO : ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage().'</p>';
    			}
    		}
    		else{
    			if (($bool_exist_tiny) && (!$bool_exist_url)){
    				// Si tiny existe et url n'existe pas on relance la boucle avec une nouvelle entrée tiny
    				$g_tinyurl =  generatkey(8);
    				fct_tinyurl($g_tinyurl,$url,$ip,$browser,$date);
    				// DEB DEBUG : ----------------------------
    				echo 'DEBUG : (';
    				var_dump($bool_exist_tiny);
    				echo ') && (';
    				var_dump(!$bool_exist_url);
    				echo ')<br/>';
    				// FIN DEBUG : ----------------------------
    			}
    			if ((!$bool_exist_tiny) && ($bool_exist_url)){
    				// Si tiny n'existe pas et url existe : MSG_ERROR
    				echo '<p>l\'url ('.$url.') est déjà enregistré</p>';			
    			}	
    			if (($bool_exist_tiny) && ($bool_exist_url)){
    				// Si tiny existe et url existe : MSG_ERROR
    				echo "le couple url : (".$url.") -> tiny : (".$tinyurl.") existe déjà";
    			}
    		}
    	}
    	else{echo 'DEBUG tiny : '.$tinyurl.'<br/> url : '.$url.'<br/> ip : '.$ip.'<br/> browser : '.$browser.'<br/> date : '.$date.'<br/>';}
     
    	return $bool_ok;
    }
    DEBUG : bool_tiny : bool(true)
    DEBUG : bool_url : bool(false)
    DEBUG : (bool(true) ) && (bool(true))

  9. #9
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 26
    Points : 43
    Points
    43
    Par défaut
    En local (sans faire les requêtes) ton script donne ça:
    Nom : Capture.JPG
Affichages : 70
Taille : 13,8 Ko

    Donc ça semble cohérent.
    Tu as la fonction generatkey($pNombre) ? Il y a peut être un problème sur cette méthode qui ferait qu'au deuxième passage $bool_exist_tiny reste à true.
    Construction d'une piscine : http://www.construire-sa-piscine.com
    Livraison de fleurs pour particulier : http://www.fleurs-en-gros.com

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Points : 63
    Points
    63
    Par défaut
    Bon j'ai identifié le problème cela viendrais de mon "require_once("/app_code/dal_sql.php");" ... si je l'inclus le fichier directement dans la page je n'ai pu d'erreur 500...
    Je ne comprends pas pourquoi il est refusé lors du bouclage alors qu'il fonctionne très bien, de plus j'ai toujours l'erreur même si je le met hors de la fonction.

    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
     
    define("_LOGIN_","MON_LOGIN");
    define("_PASSWD_","MON_PWD");
    define("_SERVERHOST_","MON_IP");
    define("_BDD_","MA_BDD");
     
    try {
        $strConnection = 'mysql:host='._SERVERHOST_.';dbname='._BDD_;
        $arrExtraParam= array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
        $pdo = new PDO($strConnection, _LOGIN_, _PASSWD_,$arrExtraParam);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }
    catch(PDOException $e) {
        die('<p>ERREUR PDO : ' . $e->getFile() . ' L.' . $e->getLine() . ' : ' . $e->getMessage()."</p>");
    }
     
    ?>

Discussions similaires

  1. [AJAX] erreur: is not a function avec liste déroulante
    Par dr_octopus74 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/04/2007, 13h53
  2. Function avec variable method
    Par BATiViR dans le forum Delphi
    Réponses: 8
    Dernier message: 20/04/2007, 10h22
  3. Function avec paramètre optionnel
    Par Poussy-Puce dans le forum ASP
    Réponses: 3
    Dernier message: 22/12/2006, 18h53
  4. [phpBB] Function avec le Template phpBB
    Par mangafan dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 27/09/2005, 16h32
  5. function avec paramentre
    Par nicocsgamer dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/09/2005, 09h31

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