Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de connexion a la base de données

Attention [POO]

    18 juin 2012 à 21:47:27

    Bonjour, je n'arrive pas a accéder a la base de données de mon site,
    Je sais que ce problème est fréquent et j'ai regarder et suivis des post similaire mais je n'ai toujours pas résolu mon problème.

    voici le code qui tente de se connecter :

    <?php
    
    class Mypdo{
            private $PDO_hote='localhost'; // le chemin vers le serveur
            private $PDO_port='2082';
            private $PDO_nom_bd='NOM_DE_BDD'; // le nom de votre base de données
            private $PDO_user='NOM_DE_LUTILISATEUR'; // nom d'utilisateur pour se connecter
            private $PDO_pass='MDP_DE_LUTILISATEUR'; // mot de passe de l'utilisateur pour se connecter
            
    
            private function myconnexion()
            {
                    try
                    {
                            $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
                            $connexion = new PDO('mysql:host='.$PDO_hote.';dbname='.$PDO_nom_bd, $PDO_user, $PDO_pass,$pdo_options);
                    }
                     
                    catch(Exception $e)
                    {
                            echo 'Une erreur est survenue lors de la connexion a la base de données!';
                            die();
                    }
                    return $connexion;
            }
            
            private function myrequete($action,$table,$arg,$where,$option="")
            {
                    try 
                    {
                            if($arg==null){
                                    $arg="*";
                            }
                            if($action=="update"){
                                    if($where==null){
                                            $req=$action." ".$table." set ".$arg;
                                    }else{
                                            $req=$action." ".$table." set ".$arg." where ".$where;
                                    }
                            }else if($where==null){
                                    $req=$action." ".$arg." from ".$table." ".$option;
                            }else{
                                    $req=$action." ".$arg." from ".$table." where ".$where." ".$option;
                            }        
                    }
                    catch(Exception $e)
                    {
                            echo 'Une erreur est survenue à avec la fonction requete de la class pdo!';
                            die();
                    }
                    return $req;
            }
            
            private function myquery($pdo,$req){
                    try 
                    {
                            $reponse= $pdo->query($req);
                    }
                    catch(Exception $e)
                    {
                            echo 'Une erreur est survenue à avec la fonction query de la class pdo!';
                            die();
                    }
                    return $reponse;
            }        
    
            private function myprepare($pdo,$table,$insert,$values){
                    try 
                    {
                            $tailleTab=sizeof($insert);
                            $ins=$insert[0];
                            $val=":".$values[0];
                            for($i=1;$i<$tailleTab;$i++){
                                    $ins=$ins.",".$insert[$i];
                                    $val=$val.",:".$values[$i];
                            }
                            $req="INSERT INTO ".$table."(".$ins.") VALUES(".$val.")";                        
                            $donnees =$pdo->prepare($req);
                    }
                    catch(Exception $e)
                    {
                            echo 'Une erreur est survenue à avec la fonction prepare de la class pdo!';
                            die();
                    }                
                    return $donnees;
            }
            
            private function myexecute($prepare,$insert,$values){
                    $taille=sizeof($insert);
                    $req="";
                    for($i=0;$i<$taille;$i++){
                            $req=$req.$insert[$i]." => ".$values[$i].",";
                    }
                    $prepare->execute(array($req));
            }
            
            
            public function select($table,$arg=null,$where=null,$option="")
            {
                    $pdo=self::myconnexion();
                    $req=self::myrequete("select",$table,$arg,$where,$option);
                    $donnees=self::myquery($pdo,$req);
                    return $donnees;
            }
            
            public function delete($table,$where){
                    $pdo=self::myconnexion();
                    $req=self::myrequete("delete",$table,"",$where);
                    $donnees=self::myquery($pdo,$req);
                    return $donnees;
            }
            
            public function insert($table,$insert,$values){
                    $pdo=self::myconnexion();
                    $prepare=self::myprepare($pdo,$table,$insert,$values);
                    $donnees=self::myexecute($prepare,$insert,$values);
                    return $donnees;
            }
            
            public function update($table,$set,$where=null){                
                    $pdo=self::myconnexion();
                    $req=self::myrequete("update",$table,$set,$where);
                    $donnees=self::myquery($pdo,$req);
            }
            
    }
    
    ?>
    



    Quand j’appelle la fonction insert (fonction ligne 113),
    cela m'affiche "Une erreur est survenue lors de la connexion a la base de données!"
    cas de la ligne 21.

    je précise que je suis chez planetHoster, que j'ai bien créé un utilisateur pour ma bdd , que j'ai bien cocher tout privilège (bien que les privilège n’apparaissent pas comme sur le tuto)


    Image utilisateur


    Bon sinon, toute remarque d'erreur sur ma class est bienvenu, merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2012 à 21:52:02

      :waw:

      T'aurais du préciser que c'est de la POO !
      • Partager sur Facebook
      • Partager sur Twitter
        19 juin 2012 à 7:08:06

        On va commencer par l'erreur:
        - Le message d'erreur est contenu dans l'exception envoyer. Voir méthode getMessage() de la classe Exception.

        Remarque/corrections:
        - Tu utilises des appel static a des méthodes non static.
        - A chaque appel de ta méthode myconnexion tu crée une nouvelle instance de PDO qui du même fait établi une nouvelle connexion à la base de donnée.
        - Rend la manipulation de ton instance PDO plus adéquate en le mettant en attribut de ta classe.
        - Sa serai bien que à la place tu crée une classe static qui génère une instance PDO (voir pattern Factory) à la place de ta méthode myconnexion. Du même fait que tu crée un constructeur et un ascenseur setter pour cet attribut.
        • Partager sur Facebook
        • Partager sur Twitter
          19 juin 2012 à 9:42:54

          Merci de ton aide, j'ai un peu modifier ma class :

          <?php
          
          class Mypdo{
          	private $PDO_hote='localhost'; // le chemin vers le serveur
          	private $PDO_port='2082';
          	private $PDO_nom_bd='NOM_DE_LA_BDD'; // le nom de votre base de données
          	private $PDO_user='NOM_UTILISATEUR'; // nom d'utilisateur pour se connecter
          	private $PDO_pass='MDP_UTILISATEUR'; // mot de passe de l'utilisateur pour se connecter
          	
          	private $connexion;
          	
          	public function __construct(){
          		$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
          		$this->connexion = new PDO('mysql:host='.$this->PDO_hote.';dbname='.$this->PDO_nom_bd, $this->PDO_user, $this->PDO_pass,$pdo_options);
          	}	
          
          	
          	private function myrequete($action,$table,$arg,$where,$option="")
          	{
          		try 
          		{
          			if($arg==null){
          				$arg="*";
          			}
          			if($action=="update"){
          				if($where==null){
          					$req=$action." ".$table." set ".$arg;
          				}else{
          					$req=$action." ".$table." set ".$arg." where ".$where;
          				}
          			}else if($where==null){
          				$req=$action." ".$arg." from ".$table." ".$option;
          			}else{
          				$req=$action." ".$arg." from ".$table." where ".$where." ".$option;
          			}	
          		}
          		catch(Exception $e)
          		{
          		        echo 'Une erreur est survenue à avec la fonction requete de la class pdo!';
          		        die();
          		}
          		return $req;
          	}
          	
          	private function myquery($pdo,$req){
          		try 
          		{
          			$reponse= $pdo->query($req);
          		}
          		catch(Exception $e)
          		{
          		        echo 'Une erreur est survenue à avec la fonction query de la class pdo!';
          		        die();
          		}
          		return $reponse;
          	}	
          
          	private function myprepare($pdo,$table,$insert,$values){
          		try 
          		{
          			$tailleTab=sizeof($insert);
          			$ins=$insert[0];
          			$val=":".$values[0];
          			for($i=1;$i<$tailleTab;$i++){
          				$ins=$ins.",".$insert[$i];
          				$val=$val.",:".$values[$i];
          			}
          			$req="INSERT INTO ".$table."(".$ins.") VALUES(".$val.")";			
          			$donnees =$pdo->prepare($req);
          		}
          		catch(Exception $e)
          		{
          		        echo 'Une erreur est survenue à avec la fonction prepare de la class pdo!';
          		        die();
          		}		
          		return $donnees;
          	}
          	
          	private function myexecute($prepare,$insert,$values){
          		$taille=sizeof($insert);
          		$req=array($insert[0]=>$values[0]);
          		$req[$insert[0]]=$values[0];
          		for($i=1;$i<$taille;$i++){
          			$req[$insert[$i]]=$values[$i];
          		}
          		$prepare->execute($req);
          	}
          	
          	
          	public function select($table,$arg=null,$where=null,$option="")
          	{
          		$req=self::myrequete("select",$table,$arg,$where,$option);
          		$donnees=self::myquery($this->connexion,$req);
          		return $donnees;
          	}
          	
          	public function delete($table,$where){
          		$req=self::myrequete("delete",$table,"",$where);
          		$donnees=self::myquery($this->connexion,$req);
          		return $donnees;
          	}
          	
          	public function insert($table,$insert,$values){
          		$prepare=self::myprepare($this->connexion,$table,$insert,$values);
          		$donnees=self::myexecute($prepare,$insert,$values);
          		return $donnees;
          	}
          	
          	public function update($table,$set,$where=null){
          		$req=self::myrequete("update",$table,$set,$where);
          		$donnees=self::myquery($this->connexion,$req);
          	}
          	
          }
          
          ?>
          


          la connexion te convient mieux ainsi ?
          pour ce qui est des fonction statique, beh je sais ce que c'est ^^"

          Enfin, le message affiché et maintenant :

          Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in /home/atheotco/public_html/member/admin/class/pdo.php:87 Stack trace: #0 /home/atheotco/public_html/member/admin/class/pdo.php(87): PDOStatement->execute(Array) #1 /home/atheotco/public_html/member/admin/class/pdo.php(107): Mypdo->myexecute(Object(PDOStatement), Array, Array) #2 /home/atheotco/public_html/member/admin/class/equipement.php(215): Mypdo->insert('coiffe', Array, Array) #3 /home/atheotco/public_html/member/admin/addcoiffe.php(34): Equipement->addEquipement('coiffe') #4 {main} thrown in /home/atheotco/public_html/member/admin/class/pdo.php on line 87


          J'ai volontairement enlevé le try/catch pour mieux voir l'erreur

          ps: il y a t'il une balise Zcode pour les erreurs ?

          édit: Ces messages d'erreur n'étant plus des problème de connexion (visiblement) , je me demande si je devrait pas marquer le sujet comme résolu
          • Partager sur Facebook
          • Partager sur Twitter
            20 juin 2012 à 1:23:54

            Pour ton erreur:
            "Invalid parameter number: number of bound variables does not match number of tokens"
            Sa veux dire que le nombre de d'identifiant dans ta requête ne correspond pas au nombre de valeurs que tu lui passes.
            Pour être plus claire si tu as:
            SELECT * FROM tb
            WHERE ((foo = :foo) AND (bar = :bar))
            

            Et que dans ton execute tu met:
            <?php
            $oPDOStatement -> execute(array(':foo' => "pouet pouet"));
            

            Tu vois que ici te manque de renseigner :bar.

            ---------------
            Quand je dis:
            "- Tu utilises des appel static a des méthodes non static."
            C'est que tu utilises self:: alors que tes entête de méthode ne sont pas déclarer en static donc c'est $this -> que tu dois mettre.

            Pour une autre des remarques maintenant que tu as mit ton instance PDO dans ton attribut $connexion sa sert pu a rien de passé en paramètre de tes méthode cette attribut tu peux l'exploité directement dans tes méthodes.
            • Partager sur Facebook
            • Partager sur Twitter

            Problème de connexion a la base de données

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown