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 :

L'erreur la plus incohérente du monde (access denied) [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 218
    Par défaut L'erreur la plus incohérente du monde (access denied)
    Désolé du double post, je crois que cette section est la bonne pour le sujet

    Bonsoir,

    je ne sais pas si cela viens qu'il est super tard (ou super tôt)
    mais je lance un SOS international pour une erreur qui me fait m'arracher les cheveux sur ma tête.

    J'ai une class php pour ma BDD mysql qui fonctionne très bien sur toute les pages

    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
    <?php
    $server   = "localhost";
    $username = "root"; 
    $password = "root";
    $dbname   = "auth";
     
    class DBConnection {
        private $connection;
     
        function __construct() {
            $this->connection = mysql_connect($GLOBALS["server"  ],
                                              $GLOBALS["username"],
                                              $GLOBALS["password"]);
            mysql_select_db($GLOBALS["dbname"],$this->connection);
    		mysql_query("SET NAMES 'utf8'");
        }
     
        function query($query) {
            $result = mysql_query($query, $this->connection);
            if (!$result) {
                echo 'erreur de la requête ' . mysql_error();
                exit;
            }
            return $result;
        }
     
        function end() {
            mysql_close($this->connection);
        }
    }
    ?>
    Sans aucune explications, alors que j'ai accès à la base de données dans le premier bloc d'instruction PHP (selection des users)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $connection = new DBConnection();
    	$sql = "SELECT * FROM login_users WHERE username LIKE '" . $search_q . "%' or fname LIKE '" . $search_q . "%' or lname LIKE '" . $search_q . "%' ORDER BY username LIMIT 0, 10"; 
    	$result = $connection->query($sql);
    	$connection -> end();
    	$count = mysql_num_rows($result);
    Je suis sur la même page, donc aucun appel de fichier, tout reste dans son état fonctionnel, et puis PAF, quand je veux modifier l'user (que je viens de selection GRACE à la BDD), il me sort

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root'@'localhost' (using password: NO) in C:\Program Files\UwAmp (Clement)\www\Iseult\functions\auth.php on line 13
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if($error == '') {
    	$connection = new DBConnection();
    $sql = "UPDATE login_users SET restricted='$restrict', fname='$fname', lname='$lname', user_level='$level', password = sha1('$password') WHERE user_id = '$id' ";
    	$result = $connection->query($sql);
    Alors que je répète, ma classe php marche sur tout mon site, et même sur la page qui quelque seconde plus tard me dit que l'accès est DENIED.



    Merci de m'éclairsir avant que je ne sombre dans la démence.

  2. #2
    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

    Je vois ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $connection -> end();
    $count = mysql_num_rows($result);
    Je ne pige pas la façon dont tu procède.
    Tu as une classe DBConnection, qui normalement devrait contenir toutes les fonctionnalités dont tu aurais besoin, mais après, tu ferme cette connexion et tu appel directement une fonction de MySQL : mysql_num_rows.
    Pas étonnant que MySQL soit perturbé.
    MySQL ré-ouvre en faite une nouvelle connexion, et n'ayant pas les infos nécessaire -> Access denied


    Puis une autre remarque concernant ceci : $GLOBALS["server"]
    S'il y a un truc à ne pas faire, c'est bien ceci, c'est à dire récupérer une donnée d'une variable via la superglobal $_GLOBALS.

    Tes identifiants de connexions (host-user-pass) doivent ce trouver au minimum dans ta classe, avec des restrictions, (protected).
    Surtout pas stocké dans de simples variables.
    C'est un conseil


    Pour profiter pleinement de ta classe, il faudrait créer une méthode pour chaque fonction MySQL dont tu aurais besoin, comme tu l'as fait pour mysql_query et mysql_free_result par exemple.

    Il faut aussi que tu ais bien conscience que ce qui identifie la connexion, c'est le "link" que retourne mysql_connect, et celui ci c'est ta propriété $this->connection dans ta classe.
    Pour éviter des comportements étranges, il faut "passer" en argument ce $this->connection dans toutes les fonctions MySQL réclamant cet ID de connexion qui seront dans ta classe.
    Ces fonctions deviendront des méthodes de classe. Il faudra alors les "appeler" dans le code de tes pages.
    Il faudra donc au moins rajouter mysql_ftech_array, mysql_insert_id, etc, etc ...

    Exemple :
    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
     
    class DBConnection {
    	protected $server   = "localhost";
    	protected $username = "root"; 
    	protected $password = "root";
    	protected $dbname   = "auth";
     
    	protected $connection;
     
    	function __construct() {
    		$this->connection = mysql_connect($this->server, $this->username, $this->password);
    		mysql_select_db($this->dbname,$this->connection);
    		mysql_query("SET NAMES 'utf8'", $this->connection);
    	}
     
    	function query($query) {
    		$result = mysql_query($query, $this->connection);
    		if (!$result) {
    			echo 'erreur de la requête ' . mysql_error($this->connection);
    			exit;
    		}
    		return $result;
    	}
     
    	function num_rows() {
    		return mysql_num_rows($result);
    	}
     
    	function end() {
    		mysql_close($this->connection);
    	}
    }
    - J'ai rajouter une méthode num_rows().
    - Rajouter $this->connection qu'il manquait au 1er mysql_query() et à mysql_error().
    - Supprimé les $_GLOBALS, et créé des propriétés à la place.

    Si tu veux éviter les comportement étranges, il faut que toute ta classe et ton code soit cohérent, sinon MySQL perd la boule


    Une petite suggestion au passage : Pourquoi n'utilise tu pas PDO ?

  3. #3
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    C'est surtout que ton instance de connexion devrait être un singleton, tu ne dois pas créer une instance de DBConnection à chaque fois. Sinon tu appel mysql_connect tout le temps alors que tu es probablement déjà connecté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $conn = DbConnection::instance();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class DBConnection {
        private static $instance;
     
        // [...]
     
        public static function instance(){
            if(self::$instance === NULL) self::$instance = new DBConnection;
            return self::$instance;
        }
    }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 218
    Par défaut
    je vous remercie !

    Une petite suggestion au passage : Pourquoi n'utilise tu pas PDO ?
    parce que je ne sais pas ce que c'est et à quoi sa sert (honte à moi)

    je prends note de vos conseils, le problème est résolu cela venait effectivement des mal placés.

    J'ai aussi changé ma classe pour passer mes variables globales en protected.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/05/2015, 14h13
  2. [RCP] Erreur à l'exécution d'un product: access denied
    Par hodac dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 22/03/2010, 14h58
  3. [XSL] &#xA; <-- le problème le plus ennuyeux du monde
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 06/04/2006, 15h36
  4. Réponses: 6
    Dernier message: 07/02/2006, 18h31
  5. Réponses: 3
    Dernier message: 14/01/2006, 18h09

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