Partage

MOOC Programmez en orienté objet en PHP

18 mars 2015 à 18:52:55

Bonjour à tous et bienvenue à tous ceux qui participent au cours Programmez en orienté objet en PHP ! Le cours est accessible à l'adresse suivante : http://openclassrooms.com/courses/programmez-en-oriente-objet-en-php

Il vous arrivera sans doute d'avoir des questions concernant certaines activités, et c'est tout-à-fait normal. Je vous invite à poser vos questions ici, et j'essaierai de venir régulièrement pour y répondre. Bien entendu, si vous pensez pouvoir aider quelqu'un, n'hésitez pas à répondre et à échanger ! Attention cependant à ne pas divulguer les solutions.

Si vous avez des problèmes techniques avec les activités, vous pouvez contacter directement OpenClassrooms à l'adresse suivante : hello@openclassrooms.com

Bon courage, et à très bientôt ! :)

Victor

-
Edité par vyk12 18 mars 2015 à 19:03:00

Vous êtes demandeur·se d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur·se web junior

Je postule
Formation
courte
Financée
à 100%
30 mars 2015 à 16:25:51

Allez je poste le premier pour ce MOOC de POO PHP.

Je souhaite bon courage pour l activité qui est à mon avis me semble très difficile pour des débutants en POO.

Le seul conseil que je peux donner c' est de relire et encore relire le cours sur la pratique du développement du "mini Framework" afin de bien comprendre l' architecture et de réussir l' activité.

2 avril 2015 à 12:20:32

Bonjour à tous,

Je suis actuellement sur le MOOC POO avec Php Partie 3 et j'ai une ligne de code qui me gène:

return isset[$attr] ? isset[$attr] : null;

je n'ai pas de soucis par rapport à la fonction isset() mais je suis géné par les ' ? ' et ' : ' dans cette ligne, je ne sais pas ce qu'ils font.

Quelqu'un peut il m'éclairer sur cette ligne?

Merci beaucoup

Philippe.

-
Edité par Philippe2463 2 avril 2015 à 12:21:49

La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
2 avril 2015 à 13:24:36

Merci beaucoup,

Voilà une partie de cours que j'avais complétement oublié.

A+

La chute n'est pas un échec, l'échec c'est de rester là où on est tombé!
3 avril 2015 à 18:41:51

Salut a tous la famille.

je suis bellemay et je suis face a un dilemme.

je suis en developpement d'un site et j'ai fini mon formulaire d'inscription mais après essai j'ai constaté que les infos ne vont pas dans ma base de donnéé et jai mis un utulisateur au niveau de ma base de donnée mais je n'arrive toujours pas a me connecté sur la page login.

Voici mon code au niveau de register.php:

<?php 
session_start();
//var_dump($_SESSION);
//die();
require('filters/guest_filter.php');
require('config/database.php');
require('includes/function.php');



//si le formulaire a ete soumis
if(isset($_POST['register'])){
//si tous les champs ont ete remplis
if(not_empty(['name', 'pseudo', 'email', 'password', 'password_confirm'])){

$errors = [];

extract($_POST);
//permet d'avoir acces à variable tout en tapant $name; $pseudo


//permet de retouner le nombre de caractème
if(mb_strlen($pseudo) < 3){
$errors[] = "Pseudo trop cour minimum 3 caractères";
}
//email
if(! filter_var($email, FILTER_VALIDATE_EMAIL)){
$errors[] ="Adresse email invalide!";
}
//password and password_confirm
if(mb_strlen($password) < 6){
$errors[] = "Mot de pass trop cour minimun 6 caractères!";
}else{
if($password != $password_confirm){
$errors[] = "Les deux mots de passe ne concordent pas!";

}

if(is_already_in_use('pseudo', $pseudo, 'users')){
$errors[] = "Pseudo déjà utilisé!";
}

if(is_already_in_use('email', $email, 'users')){
$errors[] = "Adresse E-mail déjà utilisé!";
}

if(count($errors) == 0){
//Envoi Mail d'activation
$to = $email;
$subject = WEBSITE_NAME. " - ACTIVATION DE COMPTE";
$token = sha1($pseudo.$emai.$password);

//permet de garder les info dans la memoire tempon et après nous permet d'affiché
ob_start();
require('templates/emails/activation.tmpl.php');
$content = ob_get_clean();
//un petit boulot pass partourt pour les titre.
$headers = 'MINE-Version: 1.0' . "\r\n";
$headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

//envoi le mail maintenant
mail($to, $subject, $content, $headers);
//Informer l'user pour qu'il confirme
set_flash ("Mail d'activation envoye!", 'success');

//Enregister les infos de l'user dans database
$q = $db->prepare('INSERT INTO users ($name, $pseudo, $password, $email)
VALUES(:name, :pseudo, :email, :password)');
$q->execute([
'name'=> $name,
'pseudo' => $pseudo,
'email' => $email,
'password' => sha1($password)
]);

header('Location: index.php');
exit();
}else{
save_input_data();

}
}

}else{

$errors[] = "Veuillez SVP remplir tous les champs";
save_input_data();
}
} else {
clear_input_data();//permet de vider le formulaire
}
?>



<?php require('views/register.view.php'); ?>


Et voici le code login.php

<?php

session_start();
//var_dump($_SESSION);
//die();
require('filters/guest_filter.php');
require('config/database.php');
require('includes/function.php');


//si le formulaire a ete soumis
if(isset($_POST['login'])){
//si tous les champs ont ete remplis
if(not_empty(['identifiant', 'password'])){
extract($_POST);

$q = $db->prepare("SELECT id, pseudo FROM users
WHERE(pseudo = :identifiant or email = :identifiant)
AND password = :password AND active = '1'");
$q->execute([
'identifiant' => $identifiant,
'password' => sha1($password)
]);
//user trouvé rowcount permet de retourne le nbre de resultat
$useHasBeenFound = $q->rowCount();

if($useHasBeenFound){
//filtre partie 1
$user = $q->fetch(PDO::FETCH_OBJ);

$_SESSION['user_id'] = $user->id;
$_SESSION['pseudo'] = $user->pseudo;

header('Location: profile.php');
exit();
}else{
set_flash('Combinaison Identifiant/password incorrecte!', 'danger');
save_input_data();
}

}else{
clear_input_data();//
}

}
require('views/login.view.php');



Aider moi svp
4 avril 2015 à 1:21:27

bonjour:soleil:

je vais seulement te demander si t'avait déjà créer les pages que tu as déjà écrit dans ton code si oui je vais essayer de chercher une solution pour ton problème.

au revoir.*

;)

312
4 avril 2015 à 22:07:16

merci de repondre

je repond oui, j'ai crée ces pages

5 avril 2015 à 0:02:34

Bonjour

Je lisais ce cours et j'ai remarque que dans la toute premier partie du cours il est ecrit:

"La valeur que vous leur donnez par défaut doit être une expression constante. Par conséquent, leur valeur ne peut être issue d'un appel à une fonction (private $_attribut = intval('azerty')), d'une opération (private $_attribut = 1 + 1), d'une concaténation (private $_attribut = 'Mon ' . 'super ' . 'attribut') ou d'une variable, superglobale ou non (private $_attribut = $_SERVER['REQUEST_URI'])."

Je pense qu'il pourrait etre important de preciser que pour deux des operandes cites plus haut (concatenation et addition), cela a ete implante depuis la version 5.6 de PHP. grace a ce RFC. L'implementation est notee ici.

Aussi, au niveau du chapitre sur l'heritage, il est note:

"Si vous redéfinissez une méthode, sa visibilité doit être la même que dans la classe parente ! Si tel n'est pas le cas, une erreur fatale sera levée. Par exemple, vous ne pouvez redéfinir une méthode publique en disant qu'elle est privée."

La encore petite precision, on peut definir une portee plus "faible" pour un membre donne dans la classe fille. Par exemple si un attribut a ete declare protected dans la classe mere, elle peut etre redeclaree public dans la classe fille.

En passant, tres bon cours, j'avais essaye de me mettre a la POO mais je n'ai jamais reussi a cerner certains concepts et a les integrer dans mes projets proprement. Je sens que cette fois c'est la bonne :D.

Merci.

 Edit: @Hadj, pourrais-tu copier/coller les erreurs qui s'affichent lorsque tu essayes de t'inscrire ?

-
Edité par saalihou1 5 avril 2015 à 0:08:30

5 avril 2015 à 0:30:11

Bonjour encore un autre fois:soleil:

Je pense que j'ai une très bonne idée pour ton problème,;)^^, et si tu pouvait changer les tableaux de connexion et d'inscription par d'autre créer avec la balise <input>, il ne te restera que de modifier les liens et d'ajouter les erreurs et les conditions d'utilisations etc ...:)

C'est bon, n'est ce pas, si t'as encore d'autres problèmes tu peux m'envoyer et me demander.:magicien:

au revoir.^^

:soleil:

-
Edité par hamza312 5 avril 2015 à 0:32:07

312
5 avril 2015 à 15:18:47

bellamyel hadj > Je t'invite à créer un sujet pour ton problème, ce sera plus pratique.

ssalihou1 > Effectivement, je vais apporter quelques précisions, merci. :)

10 avril 2015 à 10:13:54

Bonjour à tous!

Je veux créer une classe générique qui contient presque toutes les méthodes pour la gestion d'une db mais j'ai un probleme au niveau de l'insertion, C'est tout bête mais je ne sais pas quoi mettre à la place de XX  :euh: , merci d'avance 

<?php
 class DAO{
	
	protected $db;
	
	public function __construct($db){
		$this->setDb($db);
	}
	public function setDb($db){
		$this->db=$db;
	}
	
	public function insertion($myObj){
		$nom=$myObj->getNomTable();
		$data=array();
		$sql = sprintf('DESCRIBE %s',$nom);
		$rep = $this->db->prepare($sql);
		$rep->execute();
		
		foreach($rep->fetchAll(PDO::FETCH_ASSOC) as $rows){
			$data[]=$rows['Field'];
		}
		echo '<pre>';
		print_r($data);
		foreach($data as $key=>$att){
				$method ='get'.ucfirst($att);
				if(method_exists($myObj,$method)){
					$sql="INSERT INTO mygestion.".$nom."SET".$att."='".XX;
					$req1=$this->db->prepare($sql);
					$req1->bindValue(XX,$myObj->$method());
					$req1->execute();
				}
		}
		
		
	}

}
10 avril 2015 à 14:53:37

.

-
Edité par SaadAlpha 10 avril 2015 à 14:54:22

12 avril 2015 à 14:25:37

@zerochan Tu peux mettre :$att et la meme chose au niveau de la methode bindValue.

$sql="INSERT INTO mygestion.$nom SET $att=:$att" ;
$req1=$this->db->prepare($sql);
$req1->bindValue(":$att",$myObj->$method());
$req1->execute();

J'ai enleve les concatenations superflues, lorsque t'utilises les guillemets doubles tu n'as pas besoin de les fermer pour concatener une variable, tu peux la mettre directement.

Sinon, faire autant de requetes qu'il n'y a de colonnes dans ta table, je pense que ce n'est pas tres optimal niveau performances. Peut-etre qu'il serait meilleur d'abord de construire la requete SQL colonne par colonne (en concatenant les SET a chaque fois), ensuite de faire les bindValue, puis d'executer en dehors de la boucle.

-
Edité par saalihou1 12 avril 2015 à 14:27:12

12 avril 2015 à 17:19:49

@saalihou1

merci pour ta réponse :) 

Effectivement c'était une mauvaise idée!!

Sinon j'ai trouvé une solution

$sql_format = "INSERT INTO `%s`(%s) VALUES(%s)";

et ensuite j'ai utiliser implode pour les colonnes et valeurs . 

12 avril 2015 à 17:50:02

svp montrer ou aller pour pouvoir créé un sujet dans lequel je vais mettre une préoccupation
16 avril 2015 à 16:47:23

Est ce que qu'un aurait un idée ? 

http://openclassrooms.com/forum/sujet/poo-en-php-not-found-web-boostrap-php-on

17 avril 2015 à 3:12:28

G besoin d'une aide pour un PPE , ont ma donner plusieurs code php et html qui vont ensemble mais comment les combinés entre eux (faire un lien).

20 avril 2015 à 4:43:41

<html>
<head>
<title>Suivi des frais de visite</title>
<style type="text/css">
<!-- body {background-color: white; color:5599EE; } 
.titre { width : 180 ;  clear:left; float:left; } 
.zone { float : left; color:7091BB } -->
</style>
</head>
<body>
<div name="gauche" style="clear:left:;float:left;width:18%; background-color:white; height:100%;">
<div name="coin" style="height:10%;text-align:center;"><img src="logo.jpg" width="100" height="60"/></div>
<div name="menu" >
<h2>Outils</h2>
<ul><li>Frais</li>
<ul>
<li><a href="formSaisieFrais.htm" >Nouveau</a></li>
<li><a href="formConsultFrais.htm">Consulter</a></li>
</ul>
</ul>
</div>
</div>
<div name="droite" style="float:left;width:80%;">
<div name="haut" style="margin: 2 2 2 2 ;height:10%;float:left;"><h1>Suivi de remboursement des Frais</h1></div>
<div name="bas" style="margin : 10 2 2 2;clear:left;background-color:77AADD;color:white;height:88%;">
<form name="formConsultFrais" method="post" action="chercheFrais.php">
<h1> Période </h1>
<label class="titre">Mois/Année :</label> <input class="zone" type="text" name="dateConsult" size="12" />
<p class="titre" />
<div style="clear:left;"><h2>Frais au forfait </h2></div>
<table style="color:white;" border="1">
<tr><th>Repas midi</th><th>Nuitée </th><th>Etape</th><th>Km </th><th>Situation</th><th>Date opération</th><th>Remboursement</th></tr>
<tr align="center"><td width="80"><label  size="3" name="repas"/></td>
<td width="80"><label size="3" name="nuitee"/></td> 
<td width="80"> <label size="3" name="etape"/></td>
<td width="80"> <label size="3" name="km" /></td>
<td width="80"> <label size="3" name="situation" /></td>
<td width="80"> <label size="3" name="dateOper" /></td>
<td width="80"> <label size="3" name="dateOper" /></td>
</tr>
</table>
<p class="titre" /><div style="clear:left;"><h2>Hors Forfait</h2></div>
<table style="color:white;" border="1">
<tr><th>Date</th><th>Libellé </th><th>Montant</th><th>Situation</th><th>Date opération</th></tr>
<tr align="center"><td width="100" ><label size="12" name="hfDate1"/></td>
<td width="220"><label size="30" name="hfLib1"/></td> 
<td width="90" ><label size="10" name="hfMont1"/></td>
<td width="80"> <label size="3" name="hfSitu1" /></td>
<td width="80"> <label size="3" name="hfDateOper1" /></td>
</tr>
</table>
<p class="titre"></p>
<p class="titre" /><div style="clear:left;"><h2>Hors classification</h2></div>
<table style="color:white;" border="1">
<tr><th>Nb<br>Justificatif</th><th>Montant</th><th>Situation</th><th>Date opération</th></tr>
<tr align="center"><td width="100" ><label size="12" name="hcDate"/></td>
<td width="220" ><label size="30" name="hcMontant"/></td>
<td width="80"> <label size="3" name="hcSituation" /></td>
<td width="80"> <label size="3" name="hcDateOpereration" /></td>
</tr>
</table>
<p class="titre"></p>
</form>
</div>
</div>
</body>
</html>
QQ peut me dire comment le rendre dynamique SVP!!!!!!!!!!!
20 avril 2015 à 14:30:41

Bonjour vyk12,

Merci pour ton cours, cependant j'ai des questions concernant le TP 3.

Le TP à pour objectif de créer un système templates et datas, jusque la on peut comprendre que la méthode d'approche ressemble à un pattern Strategy ?

J'ai du mal à comprendre l'utilité de la mise en cache de données en partant du principe qu'il est demandé de mettre en cache les vues qui incluent la données.

Je comprends qu'il faut initialiser une classe Cache dans la classe Application, ainsi de cette façon si un cache de vue valide existe on envoi directement en sortie. (on en conclu que la mise en cache de données est inutile).

Si le cache n'existe pas ou est devenu invalide on rentre donc dans le contrôleur qui sera en charge de traiter la demande du client, aussi je ne comprends pas l'utilité de la méthode createCache dans chaque contrôleur c'est très répétitif, BackController peut avoir la charge ordonner la mise en cache, il a autant accès à l'instance Cache que les propriétés du contrôleur.

Je suis un peu perdu avec ce TP qui ne me donne pas d'orientation ou d'approche méthodologique, chacun à une vision différente de conception, peux-tu m'éclairer sur cette réalisation ?

Merci d'avance pour ton retour.

Cordialement,

-
Edité par 20uf 20 avril 2015 à 14:32:13

21 avril 2015 à 9:53:43

Bonjour vyk12,

C'est simple, je suis complètement perdue. L'activité est vraiment très dure.

Du coup, je suis bloquée pour avancer dans d'autres MOOC où on a besoin de la POO.

Cela finit par m'énerver !

Quand on débute, comme moi, la POO, l'activité est beaucoup trop dure.

Ce qui me réconforte c'est de voir que je ne suis pas la seule à penser cela, vu le premier commentaire de ce forum. 

J'aurais préféré une activité où il faut expliquer des points essentiels de la POO, en faisant comme si on s'adressait à quelqu'un qui connaît PHP mais pas la POO, pour voir si j'ai compris les points importants de la partie "[Pratique] Réalisation d'un site web".

Merci,

Cordialement,

22 avril 2015 à 16:23:33

Salut Victor, 

il est pas mal ton tuto mais peut-etre un peu trop "académique" par rapport à l'esprit du site Openclassroom :

- ton vocabulaire est précis et tes phrases concises -> ca donne un contenu très dense, qui fatique. Une bonne apprentissage est fait de  répétitions, d'analogies, d'images... c'est beaucoup plus long à faire mais tellement plus agréable pour un novice

- tu as tendance à peut-etre etre trop exhaustif dans tes exemples. Ca donne parfois une succession de définition sans lien entre elles. Pourquoi ne pas se concentrer sur les aspects plus essentiels, quitte à en zapper d'autres ?

- là où des auteurs tel que Mathieu Nebra arrive à se mettre au niveau du novice (dans les questions qu'il pose, dans le style d'écriture...), on a plus l'impression d'entendre un vieux prof fatigué quand on te lit.

désolé, mes remarques sont très directes:ninja: et pas forcément justifiées. En effet ; je viens de finir ce tuto et c'est une impression générale que j'ai essayé de traduire. Ces remarques ont pour but de rassurer ceux qui ont du mal à le comprendre et pourquoi pas, t'aider à t'améliorer.

Pour finir je suis conscient de la difficulté de pondre ton tuto et tiens à te remercier encore de l'avoir publié.

23 avril 2015 à 12:36:20

Merci de m'envoyer votre e-mail pour que je puisse vous envoyé mes deux fichier qui me pose problème depuis lors.

25 avril 2015 à 20:14:48

Bonjour,

Lors du TP: Des Personnages Spécialisés, je ne comprends pas la fin du code de la méthode LancerUnSort:

<?php
class Magicien extends Personnage
{
  public function lancerUnSort(Personnage $perso)
  {
    if ($this->degats >= 0 && $this->degats <= 25)
    {
      $this->atout = 4;
    }
    elseif ($this->degats > 25 && $this->degats <= 50)
    {
      $this->atout = 3;
    }
    elseif ($this->degats > 50 && $this->degats <= 75)
    {
      $this->atout = 2;
    }
    elseif ($this->degats > 50 && $this->degats <= 90)
    {
      $this->atout = 1;
    }
    else
    {
      $this->atout = 0;
    }
    
    if ($perso->id == $this->id)
    {
      return self::CEST_MOI;
    }
    
    if ($this->atout == 0)
    {
      return self::PAS_DE_MAGIE;
    }
    
    if ($this->estEndormi())
    {
      return self::PERSO_ENDORMI;
    }
    
    $perso->timeEndormi = time() + ($this->atout * 6) * 3600;
    
    return self::PERSONNAGE_ENSORCELE;
  }
}

sur la ligne $perso->timeendormi = time() + ($this->atout *6) * 3600;
Je pensais qu'on ne pouvait pas modifier directement les attributs private, et qu'on devait passer par un setter, mais je me rend compte qu'au sein de la classe c'est possible mais alors je me pose encore une question, si c'est aussi simple pourquoi la fonction frapper() ne se résume pas de la même manière:
$perso->degats += 5;  au lieu d'avoir créé deux méthodes frapper() et recevoirdegat()  ?

26 avril 2015 à 20:05:23

Juste pour signaler, dans la partie 4 "Manipulation de données stockées", il n'est pas précisé qu'il faut rajouter le constructeur dans la classe "Personnage", donc l'hydratation n'est pas appelée lors de la création d'un objet => objets vides lors de récupération des données dans la BDD !

class Personnage{
	private	$_id,...;
	
	public function __construct(array $donnees)
	{
		$this->hydrate($donnees);
	}

...


Voilà sinon super tuto qui m'a bien éclairé, merci ! :D

28 avril 2015 à 2:38:38

Salut les zéros,

J'ai suivis le tuto et c'est vraiment super :magicien: 

Par contre je suis là car je suis bloqué, en lisant la partie 3 chapitre le frontend

Je n'arrive pas à accéder au news unique.

en pointant sur l'un des titre des news de l'index je vois  bien en bas de ma page "news-1.html" mais si je clique c'est toujours la même page

Je suis vraiment bloqué. Et vous vous avez réussi à vous en sortir ? 

La réussite se trouve au bout des efforts !
29 avril 2015 à 20:41:50

Bonjour,

J'ai créé ce script:

<?php

class MaClasse
{
    public $attribut = "Voici un attribut !";
    
   
}

$objet = new MaClasse;


$objet->attribut = "Voici un attribut modifié...";
echo $objet->attribut;


//on a modifié l'attribut en dehors de la classe !!
?>

????

29 avril 2015 à 21:28:14

Bonjour,

mais je vois pas où est le problème ?

L'attribut est public donc on peut le modifier en dehors de la class.

-
Edité par hatll 29 avril 2015 à 21:29:58

La réussite se trouve au bout des efforts !
30 avril 2015 à 0:50:15

BONJOUR ,

Broeder je ne vois pas le problème , ton attribut est bien public donc modifiable 

cordialement .

ne jamais baisser les bras car le succès n'est jamais loin
30 avril 2015 à 15:04:23

Lorsque je lisais le TP je pensais que les personnage allaient réellement se créer mais pourquoi  ce n'est pas le cas ?
La justice est la plus pire des injustices.

MOOC Programmez en orienté objet en PHP

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown