Espace de connexion pour utilisateurs

Résolu/Fermé
MrHip7 Messages postés 31 Date d'inscription jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015 - 23 avril 2015 à 14:09
 Utilisateur anonyme - 24 avril 2015 à 13:13
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

$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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
24 avril 2015 à 11:42
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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
24 avril 2015 à 13:13
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
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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
Modifié par MrHip7 le 23/04/2015 à 14:36
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
Vois mon autre remarque que j'ai ajoutée au premier message, ne pensant pas que tu réagirais si vite.
0
Utilisateur anonyme
23 avril 2015 à 14:37
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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
23 avril 2015 à 15:00
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 jeudi 20 juin 2013 Statut Membre Dernière intervention 22 décembre 2017 156
23 avril 2015 à 14:35
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
23 avril 2015 à 14:41
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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
23 avril 2015 à 15:00
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 jeudi 20 juin 2013 Statut Membre Dernière intervention 22 décembre 2017 156 > MrHip7 Messages postés 31 Date d'inscription jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
23 avril 2015 à 15:10
je confirme, faire:
function connect($pseudo, $mdp)
{
  Global $base;
  ...
}
0
MrHip7 Messages postés 31 Date d'inscription jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015 > Thorak83 Messages postés 1051 Date d'inscription jeudi 20 juin 2013 Statut Membre Dernière intervention 22 décembre 2017
Modifié par MrHip7 le 23/04/2015 à 15:16
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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
23 avril 2015 à 15:34
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
23 avril 2015 à 15:17
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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
Modifié par MrHip7 le 23/04/2015 à 15:29
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 jeudi 20 juin 2013 Statut Membre Dernière intervention 22 décembre 2017 156
23 avril 2015 à 15:31
c'est ce qui ma trompé
0
Utilisateur anonyme > Thorak83 Messages postés 1051 Date d'inscription jeudi 20 juin 2013 Statut Membre Dernière intervention 22 décembre 2017
23 avril 2015 à 15:41
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
23 avril 2015 à 15:40
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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
23 avril 2015 à 15:44
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
23 avril 2015 à 15:45
De plus...
$_SESSION['membre_id'] = $res['membre_id'];
non, ce serait plutôt
$_SESSION['membre_id'] = $id;
0
Utilisateur anonyme
23 avril 2015 à 15:48
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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
Modifié par MrHip7 le 23/04/2015 à 16:00
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
23 avril 2015 à 16:11
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 jeudi 9 janvier 2014 Statut Membre Dernière intervention 6 mai 2015
23 avril 2015 à 16:16
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