PHP: Uncaught Error: Using $this when not in object context

Fermé
VekTheGamer Messages postés 5 Date d'inscription vendredi 18 décembre 2015 Statut Membre Dernière intervention 10 avril 2017 - Modifié le 10 avril 2017 à 20:06
yg_be Messages postés 22721 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 - 11 avril 2017 à 12:09
Bonjour,

je doit faire un page web en PHP qui affiche une liste d'émissions de télévision à partir d'une base de données .sqlite, mais il y a un problème:

Fatal error: Uncaught Error: Using $this when not in object context in C:\Users\utilisateur\Desktop\qcref_projet2_v2\classes\Emission.class.php:112 Stack trace: #0 C:\Users\utilisateur\Desktop\qcref_projet2_v2\classes\Emission.class.php(103): Emission::html_liste_li_array() #1 C:\Users\utilisateur\Desktop\qcref_projet2_v2\classes\Emission.class.php(203): Emission::html_liste() #2 {main} thrown in C:\Users\utilisateur\Desktop\qcref_projet2_v2\classes\Emission.class.php on line 112

voici les méthodes problématiques dans la classe émission:

voici ma méthode html_liste (permettant de faire le ul des émissions):
    static public function html_liste() {
        $SQL = "SELECT * FROM emissions";
        $pdo = Qcref::connecter();
        $req = $pdo->prepare($SQL);
        $req->execute();
        $resultat = '';
        //$resultat .= '<ul class="list">';
        while(($oEmission = $req->fetchObject('Emission')) !== false) {
            //var_dump($oEmission);
            $tEmission = get_object_vars($oEmission);
            var_dump($tEmission['slug']);
            //var_dump($tEmission);
            foreach ($tEmission as $oEmission) {
                var_dump($oEmission);
                $oEmission = self::fromArray($tEmission);
                //$oEmission->sauvegarder();
            }
            $resultat .= $oEmission->html_liste_li_array();
        }
        //$resultat .= '</ul>';
        //return $resultat;
    }

voici ma méthode fromArray (permettant de changer les propriétés de l'objet émission):
    static public function fromArray($array) {
        $resultat = new self();
        if (isset($array['id'])) {
            $resultat->id = $array['id'];
        }
        if (isset($array['titre'])) {
            $resultat->titre = $array['titre'];
        }
        if (isset($array['slug'])) {
            $resultat->slug = $array['slug'];
        }
        return $resultat;
    }

voici ma méthode html_liste_li_array (permettant de faire le li d'un émission à l'aide des propriétés de l'objet émission):
    static public function html_liste_li_array() {
        $resultat = '';
        $resultat .= '<li>';
        $resultat .= '<img src="images/emissions/'.$this->slug.'_64x64.jpg" alt="'.$this->titre.'">';
        $resultat .= '<div>';
        $resultat .= '<div class="titre">'.self::html_lienTitre_array($array).'</div>';
        $resultat .= '<div class="nbrefs">'.$array['nbrefs'].' références</div>';
        $resultat .= '</div>';
        $resultat .= '</li>';
        return $resultat;
    }


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.

Merci à tous de votre aide.
A voir également:

3 réponses

Utilisateur anonyme
10 avril 2017 à 20:42
C'est bien une class? Car il semble que c'est impossible d'accéder à $this, donc à la class.
0
VekTheGamer Messages postés 5 Date d'inscription vendredi 18 décembre 2015 Statut Membre Dernière intervention 10 avril 2017
10 avril 2017 à 20:52
Oui c'est une classe, la preuve, au début du fichier de la classe Émission, je l'ai déclaré en tant que classe et j'ai les propriétés plus la méthode __construct...
class Emission {
    static public $table = "emissions";
	public $id = 0;
	public $titre = '';
	public $slug = '';
	public $nbrefs = 0;
	
	public function __construct() {
	}
0
yg_be Messages postés 22721 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > VekTheGamer Messages postés 5 Date d'inscription vendredi 18 décembre 2015 Statut Membre Dernière intervention 10 avril 2017
10 avril 2017 à 22:02
pourquoi ne pas nous montrer le fichier complet?
0
VekTheGamer Messages postés 5 Date d'inscription vendredi 18 décembre 2015 Statut Membre Dernière intervention 10 avril 2017 > yg_be Messages postés 22721 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
10 avril 2017 à 22:05
d'accord, voici la classe en question:

<?php
include_once "Qcref.class.php";
class Emission {
    static public $table = "emissions";
	public $id = 0;
	public $titre = '';
	public $slug = '';
	public $nbrefs = 0;
	
	public function __construct() {
	}
//	static public function getObject($slug, $prendreRefs=false) {
//        $resultat = self::getOne($slug, PDO::FETCH_CLASS);
//        if ($prendreRefs) {
//            $resultat->refs = Ref::donnees("WHERE emission_id=".$resultat->id);
//        }
//		return $resultat;
//	}
    static public function getObject(/*$slug, $prendreRefs=false*/) {
		$SQL = "SELECT titre FROM emissions";
        $pdo = Qcref::connecter();
        //var_dump($pdo);
		$req = $pdo->prepare($SQL);
        //var_dump($req);
		$req->execute();
        //$resultat = var_dump($req);
        $enr = $req->fetchObject();
        return $enr;
	}
//    static public function getArray($slug) {
//        $pdo = Qcref::connecter();
//		$SQL = "SELECT * FROM view_emissions $WHERE ORDER BY titre";
//		$req = $pdo->prepare($SQL);
//		$req->execute();
//		if (!isset($donnees[$slug])) {
//			return false;
//		} else {
//			return $donnees[$slug];
//		}
//    }
	/*static public function donnees($WHERE='') {
		$pdo = Qcref::connecter();
		$SQL = "SELECT * FROM view_emissions $WHERE ORDER BY titre";
		$req = $pdo->prepare($SQL);
        $req->setFetchMode(PDO::FETCH_ASSOC);
		$req->execute();
		$resultat = self::donnees_fromReq($req);
		return $resultat;
	}*/
	static public function donnees_fromReq($req) {
		$resultat = [];
		while (($enr = $req->fetch()) !== false) {
			$resultat[$enr['slug']] = $enr;
		}
		return $resultat;
	}
	static public function html_article_array($array) {
		$resultat = '';
		$resultat .= '<article>';
		$resultat .= '<header>';
		$resultat .= '<h1>'.$array['titre'].'</h1>';
		$resultat .= '</header>';
		$resultat .= '<div class="body">';
		$resultat .= '<div class="image">';
		$resultat .= '<img src="images/emissions/'.$array['slug'].'.jpg" alt="'.$array['titre'].'";>';
		$resultat .= '</div>';
		$resultat .= '<div class="details">';
		$resultat .= '<h3>Liste des références</h3>';
		$resultat .= 'La liste des références vient ici';
		$resultat .= '</div>';
		$resultat .= '</div>';
		$resultat .= '</article>';
		return $resultat;
	}
//	static public function html_liste() {
//		//$donnees = self::donnees();
//		$resultat = '';
//		$resultat .= '<ul class="list">';
//		foreach ($donnees as $slug=>$emission) {
//			$resultat .= self::html_liste_li_array($emission);
//		}
//		$resultat .= '</ul>';
//		return $resultat;
//	}
    
    static public function html_liste() {
        $SQL = "SELECT * FROM emissions";
        $pdo = Qcref::connecter();
		$req = $pdo->prepare($SQL);
		$req->execute();
		$resultat = '';
		//$resultat .= '<ul class="list">';
		while(($oEmission = $req->fetchObject('Emission')) !== false) {
            //var_dump($oEmission);
            $tEmission = get_object_vars($oEmission);
            //var_dump($tEmission['slug']);
            //var_dump($tEmission);
            foreach ($tEmission as $emissions) {
                $oEmission = self::fromArray($tEmission);
                var_dump($oEmission);
                //$oEmission->sauvegarder();
		    }
			$resultat .= $oEmission->html_liste_li_array();
		}
		//$resultat .= '</ul>';
		//return $resultat;
	}
    
	static public function html_liste_li_array() {
		$resultat = '';
        $resultat .= '<li>';
        $resultat .= '<img src="images/emissions/'.$this->slug.'_64x64.jpg" alt="'.$this->titre.'">';
        $resultat .= '<div>';
        $resultat .= '<div class="titre">'.self::html_lienTitre_array($array).'</div>';
        $resultat .= '<div class="nbrefs">'.$array['nbrefs'].' références</div>';
        $resultat .= '</div>';
        $resultat .= '</li>';
		return $resultat;
	}
	public function sauvegarder() {
	}
	/*public function toArray($array) {
		$resultat = [];
		$resultat['id'] = $this->id;
		$resultat['titre'] = $this->titre;
		$resultat['slug'] = $this->slug;
		return resultat;
	}*/
    static public function html_lienTitre_array($array) {
		$resultat = '';
        $resultat .= self::html_lienDetails($this->slug, $this->titre);
        return $resultat;
    }
	static public function html_lienDetails($slug, $contenu) {
        $resultat = '';
        $resultat .= '<a href="emissions_details.php?slug='.$slug.'" rel="nofollow noopener noreferrer" target="_blank">'.$contenu.'</a>';
        return $resultat;
    }
	static public function fromArray($array) {
		$resultat = new self();
		if (isset($array['id'])) {
			$resultat->id = $array['id'];
		}
		if (isset($array['titre'])) {
			$resultat->titre = $array['titre'];
		}
		if (isset($array['slug'])) {
			$resultat->slug = $array['slug'];
		}
		return $resultat;
	}
	static public function html_form() {
		$resultat = '';
		return $resultat;
	}
	static public function html_form_titre($valeur="") {
		$resultat = '';
		$resultat .= '<div>';
		$resultat .= '<label for="titre">Titre : </label>';
		$resultat .= '<input type="text" name="titre" id="titre" value="'.$valeur.'" style="width:30em;"/>';
		$resultat .= '</div>';
		return $resultat;
	}
	static public function html_form_slug($valeur="") {
		$resultat = '';
		$resultat .= '<div>';
		$resultat .= '<label for="slug">Slug : </label>';
		$resultat .= '<input type="text" name="slug" id="slug" value="'.$valeur.'" style="width:30em;"/>';
		$resultat .= '</div>';
		return $resultat;
	}
	static public function select() {
		$pdo = Qcref::connecter();
		$SQL = "SELECT titre, slug FROM emissions ORDER BY titre";
		$req = $pdo->query($SQL);
		$resultat = '';
		$resultat .= '<select name="emission_slug" id="emission_slug">';
		while (($enr = $req->fetch()) !== false) {
			$resultat .= '<option value="'.$enr['slug'].'">';
			$resultat .= $enr['titre'];
			$resultat .= '</option>';
		}
		$resultat .= '</select>';
		return $resultat;
	}
    static public function sql_creerTable() {
		$table = self::$table;
		$champs[] = "id	INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT";
		$champs[] = "texte	TEXT NOT NULL";
		$champs[] = "auteur	TEXT";
		$champs = implode(",", $champs);		
		$SQL = "CREATE TABLE $table ($champs);";
		return $SQL;
	}
    static public function sql_supprimerTable() {
		$table = self::$table;
		$SQL = "DROP TABLE IF EXISTS $table;";
		return $SQL;
	}
}

//echo Emission::getObject(/*'dexter', $prendreRefs=false*/);
echo Emission::html_liste();
0
yg_be Messages postés 22721 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > VekTheGamer Messages postés 5 Date d'inscription vendredi 18 décembre 2015 Statut Membre Dernière intervention 10 avril 2017
11 avril 2017 à 12:09
je vois une soupe bizarre avec $oEmission, $tEmission et $emission.
    static public function html_liste() {
        $SQL = "SELECT * FROM emissions";
        $pdo = Qcref::connecter();
		$req = $pdo->prepare($SQL);
		$req->execute();
		$resultat = '';
		//$resultat .= '<ul class="list">';
		while(($oEmission = $req->fetchObject('Emission')) !== false) {
            //var_dump($oEmission);
            $tEmission = get_object_vars($oEmission);
            //var_dump($tEmission['slug']);
            //var_dump($tEmission);
            foreach ($tEmission as $emissions) {
                $oEmission = self::fromArray($tEmission);
                var_dump($oEmission);
                //$oEmission->sauvegarder();
		    }
			$resultat .= $oEmission->html_liste_li_array();
		}
		//$resultat .= '</ul>';
		//return $resultat;
	}

je vois de multiples anomalies, en voici deux:
tu assignes $emission en ligne 14, et tu ne l'utilises jamais.
$oEmission est assigné en ligne 8, puis bizarrement écrasé en ligne 15.
je suggère d'utiliser des noms plus clairs pour tes variables.
0