Probleme include dans un fichier

Eléphanteau du PHP | 25 Messages

27 déc. 2006, 17:38

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:

Mammouth du PHP | 505 Messages

27 déc. 2006, 17:51

$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;
...

Eléphanteau du PHP | 25 Messages

27 déc. 2006, 17:56

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.

Eléphanteau du PHP | 25 Messages

27 déc. 2006, 19:38

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 ...

Mammouth du PHP | 505 Messages

27 déc. 2006, 23:59

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 '

Eléphanteau du PHP | 25 Messages

28 déc. 2006, 00:07

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 ^^

Mammouth du PHP | 1885 Messages

28 déc. 2006, 00:10

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.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Eléphanteau du PHP | 25 Messages

28 déc. 2006, 00:54

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 ^^" ...

ViPHP
ViPHP | 1961 Messages

28 déc. 2006, 02:10

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');
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphanteau du PHP | 25 Messages

28 déc. 2006, 02:21

je suppose que $_cnx correspond à mon objet mysqli ? *va essayer*

ViPHP
ViPHP | 1961 Messages

28 déc. 2006, 02:24

Tu supposes bien.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphanteau du PHP | 25 Messages

28 déc. 2006, 02:45

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 ...

ViPHP
ViPHP | 1961 Messages

28 déc. 2006, 02:48

Montre ton nouveau code que l'on puisse voir de plus près.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphanteau du PHP | 25 Messages

28 déc. 2006, 02:55

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 ^^"

ViPHP
ViPHP | 1961 Messages

28 déc. 2006, 03:07

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.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein