MEssage Alerte s'ouvre à l'ouverture de la page

Fermé
malo91 - 4 févr. 2021 à 15:22
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 - 5 févr. 2021 à 20:25
Bonjour, bonjour ! voici mon petit souci !
j'ai trouvé le moyen de faire une alerte ( je mets mon code hph dans mes controllers exemple $errors) et j'ai dans mes vues :
<?php if (!empty($errors)): ?>
<div class="alert alert-dark alert-dismissible" style="width: 700px;" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span></button>
<p> les champs ne sont pas conforment</p>
<ul>
<?php foreach ($errors as $error): ?>
<li><?= $error; ?> </li>
<?php endforeach; ?>
</ul>
</div>
<?php endif;?>

ca marche ! sauf que ca marche tellement bien que le message :
par exemple celui du mot de passe et pseudo : mon alerte se met à l'ouverture de la page car les champs ne sont pas encore remplis
la croix fonctionne, si j'ai une alerte ok je la ferme mais lorsque je reviens sur ma page pour me connecter j'ai deja mon alerte: vous n'avez pas rempli votre pseudo ou votre MP n'est pas correct !
alors je n'arrive pas , desolée, à faire un code qui dirait : il faut remplir les champs avant d'executer l'alerte! ???? j'y arrive pas :(

merci pour votre aide !! j'avance !!! mieux vaut doucement mais surement! merci par avance pour votre aide , à tres vite j'espere :)
A voir également:

9 réponses

jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
4 févr. 2021 à 16:07
Bonjour,

Déjà, quand tu postes du code, indique le LANGAGE dans les balises.
Explications ( à lire ENTIEREMENT !! ) disponibles ici.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code


Ensuite
Le souci est au niveau de ton controller ....

Tu ne dois alimenter la variable $error que si tu as "submit" ton formulaire....



0
Ok je croyais avoir fait ce qu il fallait dans le code...
J ai submit dans mon formulaire
Donc je fois procéder comment?
Merci
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
4 févr. 2021 à 20:14
Bah.... En utilisant à If..

Mais bon.. sans voir ton code comment espère tu que je puisse être plus précis ?
0
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 1
4 févr. 2021 à 20:35
oui je comprends evidemment !
if (!empty($_POST)) {
    $errors = array();

    if (empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])) {
        $errors['username']= "Votre pseudo ne correspond pas aux caractères valides";
    } else {
        $query = $pdo->prepare("SELECT id FROM user WHERE username = ?");
        $query->execute([$_POST['username']]);
        $u = $query->fetch();
        if ($u) {
            $errors['username'] = 'Pseudo déjà pris';
        }
    }

    if (empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']) {
        $errors['password']= "Votre mot de passe ne correspond pas ou n'est pas rempli correctement!";
    }

    if (empty($errors)) {
        $query =$pdo->prepare("INSERT INTO user SET username = ?, password = ?");
        $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
        $query->execute([$_POST['username'], $password]);
        die('Compte enregistré');
        $_SESSION['auth'] = $u;
            header('Location: ' . $router->url('blog'));
            exit();
    }
}


oui j'ai bien pensé malgré mon peu de connaissance à un if mais j'ai pas reussi

esperant que cela te suffise sinon tant pis pour moi !
0
Peut être if(isset $_POST('envoyer') {
Écho et j inclus ma div alert!
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
4 févr. 2021 à 21:21
Avant tout, un petit peu de lecture : ( à lire et à appliquer )
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Ce qui donne, en gros..
<?php
//---------------------------------------------------------------------------------------//
//démarrage des sessions
//---------------------------------------------------------------------------------------//
session_start();

//---------------------------------------------------------------------------------------//
//affichage des erreurs PHP
//---------------------------------------------------------------------------------------//
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//---------------------------------------------------------------------------------------//
//Fichier de connexion à la bdd 
//---------------------------------------------------------------------------------------//
require_once 'connexionBdd.php'; // a remplacer par le chemin vers ton fichier de connexion à la bdd


//---------------------------------------------------------------------------------------//
//----- Découpage du code en FONCTIONS -------------//
// tu pourrais d'ailleurs les déplacer dans un fichier à part  et y ajouter une fonction
// pour récupérer les infos de l'utilisateur à partir de son id,
// une fonction pour faire l'authentification .. bref.. tout ce qui concerne le user...
//---------------------------------------------------------------------------------------//

function getUserIdByUserName($username){
  global $pdo;
  try{
    $query = $pdo->prepare("SELECT id FROM user WHERE username = ?");
    $query->execute([$username]);
    return $query->fetch(PDO::FETCH_COLUMN); // https://phpdelusions.net/pdo/fetch_modes#FETCH_COLUMN

  }catch(Exception $e){
    echo "Erreur " : .$e->getMessage();
    exit;
  }
  
}

function addUser($username,$password){
  global $pdo;
  try{
    $query = $pdo->prepare("INSERT INTO user SET username = ?, password = ?");
    $password = password_hash($password, PASSWORD_BCRYPT);
    $result = $query->execute([$username, $password]);
  }catch(Exception $e){
    echo "Erreur " : .$e->getMessage();
    exit;
  }
  return $result;
}


//---------------------------------------------------------------------------------------//
//récupoération PROPRE des variables AVANT de les utiliser
//---------------------------------------------------------------------------------------//
$username = !empty($_POST['username']) ? trim($_POST['username']) : NULL;
$password = !empty($_POST['password']) ? trim($_POST['password']) : NULL;
$password_confirm = !empty($_POST['password_confirm']) ? trim($_POST['password_confirm']) : NULL;

//---------------------------------------------------------------------------------------//
//on vérifie que le formulaire a été envoyé  ( tu peux remplacer le "username" par le name de ton bouton submit si tu veux
//---------------------------------------------------------------------------------------//
if(isset($_POST['username'])){
  $_SESSION['auth'] = NULL;
  $errors = array();
  if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
    $errors['username']= "Votre pseudo ne correspond pas aux caractères valides";
  }else{
     $u = getUserIdByUserName($username);
    if ($u) {
      $errors['username'] = 'Pseudo déjà pris';
    }else{
      
     if (empty($password) || $password != $password_confirm) {
        $errors['password']= "Votre mot de passe ne correspond pas ou n'est pas rempli correctement!";
      } else {
        $result = addUser($username,$password);
        if($result){
          $_SESSION['auth'] = $u;
          echo " Compte enregistré ";
          // header('Location: ' . $router->url('blog'));
          exit();
        }
      }
    }
  } 
}



0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
4 févr. 2021 à 21:30
ah, une petite erreur dans mon code...

Si l'insertion en bdd se fait... $u n'existe pas ...
Si tu as bien mis un ID auto incrémenté en clé primaire de ta table... il faut modifier le code par :


function addUser($username,$password){
  global $pdo;
  try{
    $query = $pdo->prepare("INSERT INTO user SET username = ?, password = ?");
    $password = password_hash($password, PASSWORD_BCRYPT);
    $query->execute([$username, $password]);
    $result = $pdo->lastInsertId(); // retourne l'id auto-incrémenté généré lors de l'insertion en bdd
  }catch(Exception $e){
    echo "Erreur " : .$e->getMessage();
    exit;
  }
  return $result;
}



Et dans la variable de session
} else {
        $result = addUser($username,$password);
        if($result){
          $_SESSION['auth'] = $result;
          echo " Compte enregistré ";
          // header('Location: ' . $router->url('blog'));
          exit();
        }
0
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 1 > jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024
4 févr. 2021 à 21:36
oui j'ai bien mis mon ID autoIncrementé !
merci et comme j'ai aussi du mal à bien analyser avec mon MVC!!!
je vais reflechir à tout ca merci bcp de ton aide
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649 > malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022
4 févr. 2021 à 21:47
Vu que tu es en MVC,
Les fonctions concernant le user que j'ai mis dans le script devraient se trouver dans le M ...

Le M serait, ici, une class pour gerer tes users.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 1
Modifié le 4 févr. 2021 à 21:37
genial Merci bcp c'est bien ce genre d'info qui me manque !!
merci bcp je vais lire, essayer de tout comprendre et appliquer !! merci jordane45
0
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 1
Modifié le 5 févr. 2021 à 08:30
Vraiment merci !! car si on trouve qqun qui explique bien et bien c'est un grand bout de chemin de fait ! merci moi j'ai fait une vue user.php avec mes getters et setters et j'ai fait aussi une table
final class UserTable extends Table
{
    protected $table = "user";
    protected $class = User::class;

public function findByUsername(string $username)
{
    $query = $this->pdo->prepare('SELECT * FROM ' . $this->table . ' WHERE username = :username');
    $query->execute(['username' => $username]);
    $query->setFetchMode(\PDO::FETCH_CLASS, $this->class);
    $result = $query->fetch();

    if ($result === false) {
    throw new NotFoundException($this->table, $username);
    }
    return $result;

    }
    public function createUser(User $user)
    {
        $id = $this->create([
      'username' => $user->getUsername(),
      'password' => $user->getPassword(),
      'is_admin' => 1,
    ]);
        $user->setId($id);
        return $user;
    }

}


alors je pense qu'avec ce que tu m'as donné comme conseil et ce que j'avais fait dans un 1er temps j'ai du doublon et je vais inserer ce que tu m'as dit à la place de mon code!
en plus j'ai fait 3 fichiers : 1 pour s'inscrire un pour ceux qui sont inscrits et un pour les admin !! probablement que je me suis compliquee la vie mais je me dis qu'apres en relisant peut etre je supprimerai ! tu vois là :
dans mon phpmyadmin je mets 1 et donc 1 c'est mon admin et les autres seront mes membres !
en tout cas là je vais refaire selon tes conseils qui me semblent tres precieux !
merci

enfin de compte si je resume : je devrais mettre mes functions ( getUserIdByuser : equivalent à la mienne je crois sauf erreur : findByUsername)(moi j'ai une class Table mere + function addUsers ou createUser) dans ma table et dans mes controllers : mes if
et bien sur mes vues dans mes views (html)
c'est vrai que ce que je t'ai envoyé n'a rien de mvc poo car je me suis basee ( et j'ai compris) sur la lecon grafikart gestion membre et rectifiant selon mon besoin !

j'ai un fichier de connection à part pour pdo
j'espere que je t'ai pas trop embrouillé dans mes explications c'est pas le but !! je vais essayer de remettre au propre tout ca !
belle journee
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
5 févr. 2021 à 09:24
Je corrige juste une chose

oi j'ai fait une vue user.php avec mes getters et setters

Ce n'est pas une vue .. mais un model ( le M du MVC )


en plus j'ai fait 3 fichiers : 1 pour s'inscrire un pour ceux qui sont inscrits et un pour les admin

Pour le model, ce n'est pas utile.
Un seul model "user" suffit pour gérer tout ça




enfin de compte si je resume :
- je devrais mettre mes functions ( getUserIdByuser : equivalent à la mienne je crois sauf erreur : findByUsername)(moi j'ai une class Table mere + function addUsers ou createUser)
dans ma table
- et dans mes controllers : mes if
- et bien sur mes vues dans mes views (html)

Oui
0
Oui je me suis trompée c est bien dans mon M désolée. Je fais tout ca ok merci bien ..je me permettrai après d envoyer le final...J ai tellement envie d y arriver..je suis motivée. A ++
0
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 1
Modifié le 5 févr. 2021 à 19:00
Hello !! quand je parlais de 3 fichiers c'etait 3 fichiers controllers (:( rien ke ca) !
1/login_admin. php 2/login_member.php et 3/login_register.php! qui se ressemblent bcp au demeurant !
et un modele et 1 table ou j'ai mis ( enfin tenté de mettre mes query)!
en essayant de resumer : dans controller 1admin: j'appelle ma table, ma connection.

login_admin.php :

$user = new User();
$table = new UserTable(Connection::getPDO());
$pdo = Connection::getPDO();


if (empty($_POST['password'])) {
        $errors['password']= "Votre mot de passe ne correspond pas ou n'est pas rempli correctement!";
    }
    else {
    try {
        $user = $table->findByUsername($_POST['username']);
        if (password_verify($_POST['password'], $user->getPassword()) === true) {
            session_start();
            $_SESSION['auth'] = $user;
        }
        if ($user->getIsAdmin()) {
            header('Location: ' . $router->url('admin_posts'));
            exit();
        } else {
            header('Location: ' . $router->url('blog'));
            exit();
        }
    } catch (NotFoundException $e) {
    }
}
require_once('../views/auth/login_admin.php');

donc pour moi je dis : va chercher mon user et si il est administrateur ok tu te connectes sinon
tu es redirigé sur ma page blog et pas dans l'admin !!

ensuite j'ai mon 2eme login_member :
meme chose sauf que je pense lui dire : utilise la table user et recupere les donnees du user! (getUsername) + mes ifs......

login_member.php

$user = new User();
$table = new UserTable(Connection::getPDO());
$pdo = Connection::getPDO();
$user ->getUsername('username', 'password');
if (empty($_POST['password'])) {
        $errors['password']= "Votre mot de passe ne correspond pas ou n'est pas rempli correctement!";
    } else {
        if (!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])) {
            echo ' Vous allez être conntecté';
    }else {
        echo ' merci de recommencer';
    }
            if (password_verify($_POST['password'], $user->password)) {
                $_SESSION['auth'] = $user;
                header('Location: ' . $router->url('blog'));
                exit();
            }
        }
    }
require_once('../views/auth/login_member.php');


et mon 3eme login register : meme punition si ce n'est que j'ajoute l'appel de ma function getCreateUser

login_register.php:

$user = new User;
$pdo = Connection::getPDO();
$user->getUsername($user);

$errors = [];
if (!empty($_POST)) {
    $errors = array();
    if (empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])) {
        $errors['username']= "Votre pseudo ne correspond pas aux caractères valides";
    } else {
    if ($u) {
    $errors['username'] = 'Pseudo déjà pris';
    }
}
    if (empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']) {
    $errors['password']= "Votre mot de passe ne correspond pas ou n'est pas rempli correctement!";
}
    if (empty($errors)) {
        die('Compte enregistré');
        $_SESSION['auth'] = $u;
        header('Location: ' . $router->url('blog'));
        exit();
    }
}
require_once('../views/auth/login_register.php');


Ne vous fachez pas , j'avais une petite nenette avant qui m'avait dit : malory traduits mot à mot et tu y arriveras et ca m'a bcp aidé meme si je suis sure j ai ecrits des betises !! pardonnez moi :(

quant à ma table UserTable : j'ai fait plusieurs fonctions et celle createUser est sur la meme pratique que mes post et comment! et mes requetes pour creer, ajouter ou chercher


final class UserTable extends Table
{
    protected $table = "user";
    protected $class = User::class;

public function findByUsername(string $username)
{
    $query = $this->pdo->prepare("SELECT * FROM ' . $this->table . ' WHERE username = ?"');
    $query->execute([ $_POST['username']]);
    $query->setFetchMode(\PDO::FETCH_CLASS, $this->class);
    $result = $query->fetch();

    if ($result === false) {
    throw new NotFoundException($this->table, $username);
    }
    return $result;
    }

    public function addUser($username,$password)
    {
        $query = $this->pdo->prepare("INSERT INTO user SET  username = ?, password = ?");
        $password = password_hash($password, PASSWORD_BCRYPT);
        $query->execute([$username,$password]);
        $query->setFetchMode(PDO::FETCH_CLASS, $this->class);
        $result = $query->fetch();
         if ($result === true) {
            echo 'l \utilisateur est  enregistré';
        } else {
            echo 'merci de recommencer votre enregistrement ';
        }
        return $result;
    }

    public function createUser(User $user)
    {
        $id = $this->create([
      'username' => $user->getUsername(),
      'password' => $user->getPassword(),
      'is_admin' => 1,
    ]);
        $user->setId($id);
        return $user;
    }

}


quant à mon model : j'ai mes getters et setters pour avec les objets qui correspondent
à chaque colonne de ma bdd.


si vous voyez une plein de betises, go go go :)
sinon bon WE
0
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 1
Modifié le 5 févr. 2021 à 19:17
zut j'ai oublié le
 code en php
au dernier !!
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
5 févr. 2021 à 19:36
login_admin.php
  • Prends l'habitude de placer ton session_start au tout début de ton code php

,
login_register.php et login_member.php
Il manque le session_start

class UserTable :
Il manque les try/catch autour de chaque requête


    $query = $this->pdo->prepare("SELECT * FROM ' . $this->table . ' WHERE username = ?"');
  

Ta concaténation n'est pas bonne... tu as utilisé des simples quotes à la place des doubles.
0
malo91 Messages postés 53 Date d'inscription mardi 2 février 2021 Statut Membre Dernière intervention 3 août 2022 1
5 févr. 2021 à 20:22
ok merci je vais rectifier toutes mes betises !!! je savais pas qu'il fallait un try catch à chaque fois !! merci

et pour cession en haut , meme si j'ai mon fichier auth.php avec ma fonction?
<?php

namespace App;

use App\Security\ForbiddenException;

class Auth
{
    public static function check()
    {
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }
        if (!isset($_SESSION['auth'])) {
            throw new ForbiddenException();
        }
    }
}



merci pour tout !!! arff je galere :( merci jordane45 :)
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
5 févr. 2021 à 20:25
Si tu appelles ton fichier haute dans tes différents contrôleurs dans ce cas ça n'est plus nécessaire mais alors celui que tu as mis dans ton premier fichier n'est pas nécessaire non plus
0