Fonction PDO prepare
Bonjour a tous , je poste ici car j'ai un problème avec mon code php . J'ai éssayé de coder orienté objet le mieux possible en utilisant (sur les conseil d'elmsroth) des singletons , notamment pour ma classe qui gère la connexion sql ou encore pour ma classe de configuration .

Alors là vous me direz , pourquoi faire une classe de configuration ? Je vous répondrais que ça me parait plus souple et mieux . Je préviens aussi que mon code est peut être mal fait , merci de me dire ce qui ne pas aussi Langue

Donc je vais vous expliquer ce qui ne va pas :

J'ai mon index.php

Code PHP :
<?php
require("/includes/init.php");

$site->GetNews(5);

?>

$site est initialisé ici (init.php)

Code PHP :
<?php
define
('ROOTPATH''http://'.$_SERVER['HTTP_HOST'], true);

require(
"/classes/config.class.php");
require(
"/classes/sql.class.php");
require(
"/classes/site.class.php");

$config config::getInstance();
$site site::getInstance();
$connexion sql::getInstance($config->GetMysqlUser() , $config->GetMysqlPass() , $config->GetMysqlPort(), $config->GetMysqlAdress() , $config->GetSiteDBName());

?>

Donc après ma classe de config

Code PHP :
<?php
class config
{
    private static 
$configInstance NULL;
    
    
/* ===== Mysql ===== */
    
private static $mysqluser 'root'//Utilisateur Mysql
    
private static $mysqlpass '';//Pass Mysql
    
private static $mysqladress 'localhost';//Adresse du serveur mysql
    
private static $mysqlport 3306;//Port Mysql
    
private static $CharactersDB 'characters';//Nom de votre DB characters
    
private static $WorldDB 'world';//Nom de votre DB world
    
private static $AccountDB 'realmd';//Nom de votre DB account
    
private static $SiteDB 'site';//Nom de votre DB site
    
    
private function __construct()
        {
            
        }
        
    public static function 
getInstance()
       {
               if(
is_null(self::$configInstance)) 
               {
                       
self::$configInstance = new config();
               }
                       return 
self::$configInstance;
        }
    
    public static function 
GetMysqlUser()
        {
            if(isset(
self::$mysqluser))
                return 
self::$mysqluser;
        }
    
    public static function 
GetMysqlPass()
        {
            if(isset(
self::$mysqlpass))
                return 
self::$mysqlpass;
        }
    
    public static function 
GetMysqlAdress()
        {
            if(isset(
self::$mysqladress))
                return 
self::$mysqladress;
        }
        
    public static function 
GetCharactersDBName()
        {
            if(isset(
self::$CharactersDB))
                return 
self::$CharactersDB;
        }
    
    public static function 
GetWorldDBName()
        {
            if(isset(
self::$WorldDB))
                return 
self::$WorldDB;
        }
        
    public static function 
GetAccountDBName()
        {
            if(isset(
self::$AccountDB))
                return 
self::$AccountDB;
        }
        
    public static function 
GetSiteDBName()
        {
            if(isset(
self::$SiteDB))
                return 
self::$SiteDB;
        }
        
    public static function 
GetMysqlPort()
        {
            if(isset(
self::$mysqlport))
                return 
self::$mysqlport;
        }
}
?>

Ma classe site

Code PHP :
<?php 

class site 
{
    private static 
$SiteInstance NULL;
    private function 
__construct()
        {
            
        }    
    public function 
getInstance()
        {
            if(
is_null(self::$SiteInstance)) 
                 {
                        
self::$SiteInstance = new site();
                 }
                 return 
self::$SiteInstance;
        }
    public function 
GetNews($id_min $id_max)//Fonction pour les news
        
{
            
$config config::getInstance();
            
$connexion sql::getInstance($config->GetMysqlUser() , $config->GetMysqlPass() , $config->GetMysqlPort(), $config->GetMysqlAdress() , $config->GetSiteDBName());
            
$requête_news $connexion->prepare("SELECT id , auteur , titre , texte FROM news ORDER BY id DESC LIMIT ".$id_min." ,".$id_max."");
            
$requête_news->execute();

            while(
$new $requête_news->fetch(PDO::FETCH_OBJ))
                {
                    echo 
'id :'.$new['id'].'<br />';
                    echo 
'auteur :'.$new['auteur'].'<br />';
                    echo 
'titre :'.$new['titre'].'<br />';
                    echo 
'Contenu :'.$new['texte'].'<br />';
                }
        }
        
    public function 
GetServerStatut($ip $port)
        {
            
        }
}
?>

ma classe sql

Code PHP :
<?php
class sql
{
    private static 
$SqlInstance null;
    
    private function 
__construct($mysqluser $mysqlpass $mysqlport $mysqladress $db)
        {
            
$bdd NULL;

            try
            {
                
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
                
$bdd = new PDO('mysql:host='.$mysqladress.';dbname='.$db,$mysqluser$mysqlpass $pdo_options);
            }    
            catch (
Exception $e)
            {
                die(
'Erreur : ' $e->getMessage());
            }
            return 
$bdd;
        }
        public static function 
getInstance($mysqluser $mysqlpass $mysqlport $mysqladress $db)
        {
                 if(
is_null(self::$SqlInstance)) 
                 {
                        
self::$SqlInstance = new sql($mysqluser $mysqlpass $mysqlport $mysqladress $db);
                 }
                 return 
self::$SqlInstance;
        }
}

?>

Et donc ce qui ne va pas c'est la ligne

Code PHP :
$requête_news $connexion->prepare("SELECT id , auteur , titre , texte FROM news ORDER BY id DESC LIMIT ".$id_min." ,".$id_max.""); 

J'ai l'erreur

méchant php a écrit :( ! ) Fatal error: Call to undefined method sql::prepare() in C:\wamp\www\site\classes\site.class.php on line 22
Call Stack
# Time Memory Function Location
1 0.0005 668368 {main}( ) ..\index.php:0
2 0.0143 731376 site->GetNews( ) ..\index.php:3

Et là je bloque . A mon avis il accède pas a l'objet sql qui est un objet sur le model de la classe PDO (créé dans ma classe sql je le rapel Langue)

Donc que faire ?

Merci
Pourquoi utilise rprepare avec ça ? Tu n'utilise pas de VRAIES requêtes péparées. Je pense que tu devrais lire ceci : http://www.siteduzero.com/tutoriel-3-347...x-bdd.html
Ouai c'est vrai , donc j'ai changé mon code par :

[code=php] public function GetNews($id_min , $id_max)//Fonction pour les news
{
$config = config::getInstance();
$connexion = sql::getInstance($config->GetMysqlUser() , $config->GetMysqlPass() , $config->GetMysqlPort(), $config->GetMysqlAdress() , $config->GetSiteDBName());
$requête_news = $connexion->query("SELECT id , auteur , titre , texte FROM news ORDER BY id DESC LIMIT ".$requête_news->quote($id_min, PDO::PARAM_STR)." ,".$requête_news->quote($id_max, PDO::PARAM_STR)."");

while($new = $requête_news->fetch(PDO::FETCH_OBJ))
{
echo 'id :'.$new['id'].'<br />';
echo 'auteur :'.$new['auteur'].'<br />';
echo 'titre :'.$new['titre'].'<br />';
echo 'Contenu :'.$new['texte'].'<br />';
}
}[/code]

Mais là pareil il ne reconnait pas le ->query(..)

Citation :( ! ) Fatal error: Call to undefined method sql::query() in C:\wamp\www\site\classes\site.class.php on line 135
Call Stack
# Time Memory Function Location
1 0.0006 673600 {main}( ) ..\index.php:0
2 0.0149 768904 site->GetNews( ) ..\index.php:30
Normal il est possible que ton objet ne soit pas instancié correctement.

As-tu fait des echo sur a eu près tout tes retours de fonction pour voir si ça te retournais des trucs corrects ?

Pour le coup la classe config ne sert pas a grand chose dans le cadre ou de simples constantes auraient suffit, l'objet c'est bien mais il ne faut pas en abuser là ou ce n'est pas nécessaire. Clin
Donc j'ai enlevé cette fameuse classe config , maintenant a l'init (dans le fichier init.php) j'ai ça

[code=php]<?php
define('ROOTPATH', 'http://'.$_SERVER['HTTP_HOST'].'/site', true);

require(ROOTPATH."/classes/sql.class.php");
require(ROOTPATH."/classes/site.class.php");
require(ROOTPATH."/includes/config.php");

session_start();

$site = site::getInstance();
$connexion = sql::getInstance($mysqluser , $mysqlpass , $mysqladress , $SiteDB);

?>
[/code]

Et là , alors que tout a l'air bon , une erreur apparait Huh (bon ok j'arrete Rire)

Citation :( ! ) Fatal error: Class 'site' not found in C:\wamp\www\site\includes\init.php on line 10
Call Stack
# Time Memory Function Location
1 0.0006 673968 {main}( ) ..\index.php:0
2 0.0011 681744 require( 'C:\wamp\www\site\includes\init.php' ) ..\index.php:2

Heu la je bloque oO
require(ROOTPATH."/classes/site.class.php"); peut etre qu'il ne le charge pas bien c tout
je pensais bien que ça venais de la mais que faire ?
Ben tu trouve une fonction qui te calcule ton rootpath correctement Clin
ok donc voilà mon init :

[code=php]<?php
define('ROOTPATH', $_SERVER['DOCUMENT_ROOT'].'/site', true);

require(ROOTPATH."/includes/config.php");
require(ROOTPATH."/classes/sql.class.php");
require(ROOTPATH."/classes/site.class.php");


session_start();

$site = site::getInstance();
$connexion = sql::getInstance($mysqluser , $mysqlpass , $mysqladress , $SiteDB);

?>
[/code]

Donc j'initialise bien mes variables globales avant mes classes et là j'ai

Citation :( ! ) Notice: Undefined variable: mysqluser in C:\wamp\www\site\classes\site.class.php on line 134
Call Stack
# Time Memory Function Location
1 0.0003 673600 {main}( ) ..\index.php:0
2 0.0047 739648 site->GetNews( ) ..\index.php:30


( ! ) Notice: Undefined variable: mysqlpass in C:\wamp\www\site\classes\site.class.php on line 134
Call Stack
# Time Memory Function Location
1 0.0003 673600 {main}( ) ..\index.php:0
2 0.0047 739648 site->GetNews( ) ..\index.php:30


( ! ) Notice: Undefined variable: mysqladress in C:\wamp\www\site\classes\site.class.php on line 134
Call Stack
# Time Memory Function Location
1 0.0003 673600 {main}( ) ..\index.php:0
2 0.0047 739648 site->GetNews( ) ..\index.php:30


( ! ) Notice: Undefined variable: SiteDB in C:\wamp\www\site\classes\site.class.php on line 134
Call Stack
# Time Memory Function Location
1 0.0003 673600 {main}( ) ..\index.php:0
2 0.0047 739648 site->GetNews( ) ..\index.php:30


( ! ) Fatal error: Call to undefined method sql::query() in C:\wamp\www\site\classes\site.class.php on line 135
Call Stack
# Time Memory Function Location
1 0.0003 673600 {main}( ) ..\index.php:0
2 0.0047 739648 site->GetNews( ) ..\index.php:30

C'est a n'y plus rien comprendre ...
Si $mysqluser ne change pas.. pourquoi tu utilise une VARIABLE ?? hein ??

Pourquoi t'a pas un fichier de config avec toutes tes constantes ?

Et t'es pas obligé de lancer au constructeur de SQL tes paramètres au ::getInstance, si tu ne gère pas plusieurs connexions.

Moi j'ai une classe statique "core" du site qui gère plein de routines de bases.
genre
Code PHP :
core::initSession(); // se charge de m’initialiser correctement la session (et permet de rééfectuer le login automatique si il y a un cookie avec une authkey valide.
 
$sql core::getSQLWeb(); // me renvois l'instance de connexion SQL pour mon serveur Web, mais j'ai aussi un core::getSQLGame() pour la connexion au serveur de jeu
 
core::getClass("Character");   // me fait un require correct et bien calculé de "/lib/class/class.Character.php" etc... 

Retourner en haut Accueil