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

A voir également:

6 réponses

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
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
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
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
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
Utilisateur anonyme
 
Vois mon autre remarque que j'ai ajoutée au premier message, ne pensant pas que tu réagirais si vite.
0
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
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
Thorak83 Messages postés 1051 Date d'inscription   Statut Membre Dernière intervention   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
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
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
Thorak83 Messages postés 1051 Date d'inscription   Statut Membre Dernière intervention   156 > MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
je confirme, faire:
function connect($pseudo, $mdp)
{
  Global $base;
  ...
}
0
MrHip7 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   > Thorak83 Messages postés 1051 Date d'inscription   Statut Membre Dernière intervention  
 
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
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
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
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
Thorak83 Messages postés 1051 Date d'inscription   Statut Membre Dernière intervention   156
 
c'est ce qui ma trompé
0
Utilisateur anonyme > Thorak83 Messages postés 1051 Date d'inscription   Statut Membre Dernière intervention  
 
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

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

Posez votre question
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
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
Utilisateur anonyme
 
De plus...
$_SESSION['membre_id'] = $res['membre_id'];
non, ce serait plutôt
$_SESSION['membre_id'] = $id;
0
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
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
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
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