Php/Sql, connexion pour espace membre

Babriehead Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   -  
Babriehead Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'ai enfin réussi a inscrire des données entrée par l'U grace a un formulaire.

Sur une page de connexion, l'U entre son login et mot de passe, et la ça coince, je n'arrive pas a comparer les donnée entre-elle.

Je suis débutant en Php, voici le code :
<?php
        try
        {
            $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
            $bdd = new PDO('mysql:host=localhost;dbname=ae', 'root', '',   $pdo_options);
    
            $req = $bdd->prepare('SELECT * FROM membre WHERE login = :login AND pass = :pass');
            $req->execute(array(
            'login' => $_POST['login'],
            'password' => $_POST['password'],
            ));
      
            header('Location: inscription.php');
        }
        catch(Exception $e)
        {
            die('Erreur : '.$e->getMessage());
        }
?>

A voir également:

3 réponses

Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
Salut,

Un jeton dans la requête préparée n'est lié à aucune données :
- jeton "pass" dans la requête
- clé "password" dans la méthode execute

Il faut simplement utiliser le même identifiant pour ton jeton dans la méthode execute.

Bonne journée,
0
Babriehead Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   4
 
Bonjour,

Oui en effet, ceci est une erreur vraiment bête !

Merci !
0
gardiendelanuit Messages postés 1770 Date d'inscription   Statut Membre Dernière intervention   264
 
Bonjour,

Il y a deux choses dans ton code:

Comme le fait remarquer Pitet, le jeton pass ne correspond pas à celui déclaré dans execute.

De plus, tes jetons doivent être déclarés avec les ':' tout comme dans la requête.

Ainsi on a:

$req->execute(array(
            ':login' => $_POST['login'],
            ':pass' => $_POST['password']
));


Merci de mettre "Résolu" quand le problème est réglé!
La connaissance c'est comme la confiture: moins on en a et plus on l'étale.
0
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
Non plus, les ':' sont optionnels dans le tableau passé à la méthode execute :
https://www.php.net/manual/fr/pdostatement.execute.php#Hcom71929
0
gardiendelanuit Messages postés 1770 Date d'inscription   Statut Membre Dernière intervention   264
 
En effet! Autant pour moi.
La seule différence sera alors une exécution très légèrement plus rapide :D

Selon le code source de PDO:
if (param->name) {
  if (is_param && ZSTR_VAL(param->name)[0] != ':') {
   zend_string *temp = zend_string_alloc(ZSTR_LEN(param->name) + 1, 0);
   ZSTR_VAL(temp)[0] = ':';
   memmove(ZSTR_VAL(temp) + 1, ZSTR_VAL(param->name), ZSTR_LEN(param->name) + 1);
   param->name = temp;
  } else {
   param->name = zend_string_init(ZSTR_VAL(param->name), ZSTR_LEN(param->name), 0);
  }
 }


Source: https://github.com/php/php-src/blob/master/ext/pdo/pdo_stmt.c#L363</i>
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

En complément de la solution donnée plus haut ...

1 - Prend l'habitude de placer le code de connexion à ta BDD dans un fichier à part que tu n'auras plus qu'à inclure dans tes pages. (au lieu de copier/coller ce bout de code à chaque fois que tu as besoin de faire une requête dans ta bdd...)

Pour la connexion... je te propose de l'écrire comme ceci :
 <?php
 // Fichier de connexion à la bdd : cnxBdd.php
try{
  $bdd =new PDO('mysql:host=localhost; 
 dbname=mabdd; charset=utf8', 'root', '');
  $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
} catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
}


nb: tu noteras la présence du charset utf8 ... pour la prise en charge correcte des caractères accentués. (pour tout mettre au carré.. il faut aussi définir l'utf8 dans le header de tes pages html et dans tes fichiers php. Pour cela, je t'invite à lire ceci : https://j-willette.developpez.com/tutoriels/web/encoder-son-site-en-utf8/

2 - Prend l'habitude de récupérer PROPREMENT tes variables AVANT de les utiliser.
Pour cela.. on utilise l'écriture TERNAIRE (voir ici les explications : https://forums.commentcamarche.net/forum/affich-37636387-php-notice-undefined-index )

3 - Pour finir.. prend l'habitude de séparer, des instructions pdo prepare et execute, les variables.



Avec tout ça ton code devient :
<?php
//affichage des erreurs php
error_reporting(E_ALL);

//connexion à la Bdd
require_once "cnxBdd.php";

//récupération PROPRE des variables :
$login = !empty($_POST['login']) ? $_POST['login'] : NULL;
$password= !empty($_POST['password']) ? $_POST['password'] : NULL;

if($login && $password ){
  //préparation de la requête et des variables
  $sql = "SELECT * 
              FROM membre
              WHERE login = :login 
              AND pass = :pass";

  $datas = array(':login'=>$login, ':pass'=>$password);

 //Execution de la requete
 try{
   $requete = $bdd->prepare($sql) ;
   $requete->execute($datas) ;
 }catch(Exception $e){
   // en cas d'erreur :
    echo " Erreur ! ".$e->getMessage();
    echo " Les datas : " ;
   print_r($datas);
 }
}



Cordialement, 
Jordane                                                                 
0
Babriehead Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   4
 
Bonjour, désolé pour le rétard !

Merci pour votre réponse, je vais étudier tout ça dans l'aprés-midi, j'éspére mieux comprendre grace a vous tous !
0
Babriehead Messages postés 63 Date d'inscription   Statut Membre Dernière intervention   4
 
Ok merci, j'avoue que mon code est vraiment sale, des bouts récupéré, assemblé !

Merci pour la correction, je vais pouvoir m'en servir comme modéle de base !
0