Ensuite je souhaite faire des requêtes dans une classe existante.
personne.php
<?php
class personne {
var $id_pers;
var $service;
var $nom;
var $prenom;
function personne($login) {
$requete = 'SELECT * FROM personnes WHERE login = "'.$login.'"';
$resultat = $bdd->query($requete);
// ...
?>
Est-ce que si dans config.php j'englobe tout dans une classe et qu'après dans l'autre fichier je fais extends Maclasse
il aura accès à $bdd
?
Et là il ne connaît pas l'objet $bdd
même avec l'include
du fichier de config. Des idées ?
Ca t'affiche undefined variable : bdd ?
$bdd n'est pas définie dans la classe.
Essaye de rajouter ça :
<?php
class personne {
var $id_pers;
var $service;
var $nom;
var $prenom;
function personne($login) {
$requete = 'SELECT * FROM personnes WHERE login = "'.$login.'"';
global $bdd;
$resultat = $bdd->query($requete);
// ...
?>
Au pire tu peux créer une classe connexion avec l'attribut $bdd en static :
<?php
class Connexion {
public static function bdd() {
// fichier contenant les informations pour se connecter
$fichier = 'config/sql.ini';
if(file_exists($fichier)) {
$config = parse_ini_file($fichier, true);
$moteur = $config['SQL']['moteur'];
$hote = $config['SQL']['hote'];
$login = $config['SQL']['login'];
$mdp = $config['SQL']['mdp'];
$base = $config['SQL']['base'];
try {
$bdd = new PDO($moteur .':host='. $hote .';dbname='. $base, $login, $mdp);
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
die('Erreur : '. $e->getMessage());
}
return $bdd;
}
}
}
class personne {
var $id_pers;
var $service;
var $nom;
var $prenom;
function personne($login) {
$requete = 'SELECT * FROM personnes WHERE login = "'.$login.'"';
$query = Connexion::bdd()->query($requete);
$resultat = $query->fetch();
}
}
?>
A modifier car j'ai fait un vulgaire copier/coller, mais l'idée est là.
Je ne sais pas si ça fonctionne j'ai rarement fait de la POO en PHP, mais à tester si ça te convient davantage.
Je dirait même pour ceci
public function __construct($pNom, $pPrenom, $pDatabase) {
$this->nom = $pNom;
$this->prenom = $pPrenom;
$this->database = $pDatabase;
}
remplacer par ceci :
public function __construct($pNom, $pPrenom, Database $pDatabase) {
$this->nom = $pNom;
$this->prenom = $pPrenom;
$this->database = $pDatabase;
}
comme sa le dernier argument on attent un objet de type Database comme sa on est sur de na pas mettre autre chose comme un int ou array
mais bon le plus simple si tu travaille qu'avec des classe c'est d'herité une classe de PDO class maClass extends PDO
Voilà j'ai rectifié le parse error et ça fonctionne, tout du moins chez moi.
Ainsi tu n'as pas besoin d'instancier d'object pour établir une connexion.
Tu peux aussi faire ceci dans tes classes pour ne pas être dépaysagé :
$bdd = Connexion::bdd();
Puis faire ta requête habituelle.
Bon désolé là je comprends plus rien, je suis pas habitué à l'objet.
Je vous explique ce que je souhaite :
- avoir une classe qui gère la connexion avec MySQL (PDO) avec une méthode qui exécute les requêtes SQL (query()).
- je veux pouvoir y avoir accès depuis n'importe où pour exécuter mes requêtes, que ce soit dans une classe ou non.
<?php
class personne extends Connexion {
public function personne($login) {
$requete = "SELECT * FROM personnes WHERE login = '".$login."'";
$resultat = Connexion::getBdd()->requete($requete);
//...
}
}
?>
L'erreur est : "Fatal error: Call to a member function requete() on a non-object"
Je n'arrive pas à exécuter ma requête depuis une autre classe.
En revanche ceci est tout à fait normal
Tu ne declare pas l'objet pour construire la connexion :
public function personne($login) {
$requete = "SELECT * FROM personnes WHERE login = '".$login."'";
$resultat = Connexion::getBdd()->requete($requete);
//...
}
=>
public function personne($login) {
$connexion = new Connexion();
$requete = "SELECT * FROM personnes WHERE login = '".$login."'";
$resultat = $connexion->getBdd()->requete($requete);
//...
}
et aussi retire le extends Connexion de ta classe personne car t'en a aucunne utilité dans ton cas
Attention ! Nullement besoin d'une classe pour gérer la connexion à la base de donnée quand on utilise PDO !
La connexion doit se faire en dehors de toute classe, en début de script.
Et comme l'indique jordan, on transmet l'objet PDO aux classes en ayant besoin via leur constructeur.
× 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.