Pages : 1
#1 Le 14/11/2018, à 21:28
- minizebr95
[PHP] Je comprends rien à un truc
Bonsoir,
Je suis le cours sur la POO en PHP D'openclassrooms pour ceux qui connaisssent...
Je développe donc un framework, c'est le tp final.
Quand je lance mon appli, j 'obtiens cette erreur :
Warning: require(/var/www/html/Framework/Web/../Library/Entities/Articles/Library/Entity.php): failed to open stream: No such file or directory in /var/www/html/Framework/Library/autoload.php on line 152
Fatal error: require(): Failed opening required '/var/www/html/Framework/Web/../Library/Entities/Articles/Library/Entity.php' (include_path='.:/usr/share/php') in /var/www/html/Framework/Library/autoload.php on line 152
Je pense qu'une partie du code qui foire est là :
<?php
namespace Library\Models;
use \Entities\Articles;
class ArticlesManagerPDO extends ArticlesManager
{
public function getList($debut = -1, $limite = -1)
{
$sql = 'SELECT id, auteur, titre, contenu, dateAjout, dateModif FROM news ORDER BY id DESC';
if ($debut != -1 || $limite != -1)
{
$sql .= ' LIMIT '.(int) $limite.' OFFSET '.(int) $debut;
}
$requete = $this->dao->query($sql);
$listeNews = $requete->fetchAll(\PDO::FETCH_CLASS, 'Library\Entities\Articles') ;
foreach ($listeNews as $news)
{
$news->setDateAjout(new \DateTime($news->dateAjout()));
$news->setDateModif(new \DateTime($news->dateModif()));
}
$requete->closeCursor();
return $listeNews;
}
}
Et l'autre fichier qui commence par :
<?php
namespace Library\Entities\Articles;
class Articles extends Library\Entity
Si quelqu'un a une idée, parce que là je suis à court... Merci par avance de votre aide
Je pose plein de questions
Hors ligne
#2 Le 15/11/2018, à 08:46
- minizebr95
Re : [PHP] Je comprends rien à un truc
Voilà qu'avec le même code maintenant j'ai droit à cette erreur là :
Fatal error: Uncaught Error: Call to a member function setDateAjout() on array
Je ne comprends pas car le code est censé retourner des objets et pas des arrays
Je pose plein de questions
Hors ligne
#3 Le 15/11/2018, à 09:23
- bruno
Re : [PHP] Je comprends rien à un truc
Bonjour,
Regarde bien les messages d'erreurs il sont tout à fait explicites avec en plus le numéro de ligne incriminée.
Pour la première erreur il faut que tu regarde pourquoi le fichier appelé par require est inaccessible.
Pour la seconde tu appelle une méthode d'un objet sur une variable de type tableau :
$news->setDateAjout(new \DateTime($news->dateAjout()));
Demande-toi quel est le type des variables $listeNews et $news. Des objets, des tableaux, autre chose ?
Dernière modification par bruno (Le 15/11/2018, à 09:25)
#4 Le 15/11/2018, à 09:42
- minizebr95
Re : [PHP] Je comprends rien à un truc
Bonjour,
Regarde bien les messages d'erreurs il sont tout à fait explicites avec en plus le numéro de ligne incriminée.
Pour la première erreur il faut que tu regarde pourquoi le fichier appelé par require est inaccessible.
Pour la seconde tu appelle une méthode d'un objet sur une variable de type tableau :
$news->setDateAjout(new \DateTime($news->dateAjout()));
Demande-toi quel est le type des variables $listeNews et $news. Des objets, des tableaux, autre chose ?
Salut Bruno,
En fait avec la fonction
$listeNews = $requete->fetchAll(\PDO::FETCH_CLASS, 'Library\Entities\Articles') ;
cela devrait me retourner des objets, pas des tableaux, n'est-ce pas ? C'est ce que je ne comprends pas.
Voici l'erreur que j'obtiens qui confirme qu'on a effectivement des arrays :
array(1) { [0]=> array(12) { ["id"]=> string(1) "1" [0]=> string(1) "1" ["auteur"]=> string(6) "Julien" [1]=> string(6) "Julien" ["titre"]=> string(17) "Ceci est un essai" [2]=> string(17) "Ceci est un essai" ["contenu"]=> string(16) "Et pas un essaim" [3]=> string(16) "Et pas un essaim" ["dateAjout"]=> string(19) "2018-11-28 00:00:00" [4]=> string(19) "2018-11-28 00:00:00" ["dateModif"]=> string(19) "2018-11-15 00:00:00" [5]=> string(19) "2018-11-15 00:00:00" } } array(12) { ["id"]=> string(1) "1" [0]=> string(1) "1" ["auteur"]=> string(6) "Julien" [1]=> string(6) "Julien" ["titre"]=> string(17) "Ceci est un essai" [2]=> string(17) "Ceci est un essai" ["contenu"]=> string(16) "Et pas un essaim" [3]=> string(16) "Et pas un essaim" ["dateAjout"]=> string(19) "2018-11-28 00:00:00" [4]=> string(19) "2018-11-28 00:00:00" ["dateModif"]=> string(19) "2018-11-15 00:00:00" [5]=> string(19) "2018-11-15 00:00:00" }
Fatal error: Uncaught Error: Call to a member function setContenu() on array in /var/www/html/Framework/Apps/Frontend/Modules/Articles/ArticlesController.php:18 Stack trace: #0 /var/www/html/Framework/Library/BackController.php(35): Apps\Frontend\Modules\Articles\ArticlesController->executeIndex(Object(Library\HTTPRequest)) #1 /var/www/html/Framework/Apps/Frontend/FrontendApplication.php(19): Library\BackController->execute() #2 /var/www/html/Framework/Web/Bootstrap.php(36): Apps\Frontend\FrontendApplication->run() #3 {main} thrown in /var/www/html/Framework/Apps/Frontend/Modules/Articles/ArticlesController.php on line 18
Une idée ?
Je pose plein de questions
Hors ligne
#5 Le 15/11/2018, à 09:53
- bruno
Re : [PHP] Je comprends rien à un truc
https://secure.php.net/manual/fr/pdosta … tchall.php
$listnews devrait être un tableau d'objets.
Dernière modification par bruno (Le 15/11/2018, à 09:57)
#6 Le 15/11/2018, à 09:56
- minizebr95
Re : [PHP] Je comprends rien à un truc
Il y a ça sur cette page :
PDO::FETCH_CLASS: Retourne une instance de la classe désirée. Les colonnes sélectionnées sont liées aux attributs de la classe.
En bidouillant un peu désormais il me dit :
Fatal error: Class '\Entities\Articles' not found in /var/www/html/Framework/Library/Models/ArticlesManagerPDO.php on line 32
Pourtant cette classe existe :
Dernière modification par minizebr95 (Le 15/11/2018, à 10:04)
Je pose plein de questions
Hors ligne
#7 Le 15/11/2018, à 10:04
- bruno
Re : [PHP] Je comprends rien à un truc
Après il faut regarder comment est construite ta classe "Articles" et faire un minimum de vérifications sur ce que renvoie ta requête. La je ne vois aucun traitement d'erreur au cas où la requête échoue (c'est peut être dans la classe parente) et si la récupération des enregistrements ne renvoie rien ou une erreur.
#8 Le 15/11/2018, à 10:05
- minizebr95
Re : [PHP] Je comprends rien à un truc
Après il faut regarder comment est construite ta classe "Articles" et faire un minimum de vérifications sur ce que renvoie ta requête. La je ne vois aucun traitement d'erreur au cas où la requête échoue (c'est peut être dans la classe parente) et si la récupération des enregistrements ne renvoie rien ou une erreur.
Voici le contenu de ma classe Articles :
<?php
namespace Library\Entities\Articles;
class Articles extends \Library\Entity
{
protected $erreurs = [],
$id,
$auteur,
$titre,
$contenu,
$dateAjout,
$dateModif;
const AUTEUR_INVALIDE = 1;
const TITRE_INVALIDE = 2;
const CONTENU_INVALIDE = 3;
public function __construct($valeurs = [])
{
if (!empty($valeurs)) // Si on a spécifié des valeurs, alors on hydrate l'objet.
{
$this->hydrate($valeurs);
}
}
public function hydrate($donnees)
{
foreach ($donnees as $attribut => $valeur)
{
$methode = 'set'.ucfirst($attribut);
if (is_callable([$this, $methode]))
{
$this->$methode($valeur);
}
}
}
public function setAuteur($auteur)
{
$this->auteur = $auteur;
}
public function setTitre($titre)
{
$this->titre = $titre;
}
public function setContenu($contenu)
{
$this->contenu = $contenu;
}
public function setDateAjout(\DateTime $dateAjout)
{
$this->dateAjout = $dateAjout;
}
public function setDateModif(\DateTime $dateModif)
{
$this->dateModif = $dateModif;
}
// GETTERS //
public function auteur()
{
return $this->auteur;
}
public function titre()
{
return $this->titre;
}
public function contenu()
{
return $this->contenu;
}
public function dateAjout()
{
return $this->dateAjout;
}
public function dateModif()
{
return $this->dateModif;
}
}
Je pose plein de questions
Hors ligne
#9 Le 15/11/2018, à 11:03
- bruno
Re : [PHP] Je comprends rien à un truc
Bon, je ne vais pas déboguer ton code à ta place (d'autant qu'il est mal indenté et donc peu lisible).
Je réitère : je ne vois aucun traitement des erreurs sur la récupération des données. Qu'est-ce qui te garantit que listeNews contient bien les données que tu attends ?
Si tu n'y arrives pas mets des var_dump($ma_variable) dans ton code pour voir ce que contiennent réellement tes variables.