J'ai un soucis je suis en train de créer mon tout premier site internet j'ai créée la base de données les tables sont déjà reliées entre elles mais dans l'inscription le index.php?page=setInscription me mène sur une page 404 not found et l'user n'est pas enregistré dans la base de données voici le code des différentes pages si vous pouvez m'aider:
<?php
include_once('model/usersModel.php');
class UsersController extends UsersModel
{
protected $idUser;
protected $nom;
protected $prenom;
protected $tel;
protected $email;
protected $mdp;
public function inscription()
{
$this->nom = trim($_POST['nom']);
$this->prenom = trim($_POST['prenom']);
$this->tel = trim($_POST['tel']);
$this->email = trim($_POST['email']);
// $this->mdp = trim($_POST['mdp']);
$this->mdp = password_hash($_POST["mdp"], PASSWORD_DEFAULT);
if ($this->nom != '' && $this->prenom != '' && $this->email != '' && $this->mdp != '') {
// je recupere les informations de l'utilisateur par email
$user = $this->getUserByEmail();
if($user == false) {
$this->setUser();
echo "<h1>Inscription OK</h1>";
} else {
echo "<h1>Utilisateur existant";
}
} else {
$erreur = "Merci d'entrer les informations correctement";
include('view/inscription.php');
}
}
public function authentification()
{
$this->email = trim($_POST['email']);
$this->mdp = $_POST["mdp"];
if ($this->email != '' && $this->mdp != '') {
$user = $this->getUserByEmail();
if (password_verify($this->mdp, $user["mdp"])) {
$_SESSION["nom"] = $user['nom'];
$_SESSION["prenom"] = $user['prenom'];
$_SESSION["email"] = $user['email'];
$_SESSION["id"] = $user['id'];
header('Location: index.php');
echo "<h1>Authentification OK</h1>";
} else {
$erreur = "Email ou mdp incorrecte";
include('view/authentification.php');
}
} else {
$erreur = "Merci d'entrer les informations correctement";
include('view/authentification.php');
}
}
public function monCompte()
{
$this->idUser = $_SESSION['id'];
$user = $this->getUserById($this->idUser);
include('view/monCompte.php');
}
public function modifierMonCompte()
{
$this->idUser = $_SESSION['id'];
$user = $this->getUserById($this->idUser);
include('view/modifierMonCompte.php');
}
public function modification()
{
$this->nom = trim($_POST['nom']);
$this->prenom = trim($_POST['prenom']);
$this->tel = trim($_POST['tel']);
$this->email = trim($_POST['email']);
$this->idUser = $_SESSION['id'];
if ($this->nom != '' && $this->prenom != '' && $this->email != '') {
// je recupere les informations de l'utilisateur par email
$this->updateUser();
$_SESSION["nom"] = $this->nom;
$_SESSION["prenom"] = $this->prenom;
$_SESSION["email"] = $this->email;
echo "<h1>modification OK</h1>";
} else {
$user = $this->getUserByEmail();
$erreur = "Merci d'entrer des informations correctes";
include ('view/modifierMonCompte.php');
}
}
}
usersModel:
<?php
include_once('bdd.php');
class usersModel
{
private $bdd;
public function __construct()
{
$this->bdd = Bdd::connexion();
}
public function setUser()
{
$insert = $this->bdd->prepare("INSERT INTO users(nom,prenom,tel,email,mdp)value(?,?,?,?,?)");
return $insert->execute([$this->nom,$this->prenom,$this->tel,$this->email,$this->mdp]);
}
public function getUsers()
{
#...
}
public function getUserByEmail()
{
return $this->bdd->query("SELECT * FROM users WHERE email='$this->email'")->fetch(PDO::FETCH_ASSOC);
}
public function getUserById($id)
{
return $this->bdd->query("SELECT * FROM users WHERE id='$id'")->fetch(PDO::FETCH_ASSOC);
}
public function updateUser()
{
$insert = $this->bdd->prepare("UPDATE users SET nom=?,prenom=?,tel=?,email=? WHERE id=?");
return $insert->execute([$this->nom,$this->prenom,$this->tel,$this->email,$this->idUser]);
}
}
router.php:
<?php
$page = @$_GET['page'];
switch ($page) {
case 'contact':
include('view/contact.php');
break;
case 'inscription':
include('view/inscription.php');
break;
case 'setInscription':
include('controller/usersController.php');
$inscription = new UsersController;
$inscription->inscription();
break;
case 'login':
include('view/login.php');
break;
case 'setAuth':
include('controller/usersController.php');
$authentification = new UsersController;
$authentification->authentification();
break;
case 'monCompte':
include('controller/usersController.php');
$monCompte = new UsersController;
$monCompte->monCompte();
break;
case 'modifierMonCompte':
include('controller/usersController.php');
$monCompte = new UsersController;
$monCompte->modifierMonCompte();
break;
case 'modification':
include('controller/usersController.php');
$monCompte = new UsersController;
$monCompte->modification();
break;
case 'ajouterArticle':
include('controller/articlesController.php');
$moncompte = new ArticlesController;
$moncompte->formAjoutArticles();
break;
case 'setArticle':
include('controller/articlesController.php');
$moncompte = new ArticlesController;
$moncompte->ajoutArticle();
break;
case 'deconnexion':
$_SESSION = array();
header('Location: index.php');
break;
default:
include('controller/articlesController.php');
$articles = new ArticlesController();
$articles->dernierArticles();
}?>
le traintement de formulaire d'inscription se fait dans le fichier inscription.php mais l'action dans formulaire est vers page index.php , peut être l'erreur vient de ça
inscription.php et index.php sont dans le même répertoire ?
Non, index.php n'est dans aucun répertoire, tandis que inscription.php est dans le répertoire view
hous a écrit:
Salut
le traintement de formulaire d'inscription se fait dans le fichier inscription.php mais l'action dans formulaire est vers page index.php , peut être l'erreur vient de ça
action="index.php?page=setInscription"
Il y a forcément un souci avec ce chemin mais je ne comprend vraiment pas pourquoi....
Désolée pour la lenteur de ma réponse j'étais en stage entre temps je n'avais plus du tout le temps pour mon projet perso
Il y a beaucoup de chose à dire avec les codes que tu nous présentes. Voici les problèmes que j'ai rencontré :
Utilisation du "@"
Dans ton code j'ai vu que tu as utilisé à 2 reprise le "@" pour cacher les erreurs.Il ne faut surtout pas l'utiliser car dans 99.9% des cas, ces erreurs tu peux les traiter et tu le doit.
Par exemple dans le fichier router.php tu as mis un "@" pour le $_GET['page'] car potentiellement cette case dans le tableau $_GET n'existe pas si on ne transmets pas de paramètre. Mais en réalité tu peux le gérer assez simplement avec une simple condition et voir même plus simplement depuis php 7 (qui est dispo depuis 6, 7 ans)
Voici les étapes de transformation de ton @ pour le router :
// Ce que tu as mis
$page = @$_GET['page'];
// La condition à faire
$page = '';
if (isset($_GET['page'])) {
$page = $_GET['page'];
}
// On raccourci le code avec un ternaire
$page = isset($_GET['page']) ? $_GET['page'] : '';
// On raccorci encore plus avec l'operateur ?? de php 7
$page = $_GET['page'] ?? '';
Indentation et nommage
Fait attention à la propreté du code et au nommage de tes éléments (variables, méthodes, classes, etc).
Exemple le switch case du router qui s'indente de plus en plus alors qu'il devrait être au même niveau. Exemple aussi au niveau des classes, un coup tu as fais du PascalCase (UsersController, majuscules à chaque mot même au premier) et de l'autre du camelCase (usersModel, majuscules à chaque mot sauf au premier).
Pour le coup, PHP à une convention (les PSR) qui indique clairement qu'il faut nommer les classes avec du PascalCase :
Je vois que tu as fait un extends de usersModel pour le UsersController. Pourquoi ?
L'héritage c'est vraiment quand on peut dire que un élement B est un A. Est-ce qu'un controller est un model ? Je ne pense pas Du coup aucune raison de faire de l'héritage ici, mais je pense que tu en as fait car tu as du avoir un problème en amont.
Voici un exemple de comment faire un peu mieux à partir de ce que tu nous montre (dans le sens ou on peu largement faire mieux mais que cela fait intervenir des notions beaucoup plus avancée et le but n'est pas de te perdre non plus) :
./router.php :
<?php
/* Emplacement: ./router.php */
// Il faut éviter absolument le @ pour cacher les erreurs
$page = $_GET['page'] ?? '';
/**
* Tu duplicode le code du call du controller
* -> fonction/méthode
*
* @param string $controller
* @param string $method
* @return void
*/
function callControllerAction(string $controller, string $method): void
{
require_once __DIR__ . "/controllers/{$controller}.php";
}
switch ($page) {
case '':
callControllerAction('ArticleController', 'lastPublished');
break;
case 'contact':
// views au pluriels car il y en a plusieurs
require_once __DIR__ . '/views/contact.php';
break;
case 'inscription':
// Au lieu de inscription je mets en anglais vu que le nom du dossier est en anglais
require_once __DIR__ . '/views/register.php';
break;
case 'connexion':
require_once __DIR__ . '/views/login.php';
break;
case 'post-inscription':
callControllerAction('AuthController', 'postRegister');
break;
case 'post-connexion':
callControllerAction('AuthController', 'postLogin');
break;
// Je te laisse le soin de faire le reste
default:
// ERREUR 404, page not found
header('HTTP/1.1 404 Not Found', true, 404);
require_once __DIR__ . '/views/404.php';
break;
}
./entities/User.php :
<?php
class User
{
public function __construct(
private int $id,
private string $firstname,
private string $lastname,
private string $email,
private string $phone,
private string $password,
) {
}
public function id(): int
{
return $this->id;
}
public function firstname(): string
{
return $this->firstname;
}
public function lastname(): string
{
return $this->lastname;
}
public function email(): string
{
return $this->email;
}
public function phone(): string
{
return $this->phone;
}
public function password(): string
{
return $this->password;
}
public function setPassword(string $password): void
{
$this->password = password_hash($password, );
}
}
./models/UsersModel.php :
<?php
/* Emplacement: ./models/UsersModel.php */
require_once __DIR__ . '/DB.php';
require_once __DIR__ . '/../entities/User.php';
class UsersModel
{
public function __construct(
// PHP 7.4
private PDO $db
) {
}
public function insert(User $user): void
{
$requestInsert = $this->db->prepare(
'insert into users (firstname, lastname, email, pass, phone)
values (:firstname, :lastname, :email, :password, :phone)'
);
$requestInsert->execute([
':firstname' => $user->firstname(),
':lastname' => $user->lastname(),
':email' => $user->email(),
':password' => $user->password(),
':phone' => $user->phone(),
]);
}
public function findByEmail(string $email): User|null
{
$requestSelect = $this->db->prepare(
'select id, firstname, lastname, email, pass, phone
from users where email = :email limit 1'
);
$requestSelect->execute([':email' => $email]);
$userSQL = $requestSelect->fetch();
if ($userSQL === false) {
return null;
}
return new User(
$userSQL['id'],
$userSQL['firstname'],
$userSQL['lastname'],
$userSQL['email'],
$userSQL['phone'],
$userSQL['pass']
);
}
}
$usersModel = new UsersModel(DB::connection());
./controllers/AuthController.php :
<?php
/* Emplacement: ./controllers/AuthController.php */
/** @var string $method */
/** @var UsersModel $usersModel */
require_once __DIR__ . '/../entities/User.php';
require_once __DIR__ . '/../models/UsersModel.php';
class AuthController
{
public function __construct(
private readonly UsersModel $usersModel,
) {
}
public function postRegister(): void
{
$firstname = $_POST['firstname'] ?? null;
$lastname = $_POST['lastname'] ?? null;
$email = $_POST['email'] ?? null;
$password = $_POST['password'] ?? null;
$phone = $_POST['phone'] ?? null;
$errors = [];
if (empty($firstname) || empty($lastname) || empty($email) ||
empty($password) || empty($phone)) {
$errors[] = 'Merci de renseigner toutes les informations obligatoires !';
}
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
$errors[] = "Format incorrecte pour l'adresse mail";
}
if (mb_strlen($password) < 8) {
$errors[] = 'Le mot de passe doit comporter au moins 8 caractères';
}
if ($this->usersModel->findByEmail($email) !== null) {
$errors[] = "Un utilisateur existe déjà avec cette adresse mail";
}
if (!empty($errors)) {
$_SESSION['errors'] = $errors;
header('Location: /router.php?page=inscription');
exit();
}
$user = new User(0, $firstname, $lastname, $email, $phone, '');
$user->setPassword($password);
$this->usersModel->insert($user);
header('Location: /router.php?page=connexion');
exit();
}
}
$controller = new AuthController($usersModel);
$controller->$method();
Voilà pour l'exemple de code avec juste la partie process de l'inscription d'un utilisateur. Je préviens que le code écrit n'a pas été testé et n'est qu'un exemple. C'est à toi après de bien réfléchir en amont à comment organiser ton code. Et n'oublie pas aussi que php évolue et que maintenant on est en php 8.1 et qu'il y a eu plein de nouveauté intéressante.
Je t'avoue que je suis complètement débutante donc ton message avec autant de détails et explication me fait trop trop plaisir et je t'en remercie,
Après j'hésite à utiliser ton code, car c'est un projet pour mes exams, et j'y comprend pas grand chose ^^'
du coup je pense le tester si je fais un site toute seule de mon côté les conseils je les prend sur, c'est juste que c'est vrai que ça va un peu vite pour moi, que veux tu dire quand tu dis qu'il faut éviter l'utilisation du @? Et aussi pour l'extends j'ai juste suivi le modèle d'un site qu'on avait fais avec un formateur, mais je vais me concentrer et réviser sur ton code ça c'est sur, merci pour ta patience et ta gentillesse!
J'ai réglé le problème de l'inscription c'était une toute petite erreur de syntaxe, j'avais aussi réussi à faire la connexion mais ça ne fonctionne plus
Inscription et connexion
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
My website : Mon serveur discord, Se demerder tout seul, Faille XSS et SQL