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
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é.
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
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.
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 ?
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.
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 , 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();
}
}
}
}
@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.
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 ?
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".
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 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é.
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() ?
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 !
<?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 !!
?>
Making functional apps for digital products @NEOTIC
-
Making functional apps for digital products @NEOTIC
-