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 du Club
    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
    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 émérite
    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 du Club
    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)
    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 du Club
    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)
    Regarde à la ligne indiquée dans le message d'erreur.

  8. #8
    Membre expert
    @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

    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
    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!