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 :

PDO et class pour la connexion : impossible d'afficher les résultats [PDO]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut PDO et class pour la connexion : impossible d'afficher les résultats
    Bonjour à tous, je suis débutant PHP.
    J'ai appris a faire mes requetes en bdd avec les methode mysql_
    Or je tente d'apprendre à utiliser les methodes avec PDO.

    Avant j'utilisais une classe que j'avais créée pour me connecter à mysql, lire, ecrire, mettre à jour et effacer les données.

    Sur le meme modèle je tente de mettre en place une classe mais qui utilise cette fois ci PDO.

    Mais j'obtiens toujours une erreur et mes résultats ne s'affichent pas. Pourtant quand je ne passe pas par la classe mais que je tape directement le code dans ma page, aucun probleme.

    Voici mon code pour la classe :
    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
    <?php
    require_once('config.php');
     
    class mysql_use{
     
    	private $connexion;
    	//on initialise la fonction de construction de classe et on renseigne les variables de connexion avec les données de connexion de la base de données
    	function __construct(){
    		global $host, $user, $pwd, $db, $connexion;
     
    		$connexion = new PDO("mysql:host=$host;dbname=$db",$user,$pwd);
    		$connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    		$connexion->exec("set names utf8");
    		echo "<strong>Connexion Ok</strong><br />";
    	}
     
    	function __destruct(){
    		$connexion=null;
    	}
     
     
    	//on déclare une nouvelle fonction publique qui va aller sélectionner les éléments souhaités selon des parametres précis
    	public function exe_select_query($fields, $table, $clause, $orderby, $limit){
    		global $connexion;
    		$sql="SELECT ".$fields." FROM `".$table."` ".$clause.$orderby.$limit."";
    		echo $sql;
    		$requete = $connexion->query($sql);
    	}
    ?>
    Voici à présent le code de ma page :
    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
    <?php
    require_once('class/class.pdo_mysql_use.php');
     
    $fields="uid, nom, prenom, email, pays";
    $table="contact";
    $clause=' WHERE 1';
    $orderby=' ORDER BY nom';
    $limit=' LIMIT 0,20';
     
    $ma_connexion = new mysql_use;
     
    $resultats='';
    $req=$ma_connexion->exe_select_query($fields,$table,$clause,$orderby,$limit);
     
    ?>
    et pour afficher les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ?php
    		while($row=$req->fetch(PDO::FETCH_ASSOC))
    		{
    		echo '<div class="row well resultats">'.$row['nom'].'</div>';
    }
    ?>
    ma page me renvoi l'erreur suivante :
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected' in C:\xampp\htdocs\www\contact\class\class.pdo_mysql_use.php:27 Stack trace: #0 C:\xampp\htdocs\www\contact\class\class.pdo_mysql_use.php(27): PDO->query('SELECT uid, nom...') #1 C:\xampp\htdocs\www\contact\index2.php(11): mysql_use->exe_select_query('uid, nom, preno...', 'contact', ' WHERE 1', ' ORDER BY nom', ' LIMIT 0,20') #2 {main} thrown in C:\xampp\htdocs\www\contact\class\class.pdo_mysql_use.php on line 27
    J'avoue que ça fait plusieurs heures que j'ecume les forums, mais là je sèche :/

    merci d'avance

    PS : je précise que j'ai testé la requete direct en bdd, elle fonctionne.

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 27
    Points : 56
    Points
    56
    Par défaut
    On dirais que ton problème ne viens pas de ta requête mais se situe plutôt au niveau du constructeur et plus particulièrement que la connexion à la base de données ne s'effectue pas.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Quand on spécifie PDO::ERRMODE_EXCEPTION il faut utiliser les blocs try /catch pour gérer les exceptions. Genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try
    {
    	$sql="SELECT ".$fields." FROM `".$table."` ".$clause.$orderby.$limit."";
    	echo $sql;
    	$requete = $connexion->query($sql);
    }
    catch (PDOException $e)
    {
    	echo $e->getMessage(); 
    }
    Et pareil pour la connexion.

    A mon avis c'est ta connexion qui est mauvaise. Tu devrais revoir ta classe de connexion qui est particulièrement mal écrite (notamment les variables globales que tu devrais supprimer). Et puis généralement on utilise une méthode statique pour la connexion.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci d'être aussi direct ! Comme je débute et que j'apprends seul, j'essaye de faire de mon mieux

    Pour ce qui est des try - catch, déjà essayé, pour la connexion et pour le select.
    Pour la connexion -> aucune erreur de renvoyée
    Pour le select -> SQLSTATE[3D000]: Invalid catalog name: 1046 No database selected

    Si je supprime les global, j'ai des erreurs de variable inexistantes.

    Et puis généralement on utilise une méthode statique pour la connexion.
    Qu'entends tu par methode statique ?

  5. #5
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    ton problème c'est qu'une fois que ta connexion est établie tu ne sélectionnes pas la base... son nom ou la valeur que tu passes pour elle n'est pas valide...

    donc il te dit qu'il ne la trouve pas...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Un exemple simple de connexion statique, l'avantage est que la connexion ne se fait que si elle n'est pas déjà faite :

    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
    class C_PDO 
    {	
    	private static $connexion;
     
    	private function __construct() 
    	{
    		try
    		{
                            //fichier qui contient les variables de connexion ($hostname,$database,$username,$password)
    			require_once('Connections/connect_bdd.php');
     
    			// mode d'erreurs
    			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
     
    			// Indispensable pour ne pas avoir execute qui formate en string avec un tableau en paramètre  (ce qui est incompatible avec la clause limit)
    			$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
     
    			//charset reconnu dans la connexion à partir de php 5.3.6 auquel cas on peut supprimer l'option MYSQL_ATTR_INIT_COMMAND ci-dessous
    			//$pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
     
    			self::$connection  = new PDO('mysql:host='.$hostname.';dbname='.$database.';charset=utf8', $username, $password, $pdo_options);	
    		}
    		catch (PDOException $e)
    		{
    			// message en production
    			//die('Serveur de base de données en dérangement, veuillez réessayer ultérieurement.');
     
    			// message complet en développement
    			echo $e->getMessage();
    		}
    	}
     
    	public static function getC() 
    	{
    		if(self::$connection == NULL) {new C_PDO;}
    		return self::$connection;
    	}	 
    }
    ensuite tu peux appeler la connexion depuis n'importe où dans ton code avec C_PDO::getC(); en faisant par 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
    $inputs = ...
    try
    {
    	$query = "SELECT ...";
     
            $connect = C_PDO::getC();
     
    	$sth = $connect->prepare($query);
     
    	$sth->execute($inputs);
     
    	$result = $sth->fetchAll();
     
            $sth->closeCursor();
    }
    catch (PDOException $e)
    {
    	echo $e->getMessage(); 
    }

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    je suis pas très fana pour les classe avec des variables statiques sur des trucs comme une connexion au sgbd...

    vaut mieux faire du statique quand ça lui sied comme pour les sessions avec un objet constitué alors de fonctions toutes statiques vu que tu ne peux pas avoir 2 sessions en même temps par exemple... et que n'importe quel appel à un session_start() invaliderait ton identifiant de session dans l'objet instancié...

    statique est ainsi un bon choix pour faire un objet qui ne propose que des méthodes pour encapsuler tout ce qui est proposé avec un api procédural (et profiter de l'auto complétion)

    ou pour des trucs comme proposant le comptage du nombre d'instance d'un objet...

    statique=partagé par tous les objets instanciés de la classe et/ou ne nécessitant pas forcément une instanciation pour être utilisés...

    la manipulation des fichiers, les connexion à un sgbd sont elles indépendante et le paradigme objet est donc tout à fait justifier pour encapsuler les identifiants des ressources générés pour le faire et garantir que seules les méthodes que tu donnes serviront à les manipuler...

    rien ne t'empêche d'ouvrir autan de connexion à des sgbd ou autan de fichier que tu veux dans le même php...

    ta classe ne le permettra pas abciweb...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    je suis pas très fana pour les classe avec des variables statiques sur des trucs comme une connexion au sgbd...
    Oui j'ai déjà lu ça de temps à autre. Mais bon faute d'arguments plus convaincants (autres que philosophiques), et étant donné que c'est très pratique j'utilise toujours ce genre de méthode depuis environ 3 ans et je n'ai jamais trouvé aucun inconvénient.

    Citation Envoyé par ericd69 Voir le message
    rien ne t'empêche d'ouvrir autan de connexion à des sgbd ou autan de fichier que tu veux dans le même php...
    ta classe ne le permettra pas abciweb...
    Oui enfin c'est un exemple simple mais rien n'empêche d'optimiser et de faire si besoin un multiton pour des connexions différentes.

    Maintenant je dis pas que c'est LA solution, mais aussi simple, pratique et efficace, j'ai pas trouvé. Et pour moi un code qui réuni ces qualités en ne me procurant pas de problème... je ne vois l'intérêt d'en changer juste pour me compliquer la vie

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bon j'ai résolu l'erreur de PDO en mettant $user et $pwd entre " ".
    J'ai aussi rajouté dans ma page principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    require_once('class/config.php');
    Qui contient mes identifiants de connexion au sgbd... Ce que je voulais éviter. Problème contourné mais pas résolu en ce qui me concerne ici.

    A présent j'ai un deuxième problème qui se pose. Dans ma page html cette fois ci, lorsque je fais appel à ma fonction pour afficher les résultats, j'ai un message :
    Fatal error: Call to a member function fetch() on a non-object
    Le code de ma page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    require_once('class/class.pdo_mysql_use.php');
    require_once('class/config.php');
     
    $fields="uid, nom, prenom, email, pays";
    $table="contact";
    $clause=' WHERE 1';
    $orderby=' ORDER BY nom';
    $limit=' LIMIT 0,20';
     
    $ma_connexion = new mysql_use;
    $req=$ma_connexion->exe_select_query($fields,$table,$clause,$orderby,$limit);
     
    ?>
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    		while($row = $req->fetch())
    		{
    		print_r($row);
                    }
    ?>
    je tourne en rond...

    Au passage merci pour vos réponses, ça aide

  10. #10
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Points : 409
    Points
    409
    Billets dans le blog
    1
    Par défaut
    Fatal error: Call to a member function fetch() on a non-object
    Signifie que tu tentes de faire un fetch() sur quelque chose qui n'est pas un objet, ce qui arrive généralement quand ta requête à échoué. Tentes un var_dump de la variable que tu passes à fetch pour connaître sa valeur réelle !

    Citation Envoyé par ABCIWEB Voir le message
    Quand on spécifie PDO::ERRMODE_EXCEPTION il faut utiliser les blocs try /catch pour gérer les exceptions. Genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try
    {
    	$sql="SELECT ".$fields." FROM `".$table."` ".$clause.$orderby.$limit."";
    	echo $sql;
    	$requete = $connexion->query($sql);
    }
    catch (PDOException $e)
    {
    	echo $e->getMessage(); 
    }
    Tu as bien mis en place ce bloc de code ?
    si ce post vous a été utile, si votre problème est résolu.
    Pensez-y !
    __________________________________
    Doc officielle PHP | FAQ PHP | Cours PHP

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    En effet, var_dump renvoi NULL. Pourtant il me semble que l'accès à la méthode est juste...

    Quant au bloc try catch il est bien en place et ne renvoie plus aucune erreur.

  12. #12
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Points : 409
    Points
    409
    Billets dans le blog
    1
    Par défaut
    En même temps...tu récupères ici le retour de ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req=$ma_connexion->exe_select_query($fields,$table,$clause,$orderby,$limit);
    ...Mais je ne vois aucun return $requete dans ta méthode ?
    si ce post vous a été utile, si votre problème est résolu.
    Pensez-y !
    __________________________________
    Doc officielle PHP | FAQ PHP | Cours PHP

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai fait un return sur $requete, mais il me renvoyait une erreur invalid string.
    Mais étonnamment je viens de revérifier et là, miracle, ça marche ! Probablement que les erreurs précédentes faisaient planter la requete.

    Merci !

    A présent je vais essayer de résoudre le probleme de l'inclusion de mon config.php. Car je ne souhaite pas l'appeler sur mes pages, mais uniquement de ma classe.

    Merci encore pour votre aide précieuse

  14. #14
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Oui j'ai déjà lu ça de temps à autre. Mais bon faute d'arguments plus convaincants (autres que philosophiques), et étant donné que c'est très pratique j'utilise toujours ce genre de méthode depuis environ 3 ans et je n'ai jamais trouvé aucun inconvénient.


    Oui enfin c'est un exemple simple mais rien n'empêche d'optimiser et de faire si besoin un multiton pour des connexions différentes.

    Maintenant je dis pas que c'est LA solution, mais aussi simple, pratique et efficace, j'ai pas trouvé. Et pour moi un code qui réuni ces qualités en ne me procurant pas de problème... je ne vois l'intérêt d'en changer juste pour me compliquer la vie
    l'utilisation d'un singleton n'est pas un pb en soi quand tu comprends ce qu'il implique , mais ce que je voulais dire, c'est que des gens débutant ne saisissent eux pas toutes les contraintes de ce genre de programmation un peu avancée

    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

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

Discussions similaires

  1. [PostgreSQL] [pg_fetch_assoc] Impossible d'afficher les résultats d'un Select
    Par khemdyr dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/07/2015, 15h39
  2. Impossible d'afficher les dossiers et les fichiers cachés
    Par bucabuca dans le forum Windows XP
    Réponses: 4
    Dernier message: 27/03/2008, 10h23
  3. Réponses: 6
    Dernier message: 29/02/2008, 12h13
  4. [MySQL] Impossible d'afficher le résultat
    Par KOUTO dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/09/2007, 20h01
  5. [img201.imageshack.us] impossible d'afficher les images
    Par Blossom dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 07/02/2007, 09h41

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