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 :

emplacement de la déclaration de la bdd


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    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 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut emplacement de la déclaration de la bdd
    Bonsoir,

    mon idée était de ne la placer que dans le fichier principal et que la bdd serait ainsi connue dans les fichiers inclus dans ce fichier principal ; or si je supprime cette déclaration dans les fichiers inclus, dans un des fichiers inclus, j'obtiens un message d'erreur (Base table or view not found) à la première exécution d'une requête SQL ; donc comment faire, sachant aussi que je cherche à éviter l'autre message d'erreur (cannot redeclare...) ?
    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
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    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 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Malgré l'absence de réponse pour le moment, j'ai essayé d'avancer mais je n'arrive pas à supprimer les erreurs. J'explique mes essais :

    - si je ne déclare la bdd que dans le fichier principal :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    include_once dirname(__DIR__)."\pdo\connect_mysql.php";
    if ((!isset($bdd)) OR ($bdd!=NULL))
    	$bdd=connect_mysql();
    avec connect_mysql.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
    <?php
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    function connect_mysql() {
    include_once (dirname(__DIR__).'\pdo\new\MyPdo.php');
     
    try{
    				$bdd = new MyPdo();
    				return($bdd);
    			}
    catch(PDOException $e){
    				echo "argggggggggggggg".$e->getMessage();
    				return(FALSE);
    			}
    }
     
    ?>
    et 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
    <?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"; 
    	static public $HOST = "localhost";
    	static public $USER ="root";
    	static public $PASS ="root";
     
    // 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, MyPdo::$USER,MyPdo::$PASS, $pdo_options);
    //MyPdo::$USER
    	}
     
    }
    // fin MyPDO
    ?>
    message d'erreur dans les fichiers inclus :
    Fatal error: Call to a member function prepare() on a non-object in...
    mais en fait uniquement si l'accès à MYSQL se fait dans une fonction et pas si elle a lieu directement dans le code du fichier. Donc du coup, quand cet accès se fait dans une fonction, j'ai décommenté if ((!isset($bdd)) OR ($bdd!=NULL)) $bdd=connect_mysql(); (mais pas /* include_once dirname(__DIR__)."\pdo\connect_mysql.php";*/).

    - un fichier qui accède à MySQL est lui-même inclus à la fois dans le fichier principal et dans un autre fichier (comme il y a de l'affichage, impossible de faire include_once). Dans le fichier principal, pas de problème, mais dans l'autre, si je mets juste if ((!isset($bdd)) OR ($bdd!=NULL)) $bdd=connect_mysql();,
    Fatal error: Call to undefined function connect_mysql() in ...
    et si je rajoute include_once dirname(__DIR__)."\pdo\connect_mysql.php";
    Fatal error: Cannot redeclare class MyPdo in ...
    donc, que faudrait-il faire ?
    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

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Dans chaque fonction :

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    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 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse ; il paraît en effet très logique d'étendre la portée de la variable $bdd. De ce fait, je fais la connexion à MySQL uniquement dans la page principale :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    global $bdd;
     
    include_once dirname(__DIR__)."\pdo\connect_mysql.php";
    if ((!isset($bdd)) )
    	$bdd=connect_mysql();
    puis dans une autre page, incluse elle-même dans un autre fichier que la page principale :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    session_start();
    global $bdd;
    ...
    $query1="SELECT * from users WHERE user='".$_SESSION['user']."'";
    $qid = $bdd->prepare($query1);
    $qid->execute();
    et
    Fatal error: Call to a member function prepare() on a non-object in...
    mais si j'ajoute un var_dump dans le fichier, elle est nulle...
    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

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Quelle peut bien être l'utilité, dans ton use case, de mettre la connexion dans une fonction ?
    Quelle est aussi l'utilité de préparer une requête exécutée une seule fois et sans donnée sensible ?
    Si ta page est inclue que vient faire du coup un session_start() en plein milieu du code ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    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 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse.

    Si la connexion est dans une fonction, c'est que au départ, je pensais le faire plusieurs fois ; c'est vrai que ce n'est plus utile, mais ça n'empêche pas de marcher...

    La requête n'a nul besoin d'être préparée, mais par habitude, j'ai un seul code pour exécuter les requêtes...

    En fait, comme la déclaration de la variable $bdd en globale ne marchait pas, j'ai voulu la transmettre par session.

    Je me demandais effectivement s'il n'y avait pas trop de session_start() ; je l'ai donc supprimé des fichiers inclus et laissé uniquement dans le fichier principal ; dans les fichiers inclus, je mets juste $bdd=$_SESSION['bdd']; et mysql_connect() contient l'affectation de cette variable :
    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
    <?php
    //global $bdd;
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    function connect_mysql() {
    include_once (dirname(__DIR__).'\pdo\new\MyPdo.php');
     
    try{
    				$bdd = new MyPdo();
    				$_SESSION['bdd']=$bdd;
    				return($bdd);
    			}
    catch(PDOException $e){
    				echo "argggggggggggggg".$e->getMessage();
    				return(FALSE);
    			}
    }
     
    ?>
    par contre, dans un des fichiers inclus :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    $bdd=$_SESSION['bdd'];
    ...
    var_dump($bdd);?>
    affiche encore 0
    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

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    En fait, comme la déclaration de la variable $bdd en globale ne marchait pas, j'ai voulu la transmettre par session.


    En plus, il me semble que ce n'est pas la première fois que tu fais ce coup là !

    Comment sauvegarder une variable dans une session ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    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 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bovino Voir le message

    En plus, il me semble que ce n'est pas la première fois que tu fais ce coup là !
    Quel coup ? En regardant la FAQ, j'ai pensé que mon erreur était de mettre des simples quotes au lieu de doubles ; j'ai donc corrigé : $_SESSION["bdd"]=$bdd; Mais pas d'amélioration...
    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

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour Laurent,
    Citation Envoyé par laurentSc Voir le message
    ..., comme la déclaration de la variable $bdd en globale ne marchait pas,...
    Faux.
    C'est seulement toi qui ne sais pas l'utiliser correctement.

    Au lieu de "lâcher l'affaire", tu ferais mieux d'essayer de comprendre comment ça fonctionne.


    Et pour ta peine, COMMENTE tes lignes de code, avec des mots : ça devrait t'aider à comprendre.

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    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 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour Laurent,

    Faux.
    C'est seulement toi qui ne sais pas l'utiliser correctement.
    Admettons. Je vais tenter de décrire le code actuel :
    - la page principale (indexpage.php) fait un lien html sur la page indexcal.php
    - la page principale contient la connexion à MySQL et la variable de connexion est déclarée en global :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    error_reporting(E_ALL ^ (E_NOTICE|E_WARNING|E_DEPRECATED));
    // déclaration variable $bdd en global
    global $bdd;
    header('Content-type: text/html; charset=UTF-8');
     
    //inclusion du fichier de connection
    include dirname(__DIR__)."\pdo\connect_mysql.php";
    // si $bdd est vide, appel fct connect_mysql() qui lance la connexion et retourne la var $bdd
    if ((empty($bdd))) {
    	$bdd=connect_mysql();
    	}
    ...

    - La page indexcal.php inclue la page header.inc.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    global $bdd;
    ...
    include dirname(__DIR__)."\header.inc.php";
    ...

    - La page header.inc.php se connecte à MySQL en utilisant la vvariable globale $bdd, mais celle-ci est vue comme vide...
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    global $bdd;
    ...
    var_dump($bdd);
    et le var_dump affiche 0.

    Y a-t-il quelque chose d'incorrect (ou de pas clair) là dedans ?
    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

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Y a-t-il quelque chose d'incorrect (ou de pas clair) là dedans ?
    A peu près tout.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // déclaration variable $bdd en global
    global $bdd;
    Encore faut-il savoir ce que ça signifie, pour savoir où l'utiliser...

    Je ne suis même pas sûr que tu saches faire la différence entre fichier inclus et fichier indépendant.
    • Quand le fichier est indépendant, global $bdd; ne te dispense pas de faire d'abord la connexion !
    • global $bdd; n'est même pas utile dans les fichiers inclus !
    • Il est utile DANS LES FONCTIONS.

  12. #12
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 384
    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 384
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Je te remercie pour la petite révision ; je savais à peu près tout, sauf que la variable n'est pas connue dans les fichiers indépendants et que donc il faut refaire la connexion.

    Cela dit, j'ai un message d'erreur :
    Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\devjupiter_serveur291214\pdo\authenticate.php on line 31
    sachant que indexpage.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    error_reporting(E_ALL ^ (E_NOTICE|E_WARNING|E_DEPRECATED));
    // déclaration variable $bdd en global
    global $bdd;
    header('Content-type: text/html; charset=UTF-8');
    //inclusion du fichier de connexion
    include dirname(__DIR__)."\pdo\connect_mysql.php";
    ...
    include dirname(__DIR__)."\pdo\authenticate.php";
    ...
    et que authenticate.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
    <?php
     
    function authentification()
    {
    ....
    $sql = 'select * from `users`';
    $qid = $bdd->prepare($sql);  // la ligne 31
    $qid->execute();
    ...
    return $auth;
    }
    include ((__DIR__).'/config/config.php');
    $auth=authentification();
    ?>

    au passage, comme je ne me connecte qu'à un seul endroit, j'ai supprimé la fonction connect_mysql() et mis directement la connexion dans le code de la page (qui est incluse)
    connect_mysql.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    include_once (dirname(__DIR__).'\pdo\new\MyPdo.php');
    header('Content-type: text/html; charset=UTF-8');
    //// connexion
    try{
    	$bdd = new MyPdo();
    }
    catch(PDOException $e){
    	echo "argggggggggggggg".$e->getMessage();
    	return(FALSE);
    }		
    ?>

    et config.php est comme tu me l'avais montré :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    // -----------------------------------------------------------
    // CONFIGURATION : 
    // -----------------------------------------------------------
    if(!defined('SITE_URL_WWW'))	define('SITE_URL_WWW',	'localhost/devjupiter_serveur291214/pdo');  // en TEST LOCAL, A REMPLACER PAR...
    //if(!defined('SITE_URL_WWW'))	define('SITE_URL_WWW',	'www.mon-site-en-ligne.com'); // en PRODUCTION
    if(!defined('SITE_URL_WWW_old'))	define('SITE_URL_WWW_old',	'localhost/devjupiter_serveur291214/pdo/copie_du_serveur');
    if( !defined('SITE_URL_HTTP'))	define('SITE_URL_HTTP',	'http://'.SITE_URL_WWW);
    ?>
    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

  13. #13
    Invité
    Invité(e)
    Par défaut
    J'ai le sentiment désagréable que tu jettes des bouts de code en vrac dans tes fichiers, en espérant qu'ils vont s'organiser tout seul...

    J'ai un scoop pour toi :
    L'ordre des instructions a une grande importance !

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

Discussions similaires

  1. l'emplacement de postgresql ou le schema de la BDD
    Par alassanediakite dans le forum Odoo (ex-OpenERP)
    Réponses: 1
    Dernier message: 27/02/2012, 13h49
  2. [phpMyAdmin] changer l'emplacement de BDD avec Wamp
    Par redoran dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 16/02/2012, 10h43
  3. problème de sauvegarde la bdd dans l'emplacement sélectionnée?
    Par salimo79 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/03/2011, 11h46
  4. Réponses: 2
    Dernier message: 28/10/2010, 16h38
  5. [JAVA DERBY] emplacement bdd
    Par bressan dans le forum Persistance des données
    Réponses: 2
    Dernier message: 14/09/2010, 08h53

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