Page 1 sur 2

Probleme include dans un fichier

Posté : 27 déc. 2006, 17:38
par the dreamer
Bonjour,

J'ai tenté de créer un objet mysqli pour sortir un peu du mode procédural que je connais déjà, il est placé dans un fichier que j'inclue dans un autre, qui est en fait une classe. Dans celle-ci, j'ai des méthodes qui utilisent l'objet mysqli. Mon souci donc, est que l'include ne fonctionne pas.

J'obtiens ça à chaque fois que je balance des données à partir d'un formulaire : Fatal error: Call to a member function query() on a non-object in C:\wamp\www\essais\includes\classArticle.class.php on line 35

jvais afficher mon code ce sera surement plus simple.

classArticle.php
<?php
	include_once 'config.inc.php';
	
	class article {
		public $title;
		public $text;
		public $categorie;
		public $currentDate;
		public $messageUser;
		public $sql;
		public $stmt;
						
		function __construct(){
			$this->title = "";
			$this->text = "";
			$this->categorie = "";
			$this->sql = "";
			$this->stmt = "";
			$this->messageUser = "<ul id='msgtransmis'><li>Appel du constructeur</li>";//a modifier à la mise en ligne
			$this->currentDate = date("F j, Y, g:i a");  
		}
		
		function set(){
			//recupere les valeurs des champs de formulaire
			$this->title = $_POST['titre'];
			$this->text = $_POST['texte'];
			$this->categorie = $_POST['categorie'];
		}
				
		function creationArticle(){
			//creation d'un article, insertion dans la BDD
			$this->sql = "INSERT INTO `".$nomTable."` (`id`,`titre`,`texte`,`categorie`,`datepublication`) VALUES (``, `".$this->title."` ,`".$this->text."`,`".$this->categorie."`,`".$this->currentDate."`)";
			echo $this->sql;
			
			$this->stmt = $nouvelleConnexion->query($sql);
		
			if($this->stmt === true){
				$this->messageUser .= "<li>Les données ont été insérées.</li>";
				echo $this->messageUser."</ul>";
			}
			else if($this->stmt === false){
				$this->messageUser .= "<li>Les données n'ont pas été insérées.</li>";
				echo $this->messageUser."</ul>";
				exit();
			}
		}
		
		function modifArticle(){
			//recuperation des donnees dans le formulaire, puis UPDATE de l'enregistrement dans la BDD
			$this->sql = "UPDATE articles SET titre='".$titre."', texte='".$texte."', datedermodif='".$this->currentDate."' WHERE id_article='".$id_article."'";
			echo $this->sql;
			
			$this->stmt = $nouvelleConnexion->query($sql);
			
			if($this->stmt === true){
				$this->messageUser .= "<li>Mis à jour.</li>";
				echo $this->messageUser."</ul>";
			}
			else if($this->stmt === false){
				$this->messageUser .= "<li>Les données n'ont pas été insérées.</li>";
				echo $this->messageUser."</ul>";
				exit();
			}
		}
		
		function suppressionArticle(){
			//supprimer l'article, après confirmation du voeu
		}
		
		function previewArticle(){
			//fonction de prévisualisation, qui s'affiche si l'on appuie sur prévisualiser
			echo "<div id='preview'>";
			echo "<h2>".$this->title."</h2>";
			echo "<h3>".$this->categorie."</h3>";
			echo "<h4>".$this->currentDate."</h4>";
			echo "<p>".$this->text."</p>";
			echo "</div>";
		}
				
		function nettoyage(){
			//traitement de la saisie utilisateur
			$this->title = trim($this->title);
			$this->text = trim($this->text);
		}
	}
?>
config.inc.php
<?php
	//fichier de configuration local config.inc.php
	$username = "root";
	$password = "";
	$hostname = "localhost";
	$nomBase = "essai";
	$nomTable = "articles";
		
	//création de l'objet mysqli
	$nouvelleConnexion = new mysqli($hostname,$username,$password,$nomBase);
?>
Merci d'avance pour votre aide :wink:

Posté : 27 déc. 2006, 17:51
par titerm
$nouvelleConnexion est inclue avant la classe. Donc il est vu en tant que var globale.

Ce n'est pas une facon très propre de faire (ca devrait se passer dans ton constructeur). Néanmoins, si tu veux faire comme ca, il suffit que tu déclares ta variable en tant que globale dans les methodes qui ont besoin d'y accéder.


exe:
...
creationArticle(){ 
global $nouvelleConnexion;
...

Posté : 27 déc. 2006, 17:56
par the dreamer
donc toutes les variables que j'ai défini dans mon fichier externe seront vues comme globales :shock: ... jsais pas où j'avais la tête :mrgreen:.

Merci beaucoup, ça fonctionne.

Posté : 27 déc. 2006, 19:38
par the dreamer
J'ai encore une question :mrgreen: ...

J'ai viré le fichier de config et ai mis directement les paramètres dans la classe, maintenant le problème c'est au niveau de ma requête Oo enfin la fonction qui exécute la requête plutôt, ce qui fait que mes données ne sont jamais insérées dans la BDD.

jreposte le code étant donné que jl'ai modifié Oo ...
<?php	
	class article {
		public $title;
		public $text;
		public $categorie;
		public $currentDate;
		public $messageUser;
		public $sql;
		public $stmt;
		
		private $username = "root";
   		private $password = "";
    	private $hostname = "localhost";
   		private $nomBase = "essai";
		private $nomTable = "articles";
		private $nouvelleConnexion;
						
		public function __construct(){
			$this->title = "";
			$this->text = "";
			$this->categorie = "";
			$this->sql = "";
			$this->stmt = "";
			$this->messageUser = "<ul id='msgtransmis'><li>Appel du constructeur</li>";//a modifier à la mise en ligne
			$this->currentDate = date("F j, Y, g:i a");
			$this->nouvelleConnexion = new mysqli($this->hostname,$this->username,$this->password,$this->nomBase) or trigger_error('Connexion a la base impossible', E_USER_ERROR);
		}
		
		function setValuesArticle(){
			//recupere les valeurs des champs de formulaire
			$this->title = $_POST['titre'];
			$this->text = $_POST['texte'];
			$this->categorie = $_POST['categorie'];
		}
				
		function creationArticle(){
			//creation d'un article, insertion dans la BDD
				
			$this->sql = "INSERT INTO `".$this->nomTable."` (`id_article`,`titre`,`texte`,`categorie`,`datepublication`,`datedermodif`) VALUES (``, `".$this->title."` ,`".$this->text."`,`".$this->categorie."`,`".$this->currentDate."`,`".$this->currentDate."`)";
			//echo $this->sql;
			
			$this->stmt = $this->nouvelleConnexion->query($this->sql);
		
			if($this->stmt === true){
				$this->messageUser .= "<li>Les données ont été insérées.</li>";
			}
			else if($this->stmt === false){
				$this->messageUser .= "<li>Les données n'ont pas été insérées.</li>";
				//exit();
			}
			$this->nouvelleConnexion->close();
		}
		
		function modifArticle($id_article,$titre,$texte,$categorie){
			//recuperation des donnees dans le formulaire, puis UPDATE de l'enregistrement dans la BDD
			$this->sql = "SELECT `titre`, `texte`, `datedermodif` FROM `".$this->nomTable."` WHERE id_article=`".$id_article."`";
			$this->stmt = $this->nouvelleConnexion->query($this->sql);
			if ($obj = $this->stmt->fetch_object()){
				$this->title = $obj->titre;
				$this->text = $obj->texte;
				$this->categorie = $obj->categorie;
			}
			else {
				$this->messageUser .= "<li>rien n'est récupéré</li>";
			}
			
			$this->sql = "UPDATE articles SET titre='".$titre."', texte='".$texte."', categorie='".$categorie."', datedermodif='".$this->currentDate."' WHERE id_article='".$id_article."'";
			//echo $this->sql;
			
			$this->stmt = $this->nouvelleConnexion->query($this->sql);
			
			if($this->stmt === true){
				$this->messageUser .= "<li>Mis à jour.</li>";
				echo $this->messageUser."</ul>";
			}
			else if($this->stmt === false){
				$this->messageUser .= "<li>Les données n'ont pas été insérées.</li>";
				echo $this->messageUser."</ul>";
				exit();
			}
			$this->nouvelleConnexion->close();
		}
		
		function suppressionArticle(){
			//supprimer l'article, après confirmation du voeu
		}
		
		function previewArticle(){
			//fonction de prévisualisation, qui s'affiche si l'on appuie sur prévisualiser
			echo "<div id='preview'>";
			echo "<h2>".$this->title."</h2>";
			echo "<h3>".$this->categorie."</h3>";
			echo "<h4>".$this->currentDate."</h4>";
			echo "<p>".$this->text."</p>";
			echo "</div>";
		}
				
		function nettoyageValuesArticle(){
			//traitement de la saisie utilisateur
			$this->title = trim($this->title);
			$this->text = trim($this->text);
		}
	}
?>

^^" j'ai beau retourner et tourner ça dans tous les sens, jvois pas où j'ai pu faire une erreur ...

Posté : 27 déc. 2006, 23:59
par titerm
J'ai pas tout lu mais y a un truc qui me saute au yeux, c'est l'utilisation d'anti-quote au lieu de quote dans une requete insert de les fonctions creationArticle et modifArticle. ` au lieu de '

Posté : 28 déc. 2006, 00:07
par the dreamer
cpas ça qui va changer quelque chose :)

Décidemment jtrouve pas ... et en plus ces this partout Oo, si ça continue jvais reprendre le mode procédural ... m'enfin si quelqu'un a une solution ^^

Posté : 28 déc. 2006, 00:10
par Xenon_54
Comme expliqué précédemment, ta variable de connexion ne sera pas accessible de l'intérieur de ta classe. Il faudra la récupérer ainsi:
$GLOBALS['nouvelleConnexion']
Les antiquotes sont corrects dans tes requêtes. Ne fais pas attention à ces commentaires.

Posté : 28 déc. 2006, 00:54
par the dreamer
j'y arriverais ^^"

jvois pas trop comment l'utiliser dans ma syntaxe pour executer une requête par exemple, j'ai essayé un truc du genre
$this->stmt = $GLOBALS['nouvelleConnexion']->query($this->sql);
jtrouve ça tiré par les chveux ^^" ...

Posté : 28 déc. 2006, 02:10
par Ajoloca
Bonsoir,

Je crois que tu te compliques la vie pour rien.
La solution la plus simple est d'obtenir la connexion en dehors de la class et de la passer en paramètre soit au constructeur soit à l'appel des méthodes qui en on besoin.
config.inc.php
<?php
    //fichier de configuration local config.inc.php
    $username = "root";
    $password = "";
    $hostname = "localhost";
    $nomBase = "essai";
    $nomTable = "articles";
        
    //création de l'objet mysqli
    $nouvelleConnexion = new mysqli($hostname,$username,$password,$nomBase);
?>
Si tu le fais dans le constructeur
class article {
        public $title;
        public $text;
        public $categorie;
        public $currentDate;
        public $messageUser;
        public $sql;
        public $stmt;
        public $cnx;
                        
        function __construct($_cnx){
            $this->title = "";
            $this->text = "";
            $this->categorie = "";
            $this->sql = "";
            $this->stmt = "";
            $this->messageUser = "<ul id='msgtransmis'><li>Appel du constructeur</li>";//a modifier à la mise en ligne
            $this->currentDate = date("F j, Y, g:i a");
            $this->cnx = $_cnx; 
        } 
Et dans tes méthodes tu utilises la connexion de l'objet
function creationArticle(){
            //creation d'un article, insertion dans la BDD
            $this->sql = "INSERT INTO `".$nomTable."` (`id`,`titre`,`texte`,`categorie`,`datepublication`) VALUES (``, `".$this->title."` ,`".$this->text."`,`".$this->categorie."`,`".$this->currentDate."`)";
            echo $this->sql;
            
            $this->stmt = $this->cnx->query($sql);
        
            if($this->stmt === true){
                $this->messageUser .= "<li>Les données ont été insérées.</li>";
                echo $this->messageUser."</ul>";
            }
            else if($this->stmt === false){
                $this->messageUser .= "<li>Les données n'ont pas été insérées.</li>";
                echo $this->messageUser."</ul>";
                exit();
            }
        }
ATTENTION :
Avec cette méthode la connexion ne sera pas conservée d'une page à l'autre (même en passant l'objet en session).

Ce que je te conseille c'est de passer la connexion en paramètre de chaque méthode qui en a besoin comme ceci.
Tu gardes ton fichier de connexion comme l'autre.
Ton constructeur devient comme au début
class article {
        public $title;
        public $text;
        public $categorie;
        public $currentDate;
        public $messageUser;
        public $sql;
        public $stmt;
                        
        function __construct(){
            $this->title = "";
            $this->text = "";
            $this->categorie = "";
            $this->sql = "";
            $this->stmt = "";
            $this->messageUser = "<ul id='msgtransmis'><li>Appel du constructeur</li>";//a modifier à la mise en ligne
            $this->currentDate = date("F j, Y, g:i a");  
        } 
Dans tes méthodes qui ont un accès à MySQL
function creationArticle($_cnx){
            //creation d'un article, insertion dans la BDD
            $this->sql = "INSERT INTO `".$nomTable."` (`id`,`titre`,`texte`,`categorie`,`datepublication`) VALUES (``, `".$this->title."` ,`".$this->text."`,`".$this->categorie."`,`".$this->currentDate."`)";
            echo $this->sql;
            
            $this->stmt = $_cnx->query($sql);
        
            if($this->stmt === true){
                $this->messageUser .= "<li>Les données ont été insérées.</li>";
                echo $this->messageUser."</ul>";
            }
            else if($this->stmt === false){
                $this->messageUser .= "<li>Les données n'ont pas été insérées.</li>";
                echo $this->messageUser."</ul>";
                exit();
            }
        }
Bien que je l'ai pas fait, tu devrais tester si ta connexion existe avant son utilisation, quelle que soit la méthode
if(!$_cnx) die('La connexion &agrave; la base n\'est pas valide');

Posté : 28 déc. 2006, 02:21
par the dreamer
je suppose que $_cnx correspond à mon objet mysqli ? *va essayer*

Posté : 28 déc. 2006, 02:24
par Ajoloca
Tu supposes bien.

Posté : 28 déc. 2006, 02:45
par the dreamer
C'est beaucoup plus simple de passer la connexion par paramètre ^^", logiquement du coup j'appelle mon fichier config dans les fichiers où j'implémente mes objets, mais toujours rien ... les requêtes ne s'executent pas ...

Posté : 28 déc. 2006, 02:48
par Ajoloca
Montre ton nouveau code que l'on puisse voir de plus près.

Posté : 28 déc. 2006, 02:55
par the dreamer
config.inc.php
<?php
	//fichier de configuration local config.inc.php
	$username = "root";
	$password = "";
	$hostname = "localhost";
	$nomBase = "essai";
	$nomTable = "articles";
		
	//création de l'objet mysqli
	$_cnx = new mysqli($hostname,$username,$password,$nomBase);
?>
classArticle.class.php
<?php	
	class article {
		public $title;
		public $text;
		public $categorie;
		public $currentDate;
		public $messageUser;
		public $sql;
		public $stmt;
		public $nomTable = "articles";
					
		public function __construct(){
			$this->title = "";
			$this->text = "";
			$this->categorie = "";
			$this->sql = "";
			$this->stmt = "";
			$this->messageUser = "<ul id='msgtransmis'><li>Appel du constructeur</li>";//a modifier à la mise en ligne
			$this->currentDate = date("F j, Y, g:i a");
		}
		
		function setValuesArticle(){
			//recupere les valeurs des champs de formulaire
			$this->title = $_POST['titre'];
			$this->text = $_POST['texte'];
			$this->categorie = $_POST['categorie'];
		}
				
		function creationArticle($_cnx){
			//creation d'un article, insertion dans la BDD
			if(!$_cnx) die('La connexion &agrave; la base n\'est pas valide'); 
			
			$this->sql = "INSERT INTO `".$this->nomTable."` (`id_article`,`titre,texte`,`categorie`,`datepublication`,`datedermodif`) VALUES (``,`".$this->title."`,`".$this->text."`,`".$this->categorie."`,`".$this->currentDate."`,`".$this->currentDate."`)";
			//echo $this->sql;
			
			$this->stmt = $_cnx->query($this->sql);
		
			if($this->stmt === true){
				$this->messageUser .= "<li>Les données ont été insérées.</li>";
			}
			else if($this->stmt === false){
				$this->messageUser .= "<li>Les données n'ont pas été insérées.</li>";
				//exit();
			}
			$_cnx->close();
		}
		
		function modifArticle($_cnx,$id_article,$titre,$texte,$categorie){
			//recuperation des donnees dans le formulaire, puis UPDATE de l'enregistrement dans la BDD
			if(!$_cnx) die('La connexion &agrave; la base n\'est pas valide'); 
			
			$this->sql = "SELECT `titre`, `texte`, `datedermodif` FROM `".$this->nomTable."` WHERE id_article=`".$id_article."`";
			//echo $this->sql;
			
			$this->stmt = $_cnx->query($this->sql);
			if ($obj = $this->stmt->fetch_object()){
				$this->title = $obj->titre;
				$this->text = $obj->texte;
				$this->categorie = $obj->categorie;
			}
			else {
				$this->messageUser .= "<li>rien n'est récupéré</li>";
			}
			$this->stmt->close();
			
			$this->sql = "UPDATE `".$this->nomTable."` SET titre=`".$titre."`, texte=`".$texte."`, categorie=`".$categorie."`, datedermodif=`".$this->currentDate."` WHERE id_article=`".$id_article."`";
			//echo $this->sql;
			
			$this->stmt = $_cnx->query($this->sql);
			
			if($this->stmt === true){
				$this->messageUser .= "<li>Mis à jour.</li>";
				echo $this->messageUser."</ul>";
			}
			else if($this->stmt === false){
				$this->messageUser .= "<li>Les données n'ont pas été insérées.</li>";
				echo $this->messageUser."</ul>";
				exit();
			}
			$_cnx->close();
		}
		
		function suppressionArticle($_cnx,$id_article){
			//supprimer l'article, après confirmation du voeu
			if(!$_cnx) die('La connexion &agrave; la base n\'est pas valide'); 
			
			$this->sql = "DELETE * FROM `".$this->nomTable."` WHERE id_article=`".$id_article."`";
			//echo $this->sql;
			
			$this->stmt = $_cnx->query($this->sql);
			if($this->stmt === true){
				$this->messageUser .= "<li>Article Supprimé</li>";
				echo $this->messageUser."</ul>";
			}
			else if($this->stmt === false){
				$this->messageUser .= "<li>requête non executée</li>";
				echo $this->messageUser."</ul>";
				exit();
			}
			$_cnx->close();
		}
		
		function previewArticle(){
			//fonction de prévisualisation, qui s'affiche si l'on appuie sur prévisualiser
			echo "<div id='preview'>";
			echo "<h2>".$this->title."</h2>";
			echo "<h3>".$this->categorie."</h3>";
			echo "<h4>".$this->currentDate."</h4>";
			echo "<p>".$this->text."</p>";
			echo "</div>";
		}
				
		function nettoyageValuesArticle(){
			//traitement de la saisie utilisateur
			$this->title = trim($this->title);
			$this->text = trim($this->text);
		}
	}
?>
formulairajout.php
<?php
	//donnees de connexion
	include '../includes/config.inc.php';
	include '../includes/classArticle.class.php';

	//instanciation de l'objet article
	$nouvelArticle = new article();
	
	//prévient l'envoi
	if(!empty($_POST['titre']) && !empty($_POST['texte']) && ($_POST['bouton']=="Envoyer")){
		$nouvelArticle->setValuesArticle();
		$nouvelArticle->nettoyageValuesArticle();
		$nouvelArticle->messageUser .= '<li>Message envoyé</li>';
			
		$nouvelArticle->creationArticle($_cnx);
	}
	else if((empty($_POST['titre']) && empty($_POST['texte'])) || (empty($_POST['titre']) || empty($_POST['texte'])))
	{
		$nouvelArticle->messageUser .= '<li>Remplissez tous les champs du formulaire</li>';
	}
	
	if($_POST['bouton']=="Previsualiser"){
		$nouvelArticle->setValuesArticle();
		$nouvelArticle->nettoyageValuesArticle();
		$nouvelArticle->previewArticle();
	}
	
	$nouvelArticle->messageUser .= "</ul>";
	echo $nouvelArticle->messageUser;
?>	
 //formulaire html

j'ai viré volontairement toute la partie html, histoire que ce soit plus clair ^^"

Posté : 28 déc. 2006, 03:07
par Ajoloca
Re,
J'ai pas regardé le code en détail mais un détail me frappe tout de suite.
Tu ne testes jamais le retour de MySQL.
Si tu l'avais fait tu aurais vu que cette ligne contient une erreur de syntaxe.
Regarde cette partie de la ligne
`id_article`,`titre,texte`,`categorie`
Tu trouves QQ chose de bizarre ?

J'ai pas poursuivi, car c'est sur que si tu ne l'insères pas, tu ne peux pas le lire.
Teste toujours le retour de toute fonction.