Php/Sql, connexion pour espace membre

Fermé
Babriehead Messages postés 63 Date d'inscription mercredi 8 mai 2013 Statut Membre Dernière intervention 12 janvier 2017 - 29 sept. 2016 à 15:14
Babriehead Messages postés 63 Date d'inscription mercredi 8 mai 2013 Statut Membre Dernière intervention 12 janvier 2017 - 10 oct. 2016 à 15:30
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 lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
29 sept. 2016 à 16:16
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 mercredi 8 mai 2013 Statut Membre Dernière intervention 12 janvier 2017 4
10 oct. 2016 à 15:27
Bonjour,

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

Merci !
0
gardiendelanuit Messages postés 1770 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 19 novembre 2016 264
Modifié par gardiendelanuit le 29/09/2016 à 17:10
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 lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
29 sept. 2016 à 17:15
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 jeudi 20 décembre 2007 Statut Membre Dernière intervention 19 novembre 2016 264
Modifié par gardiendelanuit le 29/09/2016 à 17:55
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 38320 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 30 novembre 2024 4 707
Modifié par jordane45 le 29/09/2016 à 17:24
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 mercredi 8 mai 2013 Statut Membre Dernière intervention 12 janvier 2017 4
10 oct. 2016 à 15:26
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 mercredi 8 mai 2013 Statut Membre Dernière intervention 12 janvier 2017 4
10 oct. 2016 à 15:30
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