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

Discussion :

if avec redirection par header


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club Avatar de lesitadom39
    Homme Profil pro
    Retraité
    Inscrit en
    août 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 : 38
    Points : 38
    Points
    38
    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 émérite
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    juin 2008
    Messages
    1 798
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : juin 2008
    Messages : 1 798
    Points : 2 985
    Points
    2 985
    Billets dans le blog
    7
    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 (==)
    Mes billets de blog : un billet = une problématique précise
    It's easier to be friends with lots of people online than one person in person!

  3. #3
    Membre expérimenté Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2012
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Maroc

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

    Informations forums :
    Inscription : janvier 2012
    Messages : 1 048
    Points : 1 699
    Points
    1 699
    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
    Nouveau membre du Club Avatar de lesitadom39
    Homme Profil pro
    Retraité
    Inscrit en
    août 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 : 38
    Points : 38
    Points
    38
    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
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 15 366
    Points : 31 366
    Points
    31 366
    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.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  6. #6
    Nouveau membre du Club Avatar de lesitadom39
    Homme Profil pro
    Retraité
    Inscrit en
    août 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    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 : 38
    Points : 38
    Points
    38
    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
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    15 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 15 366
    Points : 31 366
    Points
    31 366
    Par défaut
    Regarde à la ligne indiquée dans le message d'erreur.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  8. #8
    Membre émérite
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    juin 2008
    Messages
    1 798
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : juin 2008
    Messages : 1 798
    Points : 2 985
    Points
    2 985
    Billets dans le blog
    7
    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 ?
    Mes billets de blog : un billet = une problématique précise
    It's easier to be friends with lots of people online than one person in person!

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

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

    Informations forums :
    Inscription : avril 2007
    Messages : 8 356
    Points : 15 829
    Points
    15 829
    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 émérite
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    juin 2008
    Messages
    1 798
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : juin 2008
    Messages : 1 798
    Points : 2 985
    Points
    2 985
    Billets dans le blog
    7
    Par défaut
    Merci Celira... La méthode fetch n'aura bientôt plus de secret pour moi, ouf !
    Mes billets de blog : un billet = une problématique précise
    It's easier to be friends with lots of people online than one person in person!

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 Fonctions
    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 Formulaires
    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