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 :

Probleme de variable dans une fonction


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Probleme de variable dans une fonction
    Bonsoir, j'ai un peu honte de poster un truc aussi bête mais la je bloque...

    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
    function usertype($user) {
     
    $ok = false;
    $r = null;
     
    $d = "SELECT nom FROM admins WHERE nom='".strtoupper($user)."';";
    $q = mysql_query($d);
    if(mysql_num_rows($q) > 0) {$r = 'admin'; $ok = true;}
     
    else if ($ok == false){
    $d = "SELECT nom FROM profs WHERE nom='".strtoupper($user)."';";
    $q = mysql_query($d);
    if(mysql_num_rows($q) > 0) {$r = 'prof';$ok = true;}
    }
    else if ($ok == false){
    $d = "SELECT nom FROM eleves WHERE nom='".strtoupper($user)."';";
    $q = mysql_query($d);
    if(mysql_num_rows($q) > 0) {$r = 'eleve';$ok = true;}
    }
    else {
    	$r = 'Erreur';
    }
    return $r;
     
    }
    Le problème c'est que lorsque c'est un user de type 'eleve', ma variable $r est undefined.
    Je ne comprend vraiment pas pourquoi si quelqu'un pourrait m'aider car je ne suis pas vraiment expérimenté si vous avez pu le remarquer.

    En tous cas merçi d'avance pour tout ceux qui me répondront.

  2. #2
    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
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    1- La variable $ok est inutile, tu n'as qu'à tester si $r n'est pas null.
    2- j'ai peur que tu tentes d'utiliser $r en dehors de la fonction. Si c'est le cas, tu ne peux pas si tu ne l'as pas déclarée global.

    A+.

  3. #3
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Si on regarde bien, $r sera initialisé uniquement si la requête n'échoue pas, c'est à dire quelle retourne au moins 1 résultat (1 ligne).

    Donc si la requête échoue alors $r sera NULL (ou indéfinie).
    Il est fort probable que tu entre dans ce cas.
    Pour en savoir plus il faudrait activer l'affichage des des erreurs en Php et SQL, c'est à dire le display_error et le mysql.trace_mode à mettre à On (php.ini ou faire un ini_set).
    Ou alors rajoute de or die ('Erreur : '.mysql_error()) à chaque requête (mysql_query).



    Cependant, il y a plusieurs points qui ne vont pas.
    D'abord, tes requêtes ne sont pas sécurisés du fait qu'aucune protection ne sont faites sur les données, tu t'exposes à des SQL injection.
    Il faut protéger tes données en appliquant des mysql_real_escape_string().
    Par ailleurs, si une donnée (un nom) contient des quotes, (genre O'CONNOR), ça va faire "planter" les requêtes.
    Là encore c'est cette même fonction qui va éviter un plantage en l'échappant (d'où son nom).
    Voir la doc : mysql_real_escape_string()

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = "SELECT nom
    FROM admins
    WHERE nom = '".mysql_real_escape_string($nom)."'";
    $rs = mysql_query($sql) or die('Erreur : '.mysql_error());
    Ceci est indispensanble.
    Ceci dit et pour info, les fonctions mysql_* sont obsolètes (vouées à disparaitre), les ranger au placard pour utiliser l'une des 2 autres façons qu'offre Php pour interroger sa Bdd est fortement conseillé.
    Les 2 autres sont PDO et MySQLi.


    Mais là où à mon sens il y a erreur de conception, c'est que tu n'exploiterais pas du tout ce qu'offre une Base De Donnée.
    Une Bdd se conçoit pour tirer partie de ce quelle offre, et dans ton cas il serait bien mieux à mon sens de créer une table "users" pour insérer tous les utilisateurs et créer une 2ème table "types_users" afin de créer les différents type d'utilisateurs.
    La table "users" aura sa clé primaire "id_user", et une clé étrangère "id_type_user" lié à la table "type_users", c'est cela qui va permettre de rechercher un (ou plusieurs) utilisateur(s) selon un critère (comme le nom) et obtenir le type.
    Ceci se fera par une jointure de table (qui je rappel est la base d'une Bdd).
    Une seule est unique requête suffira pour le faire.
    De plus, il ne sera pas besoin d'intervenir dans le code si un nouveau type utilisateur est créé (modifié ou supprimé), le simple fait de le rajouter dans la table "type_users" et tout le reste suivra.

    De ton coté, et le défaut saute aux yeux, il faut faire autant de requêtes SQL qu'il y a de types d'utilisateurs.
    Si demain on rajoute un nouveau type d'utilisateur le codeur aura pour obligation d'intervenir dans le code pour au minimum rajouter la nouvelle requête (et tout reste basé la dessus).
    C'est tout simplement ingérable.


    Autre point, cela concerne la fonction strtoupper().
    On "force" ici le nom en majuscule pour effectuer la recherche.
    Pas sûr que cela soit utile, pas sûr d'être certain de trouver le user selon son nom.
    Tout dépend de la structure de cette table et du champ "nom", plus exactement si ce champ "nom" est "case sensitive" ou "case insensitive", donc si la casse est à respecter ou pas.
    A mon sens le plus simple serait de définir ce champ comme "case insensitive".
    Faut voir.

  4. #4
    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
    Points : 15 059
    Points
    15 059
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Si on regarde bien, $r sera initialisé uniquement si la requête n'échoue pas, c'est à dire quelle retourne au moins 1 résultat (1 ligne).

    Donc si la requête échoue alors $r sera NULL (ou indéfinie).
    Il est fort probable que tu entre dans ce cas.
    Je ne pense pas
    Citation Envoyé par termi78
    else {
    $r = 'Erreur';
    }

  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
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par andry.aime
    Je ne pense pas
    Pas si sûr.

    Si la 1ère requête foire, tout le reste qui suit risque de foirer encore plus.
    Le mysql_num_rows() entre autre.

    Et comme le $ok sera FALSE, on entrera dans l'une des condition (pas le else), du coup $r pourra être initialisé que si la 2ème requête n'échoue pas.
    Aucune valeur par défaut n'est effectué dans le cas contraire.

    De plus, il y a 2 fois cette alternative : else if ($ok == false)
    Autant dire que la requête sur la table "eleves" ne sera jamais effectuée.
    La raison vient peut être de là.


    Si on indente le code correctement ceci se perçoit mieux :
    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
    function usertype($user) {
     
        $ok = false;
        $r = null;
     
        $d = "SELECT nom FROM admins WHERE nom='".strtoupper($user)."';";
        $q = mysql_query($d);
     
        if (mysql_num_rows($q) > 0) {
            $r = 'admin';
            $ok = true;
        }
        else if ($ok == false) {
            $d = "SELECT nom FROM profs WHERE nom='".strtoupper($user)."';";
            $q = mysql_query($d);
     
            if (mysql_num_rows($q) > 0) {
                $r = 'prof';
                $ok = true;
            }
        }
        else if ($ok == false) {
            $d = "SELECT nom FROM eleves WHERE nom='".strtoupper($user)."';";
            $q = mysql_query($d);
     
            if (mysql_num_rows($q) > 0) {
                $r = 'eleve';
                $ok = true;
            }
        }
        else {
    	$r = 'Erreur';
        }
        return $r;
     
    }
    Suis bien le code.


    Bref ... pour ma part tout le code y compris la Bdd est à revoir (repartir à 0).

  6. #6
    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
    Points : 15 059
    Points
    15 059
    Par défaut
    Effectivement,

    Mais la variable $ok n'est pas très utile aussi
    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
    function usertype($user) {
     
        $r = null;
     
        $d = "SELECT nom FROM admins WHERE nom='".strtoupper($user)."';";
        $q = mysql_query($d);
     
        if (mysql_num_rows($q) > 0) {
            $r = 'admin';
        }
    	if ($r == null) {
            $d = "SELECT nom FROM profs WHERE nom='".strtoupper($user)."';";
            $q = mysql_query($d);
     
            if (mysql_num_rows($q) > 0) {
                $r = 'prof';
            }
        }
        if ($r == null) {
            $d = "SELECT nom FROM eleves WHERE nom='".strtoupper($user)."';";
            $q = mysql_query($d);
     
            if (mysql_num_rows($q) > 0) {
                $r = 'eleve';
            }
        }
        else {
    	$r = 'Erreur';
        }
        return $r;
     
    }
    A+.

  7. #7
    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
    Points : 3 947
    Points
    3 947
    Par défaut
    Mais la variable $ok n'est pas très utile aussi
    La question n'est même pas là, s'il n'y avait que ça j'aurais suggéré une correction.

    C'est cette fonction usertype() qui ne sert tout simplement à rien (et donc tout le code qui s'y trouve) pour la simple raison que cette Bdd est mal conçue, du moins je le pense.
    Par conséquent ça ne vaut pas le coup de s'attarder sur le code.


    Faut créer une table "users" etc, etc ... (les explications je les aient déjà données plus haut).
    Quand les choses seront mieux conçues 1 seule requête SQL sera à faire.
    C'est ainsi que sert une Base De Donnée.
    Sauf erreur.

  8. #8
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2012
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    merçi pour vos réponses.
    C'est vrai que la BDD est je trouve aussi très mal conçu je vais rattraper le coup !

Discussions similaires

  1. Passage de variables dans une fonction
    Par renaud26 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/07/2006, 17h49
  2. [Excel]Mettre une variable dans une fonction
    Par soad029 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 14/04/2006, 12h00
  3. [Tableaux] Récuperer variable dans une fonction
    Par amarcil dans le forum Langage
    Réponses: 12
    Dernier message: 12/02/2006, 10h56
  4. Pb de variable dans une fonction :
    Par soad029 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/10/2005, 13h54
  5. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 12h50

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