Espace de connexion pour utilisateurs

Résolu
MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   -  
 Utilisateur anonyme -
Bonjour,

Alors voila, je vous pose mon problème:
Je réalise un site qui contient un espace membre. Les utilisateurs peuvent s'inscrire (ajout dans la BD, pas de soucis). MAINTENANT Il faut qu'ils puissent s'y connecter! Et c'est là que ça coince, je n'arrive pas à faire marcher ma fonction connect($pseudo, $mdp).

Je vous montre ça de suite, je précise que 'corbac' est le nom de mon bouton pour valider la demande de connexion:

			<?php

if (isset($_POST['pseudo']) && isset($_POST['mdp'])) {
$pseudo=$_POST['pseudo'];
$mdp=md5($_POST['mdp']);

}

if(isset($_POST['corbac'])){
connect($pseudo,$mdp, $base);
if(isset($_SESSION['id'])) echo $_SESSION['id'];
else echo "NOTHING";

}
function connect($pseudo, $mdp, $base){

if(!empty($pseudo)&& !empty($password))
{
$req = $base->prepare('SELECT membre_id FROM membres WHERE membre_pseudo = :pseudo AND membre_mdp = :password');
$req->execute(array(
'pseudo' => $pseudo,
'password' => $password));
$res = $req->fetch();// on parcourt la base de données
if (!$res)// si $res ne se trouve pas dans la base de données
{
echo 'Mauvais identifiant ou mot de passe !';
}
else // sinon on demare la session et on définie les variables de session
{
session_start();
$_SESSION['id'] = $resultat['id'];
$_SESSION['pseudo'] = $pseudo;
header('Location:index.php'); // on redirige l'utilisateur vers l'espace reservé
}
}
}
?>


Actuellement, ce code me renvoie "NOTHING" à l'appuie sur le bouton, et j'aimerais plutot qu'il me connexte, donc qu'il envoie l'id du membre qui se connecte, voila! =)
merci d'avance

greg

6 réponses

  1. Utilisateur anonyme
     
    $base = mysqli_connect ('localhost', 'root', '');
    Cette ligne te connecte à un serveur, pas à une base.
    Où apparaît le nom de ta base de données ?
    1
    1. MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      Il manquait cette connexion à la base.
      Je vais me pendre et je reviens vers vous si j'ai un soucis (oubli de tabouret ou de corde).

      Merci beaucoup le père pour ton aide précieuse!
      0
      1. Utilisateur anonyme > MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
         
        De rien

        N'oublie pas de vérifier le point de fixation de la corde, ce serait bête de te faire une entorse en te décrochant ^^
        0
  2. Utilisateur anonyme
     
    Bonjour
     $req = $base->prepare('SELECT membre_id FROM..."
    ...
                    $res = $req->fetch();// on parcourt la base de données
    ...
     $_SESSION['id'] = $resultat['id'];


    Compte-tenu des deux lignes précédentes, la troisième ligne ne devrait-elle pas plutôt être
    $_SESSION['id'] = $res['membre_id']; ?

    D'autre part
    function connect($pseudo, $mdp, $base){
      if(!empty($pseudo)&& !empty($password))

    À mon avis, $password est toujours "empty" puisque la variable que tu passes, c'est $mdp.
    0
    1. MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      Je me suis dis, bon sang, si c'est ça, je mange mon chapeau.

      Cela me renvoie toujours mon "NOTHING", malgrès le fait que j'ai remplacé les 'id' par 'membre_id', et le 'resultat' par 'res'... Déjà une erreur d'étourderie de régler..
      Cependant, je ne vois pas ce qui cloche...
      0
    2. Utilisateur anonyme
       
      Vois mon autre remarque que j'ai ajoutée au premier message, ne pensant pas que tu réagirais si vite.
      0
    3. Utilisateur anonyme
       
      j'ai remplacé les 'id' par 'membre_id',
      mais ce n'était pas tout ! Dans ma réponse initiale, il y avait aussi $resultat à remplacer par $res dont tu ne parles pas.
      résumé :
      id -> membre_id
      $resultat -> $res
      password -> $mdp
      0
    4. MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      Je réagis plutot rapidement, car ce soucis me cours sur le haricot etant donné que j'y suis depuis hier soir :(
      0
  3. Thorak83 Messages postés 1140 Statut Membre 156
     
    Bonjour,

    on peut pas transmettre une variable PDO ($base) dans une fonction.
    faire plutôt :
    function connect($pseudo, $mdp)
    {
    	Global $base;
    	...
    }


    retirez également le header(...) à la fin de la fonction sinon il n'affichera jamais le $_SESSION['id']

    Cordialement
    0
    1. Utilisateur anonyme
       
      on peut pas transmettre une variable PDO ($base) dans une fonction.
      Ah bon ? Pourquoi ?

      Par contre, la remarque sur le header est bonne. Elle montre d'ailleurs qu'il n'y passe actuellement pas.
      0
    2. MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      Je reviens vers vous, j'ai du neuf!
      Primo, je suis une buse: 1 étourderie, ça passe, 2, ça passe, mais 3 du même genre, je paye mon coup ce soir!
      Secundo, j'ai une nouvelle erreur (que j'ai déjà vu, mais qui avait disparu quand j'avais refais mon code sous forme de fonction...

      Fatal error: in.. ligne 80

      mysqli_sql_exception sur la ligne 80:

      la ligne 80:
                      $req = $base->prepare('SELECT membre_id FROM membres WHERE membre_pseudo = :pseudo AND membre_mdp = :password');
      0
    3. Thorak83 Messages postés 1140 Statut Membre 156 > MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      je confirme, faire:
      function connect($pseudo, $mdp)
      {
        Global $base;
        ...
      }
      0
    4. MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   > Thorak83 Messages postés 1140 Statut Membre
       
      C'est chose faites:

      <?php
      
      if (isset($_POST['pseudo']) && isset($_POST['mdp'])) {
      	$pseudo=$_POST['pseudo'];
      	$mdp=md5($_POST['mdp']);
      
      }
      
      if(isset($_POST['corbac'])){
      	connect($pseudo,$mdp);
      	if(isset($_SESSION['membre_id'])) echo $_SESSION['membre_id'];
      	else echo "NOTHING";
      	
      }
      function connect($pseudo, $mdp){
      
      	if(!empty($pseudo)&& !empty($mdp))
      	{
      		Global $base;
      		$req = $base->prepare('SELECT membre_id FROM membres WHERE membre_pseudo = :pseudo AND membre_mdp = :password');
      		$req->execute(array(
      			'pseudo' => $pseudo,
      			'password' => $password));
      		$res = $req->fetch();// on parcourt la base de données
      		if (!$res)// si $res ne se trouve pas dans la base de données
      		{
      			echo 'Mauvais identifiant ou mot de passe !';
      		}
      		else // sinon on demare la session et on définie les variables de session
      		{
      			session_start();
      			$_SESSION['membre_id'] = $res['membre_id'];
      			$_SESSION['pseudo'] = $pseudo;
      		}
      	}
      }
      ?>
      0
    5. Utilisateur anonyme > MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      Non, c'était inutile de mettre $base en global. Ça ne marchera ni mieux ni plus mal comme ça.
      Thorak83 affirme, mais il ne donne aucune explication. Et il ne risque pas d'en donner, car c'est faux.
      Où y a-t-il une restriction de ce type dans le passage de paramètres à une fonction en PHP ?
      Je viens d'ailleurs de faire l'essai.
      0
  4. Utilisateur anonyme
     
    Tu utilises mysqli, mais tu fais comme si tu utilisais PDO.
    D'après ce que je lis dans la doc, mysqli ne supporte pas les marqueurs nommés dans les requêtes préparées, tu devrais avoir des ? au lieu de :pseudo et :password. Ensuite, tu devrais utiliser bind_param, et enfin la méthode execute de mysqli n'attend pas d'array comme paramètre
    0
    1. MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      Hum je vois..

      Du coup je me suis refait la fonction connect comme suis:

      function connect($pseudo, $mdp) {
          Global $base;
          $stmt = mysqli_prepare($base, 'SELECT membre_id FROM membres WHERE membre_pseudo = ? AND membre_mdp = ?');
          mysqli_stmt_bind_param($stmt, 's', $pseudo, $mdp);
          mysqli_stmt_execute($stmt);
          mysqli_stmt_bind_result($stmt, $id);
          $res=mysqli_stmt_fetch($stmt);
       if (!$res)// si $res ne se trouve pas dans la base de données
       {
        echo 'Mauvais identifiant ou mot de passe !';
       }
       else // sinon on demare la session et on définie les variables de session
       {
        session_start();
        $_SESSION['membre_id'] = $res['membre_id'];
        $_SESSION['pseudo'] = $pseudo;
       }
      }


      Qu'en pensez-vous?
      0
    2. Thorak83 Messages postés 1140 Statut Membre 156
       
      c'est ce qui ma trompé
      0
      1. Utilisateur anonyme > Thorak83 Messages postés 1140 Statut Membre
         
        Moi aussi je croyais qu'il s'agissait de PDO au départ. Mais ça ne change rien au fait qu'on peut passer une ressource PDO ou mysqli en paramètre à une fonction.
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    mysqli_stmt_bind_param($stmt, 's', $pseudo, $mdp);
    D'après la doc, ce serait plutôt 'ss' car il y a deux paramètres
    0
    1. MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      Comme c'est deux String, deux s? j'ai essayé, j'ai toujours cette errreur:

      mysqli_sql_exception: a propos de mysqli_prepare()

      Lorsque je clique sur le lien vers la doc proposé.. il me dis que mysqli_prepare n'existe pas.. alors que je l'utilise dans mes fonctions de validation de formulaire!!! :(
      0
    2. Utilisateur anonyme
       
      De plus...
      $_SESSION['membre_id'] = $res['membre_id'];
      non, ce serait plutôt
      $_SESSION['membre_id'] = $id;
      0
    3. Utilisateur anonyme
       
      Re- de plus...
      Et pourquoi es-tu passé du style objet au style procédural ? Histoire de mélanger encore un peu plus les choses ?
      0
    4. MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      J'ai finalement trouvé la docs sur mysqli_prepare (je ne sais pas pourquoi php ne veux pas du mien...)
      j'ai remplacé par $id... -_-

      Je n'utilise pas le style objet, j'ai peur de ces ::

      EDIT

      Attendez voir! J'avais cette ligne là:
      mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
      en haut de mon fichier,
      lorsque je la passe en commentaire, j'ai des erreurs plus précises!

      mysqli_stmt_bind_param() expects parameter 1 to be mysqli_stmt, boolean given

      mysqli_stmt_execute() expects parameter 1 to be mysqli_stmt, boolean given

      mysqli_stmt_bind_result() expects parameter 1 to be mysqli_stmt, boolean given

      mysqli_stmt_fetch() expects parameter 1 to be mysqli_stmt, boolean given
      0
  7. Utilisateur anonyme
     
    Ta première erreur montre que le "prepare" se passe mal. Le reste ne peut pas marcher.
    Si $base a été obtenu avec un new mysqli, c'est un objet et il ne peut pas te servir de ressource dans des fonctions du style procédural. Tu travailles en objet ou en procédural, mais pas les deux .
    0
    1. MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
       
      Voila a quoi correspond $base:
      $base = mysqli_connect ('localhost', 'root', '');

      <?php
      
      if (isset($_POST['pseudo']) && isset($_POST['mdp'])) {
      	$pseudo=$_POST['pseudo'];
      	$mdp=md5($_POST['mdp']);
      
      }
      
      if(isset($_POST['corbac'])){
      	connect($base,$pseudo,$mdp);
      	if(isset($_SESSION['membre_id'])) echo $_SESSION['membre_id'];
      	else echo "NOTHING";
      	
      }


      function connect($base, $pseudo, $mdp) {
          $stmt = mysqli_prepare($base, 'SELECT membre_id FROM membres WHERE membre_pseudo = ? AND membre_mdp = ?');
          mysqli_stmt_bind_param($stmt, 'ss', $pseudo, $mdp);
          mysqli_stmt_execute($stmt);
          mysqli_stmt_bind_result($stmt, $id);
          $res = mysqli_stmt_fetch($stmt);
      	if (!$res)// si $res ne se trouve pas dans la base de données
      	{
      		echo 'Mauvais identifiant ou mot de passe !';
      	}
      	else // sinon on demare la session et on définie les variables de session
      	{
      		session_start();
      		$_SESSION['membre_id'] = $id;
      		$_SESSION['pseudo'] = $pseudo;
      	}
      }


      Je comprends pas du tout pourquoi il ne veux pas du prepare, j'utilise le même dans ma validation :(
      0