Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher donnée de la base en architecture MVC

16 juillet 2019 à 20:53:54

Yo ;)

J'ai une table avec plein d'exercices (et leurs données associés) que j'aimerais afficher sur une page de mon site. Sans la contrainte du MVC ça serait pas un problème mais la je bloque.

Dans le controller.php :

	function exercises(){
		//Checking if the user is connected to an account
		sessionOn();
		
		//Connection to the database
		require('public/functions/bddConnection.php');
		$bdd = bddConnection();
		
		//Looking for exercises
		require('models/model.php');
		$exercises = getExercises($bdd);
				
		//Calling the view
		require('views/frontend/exercisesView.php');
	}

Dans le model.php :

function getExercises(PDO $bdd){
		$req=$bdd->prepare('SELECT * FROM exercises WHERE userCreatedExercise=0 OR idOfCreator = :idOfCreator');
		$req->execute(array(
			'idOfCreator' => $_SESSION['idMember']));
		$exercises = $req->fetch();
		return $exercises;
	}


Dans la vue :

<?php
	//Preparing the variables to use in the template
	$title = 'Mes exercices';


	//Recording the $sectionContent variable
	ob_start();

	while($exercises){
?>
		<div class="exo">
			nom : <?= $exercises['nameExercise'] ?>

			main MG :<?= $exercises['mainMGExercise'] ?>

			secondayr MG :<?= $exercises['secondaryMGEcercise'] ?>
		</div>

<?php
	}

	$sectionContent = ob_get_clean();

	//Calling the template
	require('views/frontend/templates/template.php');

Quand je test ça la page charge mais rien de se passe (l'écran continue d'afficher ce qu'il affichait précédemment, puis devient blanc).

 La console ne me renvoie aucune erreur.

Avec les test que j'ai fait, je dirais que l'erreur se trouve vers la boucle while, car j'ai noté une différence d'output entre ça (qui fonctionne):

while($exercises = $req->fetch()){
echo $exercises['nameExercise']; }

et ça (qui ne fonctionne pas):

$exercises = $req->fetch();
while($exercises){
    echo $exercises['nameExercise'];
}

Ce qui m'embête pas mal vu que mon idée de base était de balader l'array $exercises entre les différents bout de code oklm..

Voilà j'espère que vous pourrez m'aider ! :)

  • Partager sur Facebook
  • Partager sur Twitter
16 juillet 2019 à 21:09:29

Bonsoir.

C'est normal, dans ta fonction getExercices, tu fais le retour sur un seul enregistrement, ça ne peut donc pas fonctionner pour une boucle.

-
Edité par Lartak 16 juillet 2019 à 21:09:44

  • Partager sur Facebook
  • Partager sur Twitter

Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

17 juillet 2019 à 9:38:10

Re Lartak ;)

Ah ouais je pensais que mon 

$exercises = $req->fetch();
return $exercises;

renvoyait tout l'array.. :o

Comment je peux renvoyer tout l'array alors ? J'ai trouver la fonction :

array_values ( array $array ) : array

Mais je vois pas bien l'application :(

  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2019 à 9:45:37

Salut 

Si je ne m'abuse, fetch() ne renvoie qu'un seul résultat. Il me semble que c'est fetchAll() pour tout récupérer ^^ 

  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2019 à 10:52:25

Yo Ryukotsei,

Huum ouais y a peut-être un idée.. C'est bizarre

D'un coté j'ai déjà utilisé le fetch() comme ça sur un projet précédant, sans soucis. D'ailleurs dans la partie 'Lisez des données" du cours PHP d'Openclassrooms c'est comme que Mathieu Nebra conseil de le faire.

Sur Stackoverflow j'ai trouvé que fetchAll() est plus rapide mais demande plus de mémoire que fetch(). 

D'un autre coté la doc PHP soutient ce que tu dis et les exemples correspondent à ce que je veux faire, donc je vais tester ça et puis je vous tiens au courant :)

  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2019 à 10:54:29

Au pire pour être fixé fais un var_dump de $exercises :p
  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2019 à 20:40:52

Re, 

Alors j'ai testé en renplaçant le fetch() par un fetchAll(). Le var_dump($exercises) me renvoie ça :

Donc à priori ma variable $exercises contient ce que je veux.

Par contre au niveau de la page affichée, le problème n'a pas changé, la page charge, charge, charge mais n'affiche jamais rien..

Je remet le code là :

controller.php :

	/*___EXERCISES CONTROLLER___*/

	function exercises(){
		//Connection to the database
		require('public/functions/bddConnection.php');
		$bdd = bddConnection();
		
		//Looking for exercises
		require('models/model.php');
		$exercises = getExercises($bdd);
				
		//Calling the view
		//var_dump($exercises);
		require('views/frontend/exercisesView.php');
	}

model.php :

	/*___EXERCISES MODEL___*/

	function getExercises(PDO $bdd){
		$req=$bdd->prepare('SELECT * FROM exercises WHERE userCreatedExercise=0 OR idOfCreator = :idOfCreator');
		$req->execute(array(
			'idOfCreator' => $_SESSION['idMember']));
		$exercises = $req->fetchAll();
		return $exercises;
	}

exerciseView.php :

<?php
	//Preparing the variables to use in the template
	$title = 'Mes exercices';


	//Recording the $sectionContent variable
	ob_start();

	while($exercises){
?>
		<div class="exo">
			nom : <?= $exercises['nameExercise'] ?>

			main MG :<?= $exercises['mainMGExercise'] ?>

			secondayr MG :<?= $exercises['secondaryMGExercise'] ?>
		</div>

<?php
	}

	$sectionContent = ob_get_clean();

	//Calling the template
	require('views/frontend/templates/template.php');





  • Partager sur Facebook
  • Partager sur Twitter
17 juillet 2019 à 23:45:26

Si tu utilises la méthode fetchAll, il te faut faire une boucle foreach à la place de la boucle while.

  • Partager sur Facebook
  • Partager sur Twitter

Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.