Forums Casio - Projets de programmation

Index du Forum | Projets de programmation | Php mvc
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Posté le 18/04/2017 09:24

Php mvc :

Yo, malgré toutes les discussions sur le chat à ce propos, j'ai quand-même décidé de faire un sujet à ce propos pour être certain de ce que je m'apprête à modifier.

Voici mon code :

https://hastebin.com/rocunuzici.xml

Ce que je comptais en faire :

- Laisser le formulaire tel quel, la Vue.
- Mettre les lignes 17 à 64 dans un fichier, le contrôleur, dans une fonction inscription avec en paramètre les lignes 6 à 15.
- Mettre les lignes 60 à 62 dans un fichier, le modèle.

Moins important :

- Passer le formulaire en POST.
- Hasher le MDP dans la base de données (avec sha1).

Est-ce que ça vous paraît correct ?

La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)



Intelligide
Hors ligne
Banni de la Shoutbox
Niveau: Vétéran
Points: 602
Défis: 5
Message
Citer : Posté le 18/04/2017 10:08 | #
- Laisser le formulaire tel quel, la Vue.

Utilises
<?= $Nom ?>
. ça fait la même chose que
<?php echo $Nom ?>
mais en plus concis et de la même manière que les moteurs de templates que tu devras utiliser plus tard dans les backends.

Mettre les lignes 17 à 64 dans un fichier, le contrôleur, dans une fonction inscription avec en paramètre les lignes 6 à 15.

Pour ma part, j'aurais plutôt passer le tableau $_GET en paramètres et mis les lignes 12 à 15 dans le contrôleur.

- Mettre les lignes 60 à 62 dans un fichier, le modèle.

Les lignes 60 à 62 ont aussi leur place dans le modèle. Il ne doit normalement pas y avoir de requêtes SQL dans le contrôleur(sauf si tu utilises un ORM,mais dans ce cas, c'est pas vraiment du SQL)

- Passer le formulaire en POST

Excellent point. Faut respecter le HTTP dans la vie

- Crypter le MDP dans la base de données (avec sha1).

Utilises la sha2 (sha256 ou sha512) pour plus de sécurité.
----------------------------------
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Citer : Posté le 18/04/2017 10:34 | #
Ah oui, la fonction aussi doit aller dans le modèle et l'appel dans le contrôleur, je me suis trompé. Comment faire pour include un fichier qui est dans un dossier à part ? J'ai le dossier Modèle, le dossier Vue et le dossier Contrôleur, comment, depuis un fichier dans la Vue, include un fichier dans le contrôleur ? Ça paraît con mais le chemin ne fonctionne pas :/

Pour le reste, je prends note, merci
----------------------------------
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Intelligide
Hors ligne
Banni de la Shoutbox
Niveau: Vétéran
Points: 602
Défis: 5
Message
Citer : Posté le 18/04/2017 10:37 | #
Ben
include("../Modèle/modele.php");
----------------------------------
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Citer : Posté le 18/04/2017 12:22 | #
Ok, j'ai tenté la chance :

Vue : https://hastebin.com/qadaraqomi.xml
Modèle : https://hastebin.com/nahakazeku.xml
Contrôleur : https://hastebin.com/yihudoremu.xml

+ Connexion à la BDD (bdd.php) : https://hastebin.com/zopekijupe.xml

J'ai un fichier Vue, Modele et Controleur mais j'ai ceci en résultat :

https://gyazo.com/2901749e4a12c88af765a188125f069a

Une idée du souci ?
----------------------------------
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Intelligide
Hors ligne
Banni de la Shoutbox
Niveau: Vétéran
Points: 602
Défis: 5
Message
Citer : Posté le 18/04/2017 12:31 | #
Dans ta vue, il faut que Tu inclues ton contrôleur
----------------------------------
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Citer : Posté le 18/04/2017 12:34 | #
Ça ne suffit pas de l'avoir mis dans le 'action' du formulaire ? Et ça va régler les erreurs ?
----------------------------------
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Intelligide
Hors ligne
Banni de la Shoutbox
Niveau: Vétéran
Points: 602
Défis: 5
Message
Citer : Posté le 18/04/2017 12:37 | #
Ben il faut bien que les variables que tu utilises soit définies
----------------------------------
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Citer : Posté le 18/04/2017 12:38 | #
https://gyazo.com/95d49ed3abede6c6d88a49fb9ec55b18

Je pense que le passage du $_GET en fonction ne se fait pas comme je l'ai fait mais j'ai aucune idée de comment passer un formulaire GET en paramètre.
----------------------------------
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Amael
Hors ligne
Membre
Niveau: Élite
Points: 214
Défis: 9
Message
Citer : Posté le 18/04/2017 19:50 | #
Alors, par rapport à ton code, je dirais :

Vue :

Contrairement à Intelligide, je préfère les
<?php echo $var ?>
aux
<?= $var ?>
car ils sont plus clairs lors de la lecture (mais ce n'est que mon avis). Sinon, utilise un véritable moteur de templates...

Modèle:

Euhh, attends, c'est ton modèle qui gère la soumission du formulaire ???
Et en plus, le modèle émet du texte 
Bref, résumons ce que doit faire un modèle : L'interaction avec la BDD (lecture, écriture, modification, etc.) avec éventuellement des vérifications.

Pour répondre à ta question, $_GET est une variable superglobale, elle est présente dans TOUS les scopes, tu n'as donc pas besoin de la passer en paramètre de ta fonction...

Contrôleur:

C'est LUI qui doit faire la gestion du formulaire. (Ou un autre fichier, dans un dossier Formulaire, par exemple)
Personnellement, je trouve qu'il est un peu léger.

Sinon, lors de la validation du formulaire, tu ne vérifie pas si toutes les variables GET sont présentes avant de les utiliser (l 13 à 16), d'où un risque d'erreurs 500 (Key "Email" doesn't exist in array "$_GET".) au lieu d'un simple Veuillez entrer un pseudo.
Lors d'erreurs de validation, il serait intéressant de soit:
- rediriger l'utilisateur vers le formulaire (qui serait alors vide... )
- afficher le formulaire prérempli, sauf pour les champs invalides et les mots de passe.
Il faudrait utiliser
require('path/du/fichier.php');
au lieu de
include('path/du/fichier.php');
car include, lorsqu'elle échoue, ne stoppe pas l'execution de la page, ce qui déclenche d'autres erreurs, alors que require si.
----------------------------------
Si c'est possible, c'est fait; si c'est impossible, cela se fera.

Mes programmes (À noter sous peine de ban :E )
Monopoly bank Pratique si vous perdez les billets
Remplissez facilement vos listes avec Statistiques
Et des conversions des unités du système métrique.
Dark storm
Hors ligne
Administrateur
Niveau: Aucun
Points: 9452
Défis: 170
Message
Citer : Posté le 18/04/2017 20:49 | #
Rapidement, pourquoi il ne faut plus utiliser SHA-1.
----------------------------------
Soutenez-les !





#YAPHPH
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Citer : Posté le 18/04/2017 22:18 | #
Merci pour ces conseils Amael, j'ai vraiment beaucoup de mal avec cette connerie et tant que j'aurais pas réussi un exemple concret comme celui-ci de la bonne façon, je n'y arriverai foutrement pas. Il faudrait que je tente un contact oral avec quelqu'un pour ça.
----------------------------------
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Totoyo
Hors ligne
Membre d'honneur
Niveau: Vétéran
Points: 15727
Défis: 94
Message
Citer : Posté le 19/04/2017 19:06 | #
C'est en codant des projets de plus en plus complexes que tu vas comprendre l'intérêt de l'architecture MVC
----------------------------------
Smashmaster
Hors ligne
Ancien modérateur
Niveau: Vétéran
Points: 4559
Défis: 253
Message
Citer : Posté le 20/04/2017 18:25 | #
Pour les requêtes SQL je te conseille d'utiliser PDO : http://php.net/manual/fr/book.pdo.php

exemple :

PDO a écrit :

try {
$dbh = new PDO('mysql:host=127.0.0.1;dbname=nomdelabase', 'root', 'psw');
$dbh->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION); // http://php.net/manual/fr/pdo.setattribute.php
$stmt = $dbh->prepare('INSERT IGNORE INTO table VALUES (:uid1, :uid2);');
$stmt->bindParam(':uid1', $this->_uid1);
$stmt->bindParam(':uid2', $this->_uid2);
$stmt->execute();
} catch (PDOException $e) {
//erreur
}


C'est plus sécurisé.

Ajouté le 20/04/2017 à 18:31 :
Pour chiffrer un mot de passe il y a password_hash : http://php.net/manual/fr/function.password-hash.php

Pour vérifier le mot de passe il y a password_verify : http://php.net/manual/fr/function.password-verify.php
----------------------------------
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Citer : Posté le 20/04/2017 21:12 | #
Merci pour ces infos, je vais déjà essayer de passer le code en MVC avant de l'améliorer

Ajouté le 21/04/2017 à 16:19 :
J'ai pris connaissance de vos conseils sur les optimisations et améliorations de sécurité mais je me suis pour le moment concentré sur le mode MVC.

Voici mes nouvelles pages dont la trame a été validée par ma prof, il subsiste trois soucis :

Modèle : https://hastebin.com/ifusikoquj.pl
Vue : https://hastebin.com/vekahiquyi.xml
Contrôleur : https://hastebin.com/ceziyedeci.xml

Premier souci : J'ai créé une fonction dans le contrôleur. Dans l'action du formulaire de ma vue, je pense que la fonction est appelée mais que je reste dans le fichier.
Deuxième souci : J'ai mis en paramètre de ma fonction le tableau $_GET pour pouvoir récupérer la valeur de toutes mes variables, que je devrais mettre en return mais ça ne fonctionne pas.
Troisième souci : Celui-ci est lié au deuxième souci, dans le modèle, vous pouvez voir le INSERT des valeurs de mes variables. Vu qu'elles ne sont pas retournées dans la fonction, dans le modèle, ces variables ne valent donc rien et la base de données n'est donc pas remplie.

Avez-vous une idée s'il vous plait ?
----------------------------------
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Xavier59
Hors ligne
Membre de CreativeCalc
Niveau: Intermédiaire
Points: 1318
Défis: 12
Message
Citer : Posté le 21/04/2017 16:28 | #
function inscription($_GET)


C'est inutile.
$_GET est une super globale, c'est à dire qu'elle est accessible absolument partout. Tu n'as donc pas besoin de la passer en paramètre. Tu peux donc utiliser $_GET sans aucune précédente déclaration, php s'en occupe tout seul !
Essai de l'enlever et reviens vers nous si tu as encore des problèmes
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Citer : Posté le 21/04/2017 16:34 | #
Ça me règle le souci numéro 2, ma fonction fonctionne aussi, ce qui règle normalement le souci numéro 1, il ne me reste que le 3, qui est que je n'ai pas les valeurs de mes variables dans le fichier modèle, comment les lui passer ?
----------------------------------
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Xavier59
Hors ligne
Membre de CreativeCalc
Niveau: Intermédiaire
Points: 1318
Défis: 12
Message
Citer : Posté le 21/04/2017 16:41 | #
Est-ce que tu es sûr modele.php est bien appelé et que la ligne 6 est bien exécuté ?
Parce qu'a vu d'oeuil je ne vois pas le problème. Les variables sont normalement passées automatiquement au fichier modèle quand tu le require.
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Citer : Posté le 21/04/2017 17:44 | #
Je suis certain que modele.php est appelé car j'ai ensuite la redirection sur google. Pour les variables, en faisant le require, les variables ne sont certainement pas passées automatiquement, ce pourquoi je pense que le problème vient de là. Dès que je récupère mon PC (je l'ai prêté un peu ce soir), je tente un DIE pour voir si j'ai une erreur.
----------------------------------
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Xavier59
Hors ligne
Membre de CreativeCalc
Niveau: Intermédiaire
Points: 1318
Défis: 12
Message
Citer : Posté le 21/04/2017 18:01 | #
Soit le require foire (erreur de chemin), soit il y a un problème avec la base de donnée, mais les variables existent.
Faire un require/include, c'est comme-ci tu copié collé le code dans ton fichier qui fait l'appel
Eltoredo
Hors ligne
Modérateur
Niveau: Intermédiaire
Points: 4232
Défis: 35
Message
Citer : Posté le 21/04/2017 18:14 | #
Les fichiers sont actuellement tous au même endroit pour mes tests, ça vient pas de là. Tu es sûr que les variables sont automatiquement passées avec le require ? Je teste le DIE dès que je peux.

Et non, un require, ça t'emmène sur la page que tu as appelée et le code s'exécute, si tout se passe bien, tu retournes dans la page qui faisait l'appel. J'ai appris ça tout à l'heure en me trompant avec ma prof. Include, je ne suis pas sûr
----------------------------------
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)


Index du Forum | Projets de programmation | Php mvc
Publicité et partenaires
Casio Education
Casio éducation

TI-Planet
Casiopeia
Casiopeia
CasioFan, la communauté ClassPad
CasioFan
CodeWalrus
CodeWalrus

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2015 | Il y a 78 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Rugby Manager | Jeu de basket | Jeu de handball | Jeu de tennis | Nova Raider | Réparation téléphone | Soccer Rush | Tasty Tale

Planète Casio est un site communautaire indépendant, géré bénévolement et n'est donc pas affilié à Casio | Toute reproduction de Planète Casio, même partielle, est interdite
Les fichiers, programmes et autres publications présents sur Planète Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des licences ou des copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd