Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile


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 sad


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)

Hors ligne

#4 Le 15/11/2018, à 09:42

minizebr95

Re : [PHP] Je comprends rien à un truc

bruno a écrit :

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 ? smile


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)

Hors ligne

#6 Le 15/11/2018, à 09:56

minizebr95

Re : [PHP] Je comprends rien à un truc

Il y a ça sur cette page :

php a écrit :

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 :

1542272665.png

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.

Hors ligne

#8 Le 15/11/2018, à 10:05

minizebr95

Re : [PHP] Je comprends rien à un truc

bruno a écrit :

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.

Hors ligne