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 :

connexion PDO OK mais prepare impossible


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut connexion PDO OK mais prepare impossible
    Bonsoir,

    j'effectue une connexion PDO qui semble bonne, mais derrière la méthode prepare est refusée...

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	include_once "connect.php"; // ls : on effectue une connexion (_once pour le faire une seule fois)
    	if (isset($bdd)) echo "connecté<br/>";
     
    		$sql = "SELECT * FROM users";
    		$qid = $bdd->prepare($sql);
    Comme "connecté" est affiché, pas besoin de montrer connect.php ; donc pourquoi ce message :
    Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\devjupiter\new\authenticate.php on line 22
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Est-ce que $bdd est bien une instance de PDO?

    que dit var_dump($bdd) ?

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Je viens de mettre un var_dump ; il apparaît 2 fois ; une fois, bien objet PDO, mais la 2e fois NULL. Or, je fais des include de la fonction qui exécute le prepare ; y a-t-il moyen d'identifier la fonction appelante car il est évident que le problème est là, sauf que je ne sais pas où c'est...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Tu peux poster connect.php ici?

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    connect.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    header('Content-type: text/html; charset=UTF-8');
     
    try{
     
    	$bdd=new MyPdo;
    }
    catch(PDOException $e){
    	echo "argggggggggggggg".$e->getMessage();
    }
    ?>

    et la classe MyPdo est définie dans MyPdo.php :
    Code php : 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
    <?php
    error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE);
    ini_set('display_errors','1'); 
    // MyPDO
     // ls : la classe MyPdo hérite de la classe PDO (extends)
    class MyPdo extends PDO {
     
    	static public $DB_NAME = "su_dev_eis"; // ls : static public, je sais + pourquoi...
     
    	static public $HOST = "localhost";
     
    	// $USER = $_SERVER["PHP_AUTH_USER"];
     
    	//static public $PASS =$_SERVER["PHP_AUTH_PW"];
     
    // ls : le constructeur de MyPdo appelle le constructeur de PDO en lui passant ses paramètres	
    	function __construct() {
    	/* ls : la variable $pdo_options, ça date de ma formation de 2012 */ 
    	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    	$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;//important sur les configs récentes
    	$pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;//pour le mode objet
    	$pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";//pour l'utf-8
     
    	/* ls : connexion PDO : on instancie la classe, qui dérive de la classe PDO (fournie par PHP5) (les paramètres pour wampserver sont host="localhost",
    	user="root" et pwd="") */
    	parent::__construct('mysql:host=' . MyPdo::$HOST . ';dbname=' . MyPdo::$DB_NAME, "root","", $pdo_options);
     
    	}
     
    }
    // fin MyPDO
    ?>
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Si MyPdo.php est correctement inclus (ce qui semble être le cas), il n'y a rien d'anormal. Il y a forcément quelque chose qui cloche dans le reste du code alors. Peux-tu montrer authenticate.php (au moins jusqu'à la ligne 22)?

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Je te remercie d'essayer de m'aider !

    authenticate.php :

    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
    41
    42
    43
    44
    <?php
    error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE); // ls : affichage des erreurs PHP en filtrant les erreurs de notice et les erreurs "deprecated"
    header('Content-type: text/html; charset=UTF-8');	// ls : encodage en utf-8 (encoder qd même le fichier (menu "encodage" de Notepad++))
     
    function authentification()
    {
    	GLOBAL $user;		// ls : var GLOBAL : la fct y accède (lecture et écriture) sans avoir à les passer en paramètre (GLOBAL<>LOCAL)
    	GLOBAL $pass;
    	GLOBAL $dbase;
    	// ls : je mets le user et le pwd qui marchent pour wampserver
    	$entered_user = $_SERVER["PHP_AUTH_USER"]="root";
    	$entered_pass = $_SERVER["PHP_AUTH_PW"]="";
     
    	include_once "connect.php"; // ls : on effectue une connection (_once pour le faire une seule fois)
    	if (isset($bdd)) echo "connecté<br/>";
     
    	if (isset($entered_user) && isset($entered_pass)) {	// on teste l'existence des var. superglobales 
    		/* si existent, connexion à bdd mysql "su_dev_eis" et lecture table "users" */
    		$auth=false;
     
    		$sql = "SELECT * FROM users";
    		echo"<br/>var_dump(bdd) :";var_dump($bdd);
    		$qid = $bdd->prepare($sql);
    		$qid->execute();	// ls : exécution (PDO) de la requête (préparée, même si ça sert à rien)
    		while( $ligne=$qid->fetch(PDO::FETCH_OBJ) ) // ls : ligne par ligne, on retourne un objet dont chq propriété est une colonne de la table
    			if (($ligne->user == $entered_user) && ($ligne->password == $entered_pass)) {
    	// on set la var $auth et on positionne les var globales $user et $pass
    				$auth = true;
    				$user=$entered_user;
    				$pass=$entered_pass;
    			}
     
     
    	}
    	$auth=1; // ls : forçage de l'authentification
     
    	return $auth;
    }
    $auth=authentification();
    /*if ($auth) {
    	include "connect.php";
    }*/ // ls : sert à rien car déjà fait
     
    ?>
    Les commentaires "ls" (mes initiales), c'est pour faciliter le relecture.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Ton code fonctionne parfaitement chez moi. J'ai un fichier MyPDO.php, un fichier connect.php (qui doit inclure MyPDO.php) et authenticate.php qui inclut connect.php dans la fonction authentication.

    - Es-tu sûr que le nom de la base, l'utilisateur et le mot de passe sont corrects?
    - Es-tu sûr de ne pas inclure connect.php deux fois dans authenticate.php? Il est déjà inclus dans la fonction authentication()
    - Essaie de tout mettre dans un seul fichier, et regarde si ça marche ou pas. Si ça marche, le problème est dans l'inclusion des fichiers.

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    En voulant tout mettre dans un seul fichier, j'ai trouvé la solution : déclarer la variable $bdd comme GLOBAL (dans index.php, le fichier principal qui appelle tout le monde et dans authenticate.php)(et dans index.php, il y avait un appel en trop à la fonction authentification() vu que c'est déjà fait dans authenticate.php)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Content que le problème soit résolu, mais déclarer une variable comme global n'est jamais une bonne solution.

    Ton problème est un problème de portée: en incluant connect.php dans la fonction authentification(), tu limites la portée de la variable $bdd à cette fonction uniquement, la variable n'existe pas au-delà. La déclarer globale résout ce problème, mais est un signe de mauvaise conception. Les variables globales (ou statiques, pour les classes) sont très problématiques.

    Une meilleure solution serait d'inclure connect.php avant la fonction authentification, et de modifier la signature d'authentification en passant $bdd en paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    include('connect.php');
     
    function authentification($bdd) {
     //le reste est inchangé, enlève juste le include_once.

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Je te remercie d'être intervenu ; j'ai adopté ta proposition...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

Discussions similaires

  1. Connexion locale possible, mais distante impossible
    Par dehorter olivier dans le forum Connexion aux bases de données
    Réponses: 8
    Dernier message: 05/06/2015, 13h19
  2. Réponses: 0
    Dernier message: 18/06/2009, 21h26
  3. [WIN ME] Connexion via ADSL avec ME impossible
    Par stanley dans le forum Windows 2000/Me/98/95
    Réponses: 21
    Dernier message: 08/04/2007, 19h55
  4. [Système] Fichier existant mais exec impossible
    Par Fluckysan dans le forum Langage
    Réponses: 7
    Dernier message: 24/01/2007, 13h30
  5. [JDBC] Connexion à la base de donnée impossible
    Par OverCat dans le forum JDBC
    Réponses: 6
    Dernier message: 20/12/2005, 15h39

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