[code]<?php
class Membre {
public function __construct(){
$host = ‹ mysql:host=truc.com;dbname=machin ›;
$user = ‹ bidule ›;
$mdp = ‹ chose ›;
$bdd = new PDO($host,$user,$mdp, array (PDO::MYSQL_ATTR_INIT_COMMAND => ‹ SET NAMES utf8 ›));
}
public function champs() {
$champs = $bdd->query('SELECT * FROM BFC');
$donnees = $champs->fetch();
$champs->closeCursor();
return $donnees['pseudo'];
}
public $bdd; // inutile en PHP ?
}
?>[/code]
j’obtiens :
Fatal error: Call to a member function query() on a non-object in /home/base.php on line 16
($champs = $bdd->query('SELECT * FROM BFC');)
J’ai un peu tout essayé (d’où les public partout)
edit : et la page qui appelle la fonction :
<?php
include("base.php");
session_start();
if (!isset ($_SESSION['login'])||$_SESSION['login'] == false) header("location:index.php");
$memb1 = new Membre();
echo $memb1->champs();
?>
J’ai un peu modifié l’approche mais le problème persiste :
Dans une première page ‘accueil’, je crée l’objet instancié de PDO que je mets dans une variable de session :
session_start();
$bdd = $bdd = new PDO($host,$user,$mdp, array (PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
$_SESSION['base'] = &$bdd;
puis dans une autre page, un objet Membre fait appel à la méthode query de l’objet PDO (source du problème apparemment) :
[code]<?php
session_start(); //avant l'include
include("base.php");
$memb1 = new Membre();
echo $memb1->champs();
?>[/code]
où base.php est le fichier suivant :
<?php
class Membre {
public function champs() {
$objetbase = &$_SESSION['base'];
$champs = $objetbase->query('SELECT * FROM BFC');
$donnees = $champs->fetch();
$champs->closeCursor();
return $donnees['pseudo'];
}
}
?>
C’est sûr que la fonction champs() écrite simplement sans être la méthode d’un objet devrait fonctionner mais mon objet Membre doit devenir indispensable (j’ai du mal à raisonner autrement que POO maintenant)
edit : dernière modif qui ne résout rien :
j’instancie Membre en passant l’objet PDO en paramètre au constructeur
error.log devrait être dans le répertoire où se trouve le fichier causant l’erreur, non ? Je ne l’y vois pas… (sur le serveur)
Quoi qu’il en soit, la connexion est faite et la fonction retourne bien le pseudo quand je la sors de la classe Membre.
Finalement, la difficulté semble provenir du passage par la variable de session. J’ai pourtant déjà fait l’expérience avec un autre objet que je créais. Ici, l’instance de PDO devient null quand elle arrive dans le constructeur.
Edit : Ah oui, la différence c’est que je faisais un include de la classe en question. PDO est natif, un include donnera rien ?
[code]Eeeeh perdu. Les objets PDO* ne peuvent pas être sérialisés donc on ne peut pas les mettre dans une variable de session car ces données sont supposées être linéarisées (ou sérialisées) ce qui signifie qu’elles seront transformées sous forme de chaine de caractères dans le but d’être mises dans le fichier de session d’apache.
Vu que les objets PDO encapsulent des ressources, ce n’est pas possible à moins d’utiliser __sleep et __wakeup.
La solution à ton problème est de créer un Singleton pour PDO et d’ouvrir ta connection en tant que persistante pour que d’une page à l’autre tu utilise toujours le même socket.