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

Vue hybride

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    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...) ?

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    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 ?

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

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    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...

  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 : 55
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    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
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    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

+ 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