Connexion avec deux types d'utilisateur

omlaly - 19 févr. 2013 à 17:21
 omlaly - 22 févr. 2013 à 15:57
Bonjour

J'essaye de faire ma page de connexion PHP avec deux requêtes SQL pour gérer deux droits :
-administrateur (moi)
-membres

Je vous mets mon code où il y a deux variables (une pour l'administrateur et une pour les membres), le voici :
$query_connexion=mysql_query("SELECT user_pseudo FROM  user WHERE user_pseudo = '$identifiant_connexion' AND user_mdp = '$password_connexion_sha1'") or die('Erreur lors de la connexion des membres'.mysql_error()); // Envoie une requête à un serveur MySQL
$query_connexion_administrateur=mysql_query("SELECT user_administrateur FROM administrateur WHERE user_administrateur	 = '$identifiant_connexion' AND user_administrateur = '$password_connexion_sha1'") or die('Erreur lors de la connexion de l\'administrateur du site'.mysql_error()); // Envoie une requête à un serveur MySQL

// Test si l'utilisateur est inscrit - réponse positive
if(mysql_num_rows($query_connexion) == 1) { // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL
echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes.</center>";
echo '<meta http-equiv="refresh" content="5;URL=adresse.php">'; // Pour effectuer la redirection après 5 secondes - marche avec Google Chrome et Opera pas avec Mozilla Firefox
$_SESSION['Statut'] == 2;
}


// Test suivant pour voir si c'est l'administrateur (moi) qui s'est connecté - 
if(mysql_num_rows($query_connexion_administrateur) == 1) { // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL
session_start();
$_SESSION['Statut'] == 1;
echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes.</center>";
echo '<meta http-equiv="refresh" content="5;URL=adresse.php">'; // Pour effectuer la redirection après 5 secondes - marche avec Google Chrome et Opera pas avec Mozilla Firefox
}


Quand je m'authentifie en tant que membres, ça marche même si ça m'affiche
Vous n'êtes pas inscrit. Merci de vous inscrire
tandis que quand j'essaye de me connecter en tant d'administrateur, ça passe directement :
Vous n'êtes pas inscrit. Merci de vous inscrire.


J'ai essayé de faire
if(mysql_num_rows($query_connexion)||mysql_num_rows($query_connexion_administrateur)
mais il me met une erreur. En fait, je veux que c'est soit la requête SQL des membres soit la requête SQL de l'administrateur qu'il faut exécuter mais il ne veut pas.

A noter que j'utilise les variables de sessions. Pour les récupérer, j'ai mis le code suivant :
if ((isset($_SESSION['identifiant_connexion'])) && (!empty($_SESSION['identifiant_connexion'])))
{   echo "administrateur";
}
        else
             echo "membre";
?>


A noter que j'ai fait une table pour l'administrateur et une pour les membres.

Qu'est-ce que vous en pensez ?

J'ai cherché mais comme je suis bloqué, je poste ce message...

En attendant vos réponses, je continue mes recherches...
Cordialement

48 réponses

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
19 févr. 2013 à 22:37
Le plus simple était de mettre un champ booléen qui dit si l'utilisateur est admin ou pas.
Sinon tu auras des problèmes quand tu voudras rattacher des trucs (topics, articles) à un utilisateur,
suivant qu'il est admin ou pas, tu ne pourras pas faire la liaison sur la même table alors que
les données stockées à leur propos sont strictement les mêmes. Avec cette structure, tu avais un query
et il te suffisait d'affecter directement la variable de session selon la valeur du champ.

On dirait qu'il manque un session_start() dans le premier if.

Dans le if que t'as essayé de faire, il manque une parenthèse fermante...

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Bonjour,

J'espère que tu as passé une bonne nuit ghuysmans99 !

Donc, toi tu me dis qu'il faut faire qu'une seule requête SQL qui permet de connecter l'utilisateur et qu'il faut mettre un champ booléen pour savoir si c'est un administrateur ou un utilisateur lambda ok.
Mais pour détecter si c'est un utilisateur ou un administrateur qui se connecte... Ou alors, il faut que je supprime la table administrateur et que je rajoute un champs user_acces dans la table des utilisateurs. Par défault, je le met à 2 (pour les membres) et dans la requête SQL des administrateurs, je spécifie qu'il faut mettre 1 dans le champs user_acces.

Mais, il faudra faire deux
mysql_num_rows
implémentés pour savoir si user_acces est égal à 1 ou à 2, non ?

Je reviens vers toi avec le code...

En attendant vos réponses, je continue mes recherches...
Cordialement
0
Me revoilà avec le code :
// On ouvre la session
session_start(); // Démarre une nouvelle session ou reprend une session existante

   // Sélectionnement de l'utilisateur désiré dans la base de données

$query_connexion_generale=mysql_query("SELECT user_pseudo FROM  user WHERE user_pseudo = '$identifiant_connexion' AND user_mdp = '$password_connexion_sha1'") or die('Erreur lors de la connexion générale'.mysql_error()); // Envoie une requête à un serveur MySQL

// Test si l'utilisateur est inscrit - réponse positive
if(mysql_num_rows($query_connexion_generale) == 1) { // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL
echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes.</center>";
echo '<meta http-equiv="refresh" content="5;URL=/adresse.php">'; // Pour effectuer la redirection après 5 secondes - marche avec Google Chrome et Opera pas avec Mozilla Firefox
setcookie("tentative_connexion_acces4roues", "", time() - 3600, '/'); // Pour réinitialiser le cookie

$query_connexion_administrateur=mysql_query("SELECT `user_pseudo` FROM user WHERE user_pseudo = \'$identifiant_connexion\' AND user_mdp = \'$password_connexion_sha1\' AND `user_acces` = "1"") or die('Erreur lors de la connexion de l\'administrateur'.mysql_error()); // Envoie une requête à un serveur MySQL
if(mysql_num_rows($query_connexion_administrateur) == 1) { // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL

$_SESSION['Statut'] == 1;

session_start();
$_SESSION['Statut'] == 1;
echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes.</center>";
echo '<meta http-equiv="refresh" content="5;URL=adresse.php">'; // Pour effectuer la redirection après 5 secondes - marche avec Google Chrome et Opera pas avec Mozilla Firefox
}
}


Quand je teste, voici ce que ça donne :
-en me connectant via un compte "administrateur" :
Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes.
Erreur lors de la connexion de l'administrateurYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'Testadmin\' AND user_mdp = \'247d4d811e7f104ea7c128cd2f1be63d97ac88d5\'' at line 1


-en me connectant via un compte "membres" :
Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes.
Erreur lors de la connexion de l'administrateurYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'Testmembre\' AND user_mdp = \'b746c6c3053268eefdaaa1a30dc3cbae67e9099c\' AND `' at line 1


Voici le CREATE TABLE de la table "user" :
CREATE TABLE IF NOT EXISTS `user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_comptesactives` decimal(10,0) NOT NULL,
  `user_pseudo` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_mdp` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_inscription` datetime NOT NULL,
  `user_naissance` date NOT NULL,
  `user_email` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_localisation` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_profession` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_avatars` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_derniere_visite` datetime NOT NULL,
  `user_bannis` int(11) NOT NULL,
  `user_acces` int(1) unsigned NOT NULL DEFAULT '2',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_pseudo` (`user_pseudo`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=88 ;


Je continue mes recherches, je vous informerai en cas d'avancement...

Si vous voyez des trucs qui ne vont pas, ce serait sympa de m'en informer...

En attendant vos réponses, je continue mes recherches...
Cordialement
0
Je reviens vers toi car j'ai plus d'erreur. Mais maintenant, quand je me connecte avec un compte administrateur ou un compte membre, il me met toujours :
Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes cher membre.


Voici le code PHP :
   // Sélectionnement de l'utilisateur désiré dans la base de données

$query_connexion_generale=mysql_query("SELECT user_pseudo FROM user WHERE user_pseudo = '$identifiant_connexion' AND user_mdp = '$password_connexion_sha1'") or die('Erreur lors de la connexion générale'.mysql_error()); // Envoie une requête à un serveur MySQL
$query_connexion_administrateur=mysql_query("SELECT user_pseudo FROM user WHERE user_pseudo = '$identifiant_connexion' AND user_mdp = '$password_connexion_sha1' AND `user_acces` = '1'") or die('Erreur lors de la connexion de l\'administrateur'.mysql_error()); // Envoie une requête à un serveur MySQL

// Test si l'utilisateur est inscrit - réponse positive
if(mysql_num_rows($query_connexion_generale) == 1) { // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL

if(mysql_num_rows($query_connexion_administrateur) == 1) { // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL

$_SESSION['statut_connexion'] == Administrateurs;
echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes cher admin.</center>";
echo '<meta http-equiv="refresh" content="5;URL=adresse.php">'; // Pour effectuer la redirection après 5 secondes - marche avec Google Chrome et Opera pas avec Mozilla Firefox
}
else
echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes cher membre.</center>";
echo '<meta http-equiv="refresh" content="5;URL=/adresse.php">'; // Pour effectuer la redirection après 5 secondes - marche avec Google Chrome et Opera pas avec Mozilla Firefox

$_SESSION['statut_connexion'] == Membres;
}


J'explique mon raisonnement : je commence dans le cas général (
$query_connexion_generale
) pour savoir si le pseudo de l'utilisateur est dans la base de données. Après, j'essaie de lui dire (c'est là que je n'arrive pas) : si le pseudo saisi est égal au pseudo de l'administrateur dans la base de données (
$query_connexion_administrateur
alors tu rentres dans le if qui est imbriqué (
if(mysql_num_rows($query_connexion_administrateur) == 1)
) sinon tu ne fais pas le if imbriqué. Par contre si le pseudo saisi ne rentre pas dans les deux tests if alors ça veux dire qu'il n'est pas dans la base de données et donc pas inscrit, tu ne fait pas les deux tests et tu passes directement dans
else
   echo "<center>Vous n'êtes pas inscrit. Merci de vous inscrire.</center>";}

. Ce test est tout en bas.

Est-ce que mon raisonnement est logique ? Sinon, qu'est-ce qu'il ne va pas ?


En attendant vos réponses, je continue mes recherches...
Cordialement
0

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

Posez votre question
Pour information, j'ai rajouté une condition (AND `user_acces` = '2') dans la requête SQL générale mais rien n'a changé, la voici :
$query_connexion_generale=mysql_query("SELECT user_pseudo FROM user WHERE user_pseudo = '$identifiant_connexion' AND user_mdp = '$password_connexion_sha1' AND `user_acces` = '2'") or die('Erreur lors de la connexion générale'.mysql_error()); // Envoie une requête à un serveur MySQL

Cordialement
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
20 févr. 2013 à 19:37
Oui, pour information, ou pour être sympa, tu pourrais terminer tes conversations prétendantes avant de générer une suivante. Mais bon, pour moi, tan-pi pour toi.

- http://www.phpcs.com/forum/sujet-LISTE-DEROULANTE_1625770.aspx
- http://www.phpcs.com/forum/sujet-SECURITE_1625873.aspx

Je vois que tu sais créer une session, je me demande, comment ta su ?

stéph
0
Bonjour Steph,

Pour les deux liens, j'ai trouvé les solutions, je viens de le dire.

Et si tu te demandes comment j'ai su créer une session, beh tout simplement j'ai cherché sur le net et j'ai trouvé.

Maintenant, je suis bloqué sur cette histoire de connexion avec deux sortes d'utilisateurs (administrateur et membres), si tu as une idée n'hésites pas !

Cordialement
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
20 févr. 2013 à 20:30
Je me demande rien, c'était de l'ironie.
C'est moi qui te l'ai expliqué.

De plus, la speudo solution que tu utilises pour te connecter en administrateur, et que je t'ai donnée en te disant

Salut, dommage, tu as opté pour la solution la plus simple et pas utilisable pour un Back-office.
Mais l'important c'est d'avancer vers l'avant chacun à son rythme.


Et là tu me proposes quoi exactement ?

Tu feras moins le malin que sur ton dernier poste.

Bien à toi,

stéph
0
Pour ton information, je ne fais pas le malin, j'essaie juste de développer mon site internet et dès que je suis bloqué, je poste en espérant qu'il y ait des personnes qui m'aident, tout simplement.

Je te souhaite une bonne réception.

Cordialement
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
20 févr. 2013 à 20:40
Et un grand merci de par également non ?

stéph
0
Un grand merci mon stéph !

Maintenant, peux-tu regarder mon code que j'ai posté et voir ce qui ne va pas STP ?

Cordialement
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
20 févr. 2013 à 23:34
C'est bien un champ que tu dois ajouter, et la table admins que tu dois supprimer.
Dans ta requête, lis ce champ supplémentaire, tu n'auras ainsi plus qu'une requête à effectuer.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Bonjour ghuysmans99,

J'espère que tu as passé une bonne nuit.

Le champs SQL je l'ai, c'est "user_acces". Si c'est un administrateur, il contient 1 alors que si c'est un membre, il contient 2.
La table "administrateur", je l'ai supprimé.

Mais, comment faire une seule requête SQL sachant qu'il y a trois cas à gérer :
- si c'est l'administrateur (moi) qui se connecte
- si ce sont les membres qui se connectent
- si le nom d'utilisateur n'est pas dans la base de données et donc il n'est pas inscrit
?

Je reviendrai vers toi dès que j'avancerai.

En attendant vos réponses, je continue mes recherches...
Cordialement
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
21 févr. 2013 à 08:55
Salut, tu as la solution car tu as écrit la méthode en langage humain.

- si c'est l'administrateur (moi) qui se connecte
- si ce sont les membres qui se connectent
- si le nom d'utilisateur n'est pas dans la base de données et donc il n'est pas inscrit ?


<?php
if ($user_acces === 1) {
    *...
} elseif ($user_acces === 2) {
    *...
} else {
    *...
}


stéph
0
Je reviens avec mon code mais toujours pareil (que je me connecte en tant qu'administrateur ou en tant que membre ça affiche
Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes cher membre.
, je n'arrive pas à lui faire passer si c'est le cas où c'est un administrateur. Pour l'instant, je me ne suis pas occupé du cryptage du mot de passe dans la base de données en SHA1.

Voici le code PHP :
$query_connexion=mysql_query("SELECT user_pseudo FROM user WHERE user_pseudo = '$identifiant_connexion' AND user_mdp = '$password_connexion' AND user_acces = '1'") or die('Erreur lors de la connexion générale'.mysql_error()); // Envoie une requête à un serveur MySQL

// Test si l'utilisateur est inscrit - réponse positive
if(mysql_num_rows($query_connexion) == 1) { // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL

echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes cher admin.</center>";
echo '<meta http-equiv="refresh" content="5;URL=/adresse.php">'; // Pour effectuer la redirection après 5 secondes - marche avec Google Chrome et Opera pas avec Mozilla Firefox
$_SESSION['statut_connexion'] == Administrateurs;
}
else
{
echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes cher membre.</center>";
setcookie("nom_cookie", "", time() - 3600, '/'); // Pour réinitialiser le cookie
$_SESSION['statut_connexion'] == Membres;
}
}


Par contre, si je mets
if(mysql_num_rows($query_connexion) == 0)
:
Si je me connecte en tant d'administrateur ou en tant que membre, ça met toujours le message suivant
Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes cher admin.


Pour information, je vous mets le CREATE TABLE de la table user :
CREATE TABLE IF NOT EXISTS `user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_comptesactives` decimal(10,0) NOT NULL,
  `user_pseudo` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_mdp` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_inscription` datetime NOT NULL,
  `user_naissance` date NOT NULL,
  `user_email` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_localisation` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_profession` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_avatars` varchar(255) CHARACTER SET utf8 NOT NULL,
  `user_derniere_visite` datetime NOT NULL,
  `user_bannis` int(11) NOT NULL,
  `user_acces` int(1) unsigned NOT NULL DEFAULT '2',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_pseudo` (`user_pseudo`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=93 ;


Si quelqu'un voit pourquoi il ne traite pas les deux cas, qu'il le dise...

A noter que comme je l'ai dit précedemment, j'ai supprimé la table "administrateur" et que j'essaie de le faire avec le champs "user_acces" (1 pour l'administrateur et 2 pour les membres).

En attendant vos réponses, je continue mes recherches...
Cordialement
0
Salut stay

Oui, j'ai la solution mais je n'arrive pas à le traduire en PHP et que ça fonctionne sachant qu'il faut utiliser la base de donnée MySQL.

Cordialement
0
Re stay

Je suis d'accord avec ton code mais je n'arrive pas à trouver où le mettre dans mon code sachant que "user_acces" est un champs d'une table MySQL.

Tu es d'accord qu'il faut faire un code où il y a un test IF avec
mysql_num_rows
, non ?

En attendant vos réponses, je continue mes recherches...
Cordialement
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
21 févr. 2013 à 09:54
Mais oui, tu te compliques la vie.
Dans la requête SQL, tu ajoutes le champ user_acces.
<?php
$query_connexion=mysql_query("SELECT user_pseudo,user_acces FROM *...


Tu vires ceci
<?php
// Test si l'utilisateur est inscrit - réponse positive
if(mysql_num_rows($query_connexion) == 1) { // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL


Et tu fais ceci
<?php
$row = mysql_fetch_row($query_connexion, MYSQL_ASSOC);
if ($row['user_acces'] === 1) {
    *...
} elseif ($row['user_acces'] === 2) {
    *...
} else {
    *...
}


stéph
0
Salut stay,

Maintenant que je me connecte comme administrateur ou comme membre, le message suivant apparait :
Vous n'êtes pas inscrit. Merci de vous inscrire.


Voici le code PHP :
$query_connexion=mysql_query("SELECT user_pseudo,user_acces FROM user WHERE user_pseudo = '$identifiant_connexion' AND user_mdp = '$password_connexion'") or die('Erreur lors de la connexion générale'.mysql_error()); // Envoie une requête à un serveur MySQL

$row = mysql_fetch_row($query_connexion, MYSQL_ASSOC);
if ($row['user_acces'] === 1) {
echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes cher admin.</center>";
//echo '<meta http-equiv="refresh" content="5;URL=/adresse.php">'; // Pour effectuer la redirection après 5 secondes - marche avec Google Chrome et Opera pas avec Mozilla Firefox
$_SESSION['statut_connexion'] == Administrateurs;

}
elseif ($row['user_acces'] === 2) {
echo "<center>Vous êtes authentifié. Merci, vous allez être redirigé dans 5 secondes cher membre.</center>";
setcookie("nom_cookie", "", time() - 3600, '/'); // Pour réinitialiser le cookie
$_SESSION['statut_connexion'] == Membres;
}


Voici la partie (qui est en bas) du code PHP qui gère si l'utilisateur n'est pas inscrit :
else 
{
   echo "<center>Vous n'êtes pas inscrit. Merci de vous inscrire.</center>";
}
}


En attendant vos réponses, je continue mes recherches...
Cordialement
0
cs_stay Messages postés 493 Date d'inscription jeudi 7 juillet 2005 Statut Membre Dernière intervention 24 mai 2017 4
21 févr. 2013 à 10:23
Oui, donc tu reconnais les membres connectés et les personnes qui ne sont pas inscrits.
Et là tu recherches quoi ?

stéph
0
Rejoignez-nous