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 :

[PHP 5.3] Fonction récursive et connexion


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Par défaut [PHP 5.3] Fonction récursive et connexion
    Bonjour,

    j'utilise une fonction récursive (Permet de générer aléatoirement un nom de fichier, puis vérifie si il existe déjà en BDD):

    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
    function random_name($fileName) {
     
        // Récupère l'extention du fichier
        $pos = strrpos($fileName, '.');
        $ext = strtolower(substr($fileName, $pos));;
     
        // Génère un fileName aléatoire
        $fileName_random = "";
        $len = rand(1,11);
        $str= "abcdefghijklmnopqrstuvwxyz";
        for($i=0;$i<$len;$i++)
        {
            switch(rand(1,2)){
                case 1: $fileName_random.= $str[rand(0,25)];
                case 2: $fileName_random.= rand(0,9);
    		}
        }
     
        // Replace l'extention du fichier
        $fichier = $fileName_random.$ext;
     
        // Vérifie si le nom de fichier n'existe pas déjà
        $query = $GLOBALS['db']->prepare("select fileName from image where fileName = :fichier limit 1");
        $query->bindParam(':fichier', $fichier, PDO::PARAM_STR);
        $query->execute();
        $row = $query->fetchAll();
        $query= null;
     
        // return
        if (count($row) > 0){
            return random_name($fileName);
        } else {
            return $fichier;
       }
    }
    Lorsque je l'utilise, mon navigateur plante :
    • La connexion a été réinitialisée (pour Firefox)
    • Erreur 101 (net::ERR_CONNECTION_RESET) : Erreur inconnue (pour Google Chrome)


    J'ai 3800 entrées en BDD, donc la fonction s'arrête bien à un moment.
    Si j'enlève la récursivité, le code fonctionne.
    Si j'enlève la requête SQL, le code fonctionne.
    Voici ma connexion dans mon fichier de config appelé plus haut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $dbhost = 'localhost';
    $dbuser = 'xxx';
    $dbpass = 'xxx';
    $dbname = 'xxx';
    try{
    	$sqlPDO = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass);
    	$sqlPDO->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
    	$sqlPDO->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
    } catch(PDOException $e){
    	//echo 'Erreur : '.$e->getMessage().'<br /><br />';
    	die("Une erreur est survenue, le site est temporairement indisponible");
    }
    $GLOBALS['db'] = $sqlPDO;
    J'ai également tenté de mettre $sqlPDO en paramètre de la fonction récursive, même souci.

    Merci de votre aide, j'espère que l'erreur n'est pas trop idiote

    Merci

    Edit : je souhaiterai ajouter que si vous n'avez pas la réponse, n'hésitez pas à me proposer des tests pour mieux cibler le problème.
    Je travail sous WAMP en Local.

  2. #2
    Membre Expert Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Par défaut
    Bonjour,

    quelques petites remarques comme ca :

    pourquoi passer par une fonction récursive, alors que tu pourrais t'en sortir avec un do while, avec quelque chose dans ce genre la
    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
     
    function random_name($fileName) {
     
        // Récupère l'extention du fichier
        $pos = strrpos($fileName, '.');
        $ext = strtolower(substr($fileName, $pos));
     
        $isUnique = false;
        do
        {
           // Génère un fileName aléatoire
    	    $fileName_random = "";
    	    $len = rand(1,11);
    	    $str= "abcdefghijklmnopqrstuvwxyz";
    	    for($i=0;$i<$len;$i++)
    	    {
    	        switch(rand(1,2)){
    	            case 1: $fileName_random.= $str[rand(0,25)];
    	            case 2: $fileName_random.= rand(0,9);
    					}
    	    }
     
           // Replace l'extention du fichier
    	    $fichier = $fileName_random.$ext;
     
    	    // Vérifie si le nom de fichier n'existe pas déjà
    	    $query = $GLOBALS['db']->prepare("select fileName from image where fileName = :fichier limit 1");
    	    $query->bindParam(':fichier', $fichier, PDO::PARAM_STR);
    	    $query->execute();
    	    $row = $query->fetchAll();
    	    $query= null;
     
    	    // return
    	    if (count($row) == 0)
    	    	$isUnique = true;
        }
        while(!$isUnique);
     
    		return $fichier;
    }
    Sinon, tu as testé en forcant avec un nom de fichier non existant ?

    Affiche également la requete sql et teste la sous phpmyadmin pour voir si elle fonctionne.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Par défaut
    Tout d'abord merci pour ta réponse Bebel.

    J'aime ton idée, c'est beaucoup plus basique qu'une fonction récursive. et sa fait le même travail.

    Mais cela ne fonctionne toujours pas.

    j'ai ajouté ça à ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // return
    if (count($row) == 0){
    	$isUnique = true;
    }else{
    	$ttt = 'existe deja';
    	$query3 = $GLOBALS['db']->prepare("INSERT INTO image (id_image, fileName) VALUES ('', :fileName_random)");
    	$query3->bindParam(':fileName_random', $ttt, PDO::PARAM_STR);
    	$query3->execute();
    }
    Et le résultat est : quelques images passe, puis, dès qu'il trouve un nom qui existe déjà, il ne sort plus du 'do', il m'insère 10K de lignes, si se n'est plus (si je n'avais pas stoppé le script) de 'existe deja' en BDD.
    La requête 'select' (qui vérifie le nom de l'image) doit forcement planter, car je n'ai pas assez d'image en BDD pour avoir utilisé tout les noms possibles généré aléatoirement.
    J'ai testé la requête dans phpmyadmin, elle fonctionne bien.

    Je remarque également que la requête 'insert' (pour le 'existe deja'), elle, fonctionne très bien.

    Nième Edit : A partir de 4000 noms d'image (environ) en BDD, il n'en trouve plus de nouveau.
    Je ne comprend pas, j'avais compté bien plus de possibilité.. Combien en comptez-vous, vous?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $fileName_random = "";
    	    $len = rand(1,11);
    	    $str= "abcdefghijklmnopqrstuvwxyz";
    	    for($i=0;$i<$len;$i++)
    	    {
    	        switch(rand(1,2)){
    	            case 1: $fileName_random.= $str[rand(0,25)];
    	            case 2: $fileName_random.= rand(0,9);
    					}
    	    }

  4. #4
    Membre Expert Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Par défaut
    Le nom du fichier est il important ?

    Si non pourquoi ne pas utiliser une valeur incrémentale (l'id de l'enregistrement par exemple) ou un guid ?

    Si oui, tu peux toujours sauver le nom du fichier d'origine en bd, renommer le fichier avec l'id et au moment d'afficher le nom du fichier utilisé celui stocké en BD.

    Edit : le rand (1,11) pour la longueur commence peut etre trop bas. Peut etre un rand(5,11) (par exemple) augmenterais les possibilités. Sinon un strlen = 11 donnerait également une plus grand panel de possibilité.

  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
    Salut

    Il y a une fonction qui me semblerais plus adapté dans ton cas :
    fonction uniqid()
    Elles est basée sur la date et heure courante en microsecondes, ce qui fait qu'il est (théoriquement) impossible que ça génère 2 IDs identiques (d'où son nom).
    A quoi bon réinventer la roue

    De plus, elle permet d'ajouter un préfixe, fort pratique.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Par défaut
    Merci pour vos réponses, tout fonctionne maintenant, j'ai utilisé les id.

    Sa m'apprendra à vouloir réutiliser des morceaux de code, alors qu'il était bien plus facile de tout refaire.

    Merci encore, à la prochaine

Discussions similaires

  1. [MySQL] migration de Fonction récursive PHP/MYSQL vers PHP5 CodeIgniter /mysql
    Par Hasret dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 13/03/2013, 19h32
  2. Fonction récursive identique php
    Par drick35 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/10/2012, 10h54
  3. [PHP 5.3] fonction récursive php
    Par ghaoui dans le forum Langage
    Réponses: 1
    Dernier message: 29/05/2012, 14h10
  4. fonction récursive php
    Par chris801 dans le forum Langage
    Réponses: 3
    Dernier message: 16/10/2010, 12h14
  5. [PHP-JS] Arguments PHP d'une fonction javascript
    Par Néo-Tony dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 22/12/2004, 12h06

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