IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

if avec redirection par header


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de lesitadom39
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2015
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2015
    Messages : 112
    Points : 82
    Points
    82
    Par défaut if avec redirection par header
    Bonjour,
    À la connexion d'un utilisateur, je désire le réorienter vers une page diffèrente en fonction de son "type" (administrateur, utilisateur,etc..).
    Voilà ma page de connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    <?php
    session_start();
    include 'connecpdo.php'; 
    if(isset($_POST['formconnexion']))
    {
    	$mailconnect = htmlspecialchars($_POST['mailconnect']);
    	$mdpconnect = sha1($_POST['mdpconnect']);
    	if (!empty($mailconnect) AND !empty($mdpconnect))
    	{
    		$requser = $bdd->prepare("SELECT * FROM membres WHERE mail = ? AND motdepasse = ?");
    		$requser->execute(array($mailconnect,$mdpconnect ));
    		$userexist = $requser->rowCount();
    		if ($userexist == 1)
    		{
    			$userinfo = $requser->fetch();
    			$_SESSION['id']= $userinfo['id'];
    			$_SESSION['pseudo']= $userinfo['pseudo'];
    			$_SESSION['mail']= $userinfo['mail'];
    			$_SESSION['type']= $userinfo['type'];
    			if ($type = "utilisateur") 
    			{
    				header("Location: maintutil.php?id=".$_SESSION['id']);
    				exit();
    			}
    			if ($type = "administrateur") {
     
    				header("Location: maintadmin.php?id=".$_SESSION['id']);
    				exit();
    			}
     
    		}
    		else
    		{
    			$erreur ="Erreur dans l'indentifiant ou le mot de passe";
    		}
    	}
    	else
    	{
    		$erreur ="les deux champs doivent être remplis";
    	}
    }
    ?>
    <!doctype html>
    <html lang="fr">
    <head>
    	<meta charset="utf8">
    	<title>Sitayou2019</title>
    	<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    	<!--Customisation site css -->
    	<link rel="stylesheet" type="text/css" href="dist/css/style.min.css">
    </head>
    <body>
    	<?php include 'navbar.php'; ?>
    	<div class="text-center">
    		<h2 class="mb-3">Connexion</h2>
    		<form action="" method="POST">
    			<div class="form-group">
    				<input type="email" name="mailconnect" placeholder="Votre mail" >">
    			</div>
    			<div class="form-group">
    				<input type="password" name="mdpconnect"  placeholder="Votre Mot de passe">
    			</div>
    			<input type="submit" class="btn btn-success" name="formconnexion" value="je me connecte">
    		</form>
    		<?php 
    		if(isset($erreur))
    		{
    			echo $erreur;
    		}
    		?>
    	</div>
    	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
    	<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js" integrity="sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o" crossorigin="anonymous"></script>
    </body>
    </html>
    Mais quelque soit la valeur contenue dan la variable $type, ça renvoie au premier header.
    Qu'est ce qui cloche dans ma condition? J'ai essayé elseif mais ,même résultat, je coince !!!!!
    Merci d'avance
    Et puis autre chose, est ce que ce formulaire vous semble suffisament sécurisé?

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Bonjour,

    Normal, rowcount() ne fonctionne pas pour les requêtes SELECT.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		$requser = $bdd->prepare("SELECT id, pseudo, mail, type FROM membres WHERE mail = ? AND motdepasse = ?");
    		$requser->execute(array($mailconnect,$mdpconnect ));
    		$userexist = $requser->fetch(PDO::FETCH_ASSOC);
    		if (count($userexist )== 1)
    		{
     
    }
    else{
     
    }

    Par ailleurs, en matière de sécurité, il faut utiliser le couple de méthodes password_hash et password_verify

    https://www.php.net/manual/fr/functi...ord-verify.php

    et attention à ça :

    if ($type = "utilisateur") renvoie toujours vrai !!! Tu confonds affectation et comparaison (==)
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 405
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 405
    Points : 4 841
    Points
    4 841
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Normal, rowcount() ne fonctionne pas pour les requêtes SELECT.
    Je ne suis pas sûr car si on met fetchAll au lieu de fetch ça fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $userexist =$requser->fetchAll(PDO::FETCH_ASSOC);
    $nbr=$requser->rowCount();

  4. #4
    Membre régulier Avatar de lesitadom39
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2015
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2015
    Messages : 112
    Points : 82
    Points
    82
    Par défaut Undefined variable: type
    Bonjour,
    En attendant de sécuriser le mot des passe, j'ai appliqué les modifications proposées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    <?php
    session_start();
    include 'connecpdo.php'; 
    if(isset($_POST['formconnexion']))
    {
    	$mailconnect = htmlspecialchars($_POST['mailconnect']);
    	$mdpconnect = sha1($_POST['mdpconnect']);
    	if (!empty($mailconnect) AND !empty($mdpconnect))
    	{
    		$requser = $bdd->prepare("SELECT * FROM membres WHERE mail = ? AND motdepasse = ?");
    		$requser->execute(array($mailconnect,$mdpconnect ));
    		$userexist =$requser->fetchAll(PDO::FETCH_ASSOC);
    		$nbr=$requser->rowCount();
    		if ($nbr == 1)
    		{
    			$userinfo = $requser->fetch();
    			$_SESSION['id']= $userinfo['id'];
    			$_SESSION['pseudo']= $userinfo['pseudo'];
    			$_SESSION['mail']= $userinfo['mail'];
    			$_SESSION['type']= $userinfo['type'];
    			if ($type == "utilisateur") 
    			{
    				header("Location: maintutil.php?id=".$_SESSION['id']);
    				exit();
    			}
    			if ($type == "administrateur") {
     
    				header("Location: maintadmin.php?id=".$_SESSION['id']);
    				exit();
    			}
     
    		}
    		else
    		{
    			$erreur ="Erreur dans l'indentifiant ou le mot de passe";
    		}
    	}
    	else
    	{
    		$erreur ="les deux champs doivent être remplis";
    	}
    }
    ?>
    J'ai bien dans ma table le champ:
    type varchar(255)
    et le message à la validation:
    Notice: Undefined variable: type
    Je loupe quoi?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1-
    Citation Envoyé par Dendrite Voir le message
    Normal, rowcount() ne fonctionne pas pour les requêtes SELECT.

    La bonne méthode :
    Pour la plupart des bases de données, PDOStatement::rowCount() ne retourne pas le nombre de lignes affectées par une requête SELECT.
    À la place, utilisez PDO::query() pour faire une requête SELECT COUNT(*), puis utilisez PDOStatement::fetchColumn() pour récupérer le nombre de lignes retournées.
    Votre application peut ainsi effectuer la bonne action.
    2- Avec fetchAll, on peut utilliser un simple count() (fetchAll renvoie un array PHP) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $userexist = $requser->fetchAll(PDO::FETCH_ASSOC);
    $nbr = count($userexist);
    3- Cela dit, j'utilise rowCount() avec des SELECT, sans problème.

  6. #6
    Membre régulier Avatar de lesitadom39
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2015
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2015
    Messages : 112
    Points : 82
    Points
    82
    Par défaut Undefined variable: type
    Merci, merci,
    Mais ça ne change pas mon message d'erreur.
    Où est passée ma variable ?
    Wanted!!!

  7. #7
    Invité
    Invité(e)
    Par défaut
    Regarde à la ligne indiquée dans le message d'erreur.

  8. #8
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    @canard
    Notice: Undefined variable: type
    Je loupe quoi?
    Il ne connaît pas de $type... normal quoi...

    @dalmatien
    Ok merci des précisions Jreaux. Décidément, la méthode fetch me perturbe.
    Exemple ce matin encore...
    J'ai cette requête avant d'envoyer des mails à plusieurs personnes :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select mail 
    from ma_table
    where f_id=154;

    Toute heureuse d'utiliser tes préconisations, je me retrouve avec
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $mails=$stmt->fetchAll(PDO::FETCH_ASSOC);

    Oui, mais non, parce que après, je voudrais faire ceci :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $mails_to=implode(',' , $mails);

    alors je me dis, mouarf, je change en

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $mails=$stmt->fetchAll(PDO::FETCH_NUM);

    Ben non plus...
    Alors j'ai fini par revenir à mes classiques :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $mails=array();
    while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
       $mails[]=$row['mail'];
    }

    Dans le cas qui nous occupe, plusieurs tuples, mais une seule colonne, tu vois un moyen plus court pour faire un tableau simplet sur un seul niveau ?
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par lesitadom39 Voir le message
    Merci, merci,
    Mais ça ne change pas mon message d'erreur.
    Où est passée ma variable ?
    Wanted!!!
    Elle n'est pas définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $_SESSION['type']= $userinfo['type'];
    if ($type == "utilisateur")
    ça devrait plutôt être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $_SESSION['type']= $userinfo['type'];
    if ($_SESSION['type'] == "utilisateur")
    @Dendrite
    Citation Envoyé par Dendrite Voir le message
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select mail 
    from ma_table
    where f_id=154;

    Oui, mais non, parce que après, je voudrais faire ceci :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $mails_to=implode(',' , $mails);
    Ce qu'il te faut dans ce cas,c'est fetchAll avec PDO::FETCH_COLUMN (voir Exemple #2 Récupération de toutes les valeurs d'une seule colonne depuis un jeu de résultats)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Merci Celira... La méthode fetch n'aura bientôt plus de secret pour moi, ouf !
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

Discussions similaires

  1. Réponses: 16
    Dernier message: 20/04/2013, 11h11
  2. Redirection par header refresh + meta refresh + javascript
    Par maxland dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/02/2010, 11h00
  3. Redirections par header sur serveur IIS ne fonctionne pas
    Par Abac_Angelique dans le forum Langage
    Réponses: 3
    Dernier message: 02/02/2009, 13h04
  4. Réponses: 4
    Dernier message: 19/03/2008, 06h33
  5. Redirection avec la fonction header
    Par Antho13 dans le forum Langage
    Réponses: 6
    Dernier message: 08/08/2007, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo