non comme je t'ai indiquer utilise login($_POST['email'], $_POST['mdp']); ?Tu veux dire que je peux faire ça dans la page du formulaire : login($email, $mdp); ?
je pense que c'est une étourderie qui est resté parce qu'avec le temps on ne vois plus ce genre de chose à force de travailler sur son code (comme le nez au milieux de la figure ...
la fonction login corrigée (de ce point de vu la), il y a vraiment peux de différence.
<?php
function login($email,$mdp){
if(!empty($email) && !empty($mdp)){
if(preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!",$email)){
$req = Bdd::connect() -> prepare('SELECT id, pseudo, email, mdp FROM users WHERE email = :email AND mdp = :mdp');
$req -> execute(array('email' => $email,'mdp' => $mdp));
$donnees = $req -> fetch();
if(!$donnees){
echo '<span class="error">Vos identifiants sont incorrects</span>';
} else {
$_SESSION['id'] = $donnees['id'];
$_SESSION['pseudo'] = $donnees['pseudo'];
header('location: home');
}
$req -> closeCursor();
} else {
echo '<span class="error">Veuillez entrer une adresse électronique valide</span>';
}
} else {
echo '<span class="error">Veuillez remplir tous les champs</span>';
}
}
pour la classe Bdd. première chose, un objet doit être "étanche" au reste du monde. donc pas de constante globale déclarée autre par (même si je comprend pourquoi tu le fait je vais d'ailleurs les laisser par la suite).
Ensuite il te faut le concept de singleton (un peu détourné dans ce cas).
le but est d'avoir une seule instance de pdo pour ta base.
<?php
class Bdd {
private static $connection;
public static function connect() {
if (is_null(self::$connection)) {
try {
self::$connection = new PDO(DNS, USER, PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
self::$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
} catch (Exception $e) {
die('Échec lors de la connexion : ' . $e->getMessage());
}
}
return self::$connection;
}
}
du coup tu crée la connexion que la première fois et ensuite tu retourne toujours la même Il serait intéressant de virer le die et de traiter correctement l'erreur plutôt que d'afficher le message brutale.
Utiliser des fonctions pour tout c'est bien aussi pour peux que ton code au final soit structurer et qu'une fonction ne fait qu'une chose et qu'elle le dit (par sont nom, par exemple echo n'envois pas de sms
pour les requêtes préparée il y a un exemple il y a peu de chance que tu ai un problème en insertion ou sur un prédicat.
mais il est préférable (pour moi d'utiliser les bind (bind_by_name etc).
Pour la dernière chose, en clair ton code est pas mal et un code est toujours améliorable le code parfait c'est une utopie
Je t'assure que certain 'pro' ne font pas du code comme toi (malheureusement).
@+