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

Langage PHP Discussion :

Warning: array_search() [function.array-search]: Wrong datatype for second argument


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut Warning: array_search() [function.array-search]: Wrong datatype for second argument
    Bonjour,

    Voila, j'ai fait un p'tit script avec un array_search, et le problème qui s'affiche sur ma page est le suivant :
    "Warning: array_search() [function.array-search]: Wrong datatype for second argument in..."

    Voila les lignes concernées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Ligne 2 : session_start();
    Ligne 15 : $tab_name = array(0 => "root", 1 => "login1", 2 => "login2");
    Ligne fictive : $name = "login1";
    Ligne 32 : if($verif_name = array_search($name, $tab_name)){
    C'est la ligne en gras qui me retourne l'erreur

    Une idée ?

    P.S : le script est hébergé sur free...

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 127
    Points : 179
    Points
    179
    Par défaut
    Bonjour

    J'ai pris exactement le code ci-dessus et je l'ai testé sur mon hébergement free.
    Ca marche.
    Peut être que $tab_name change de type en amont dans le script ?

    Bon développement

  3. #3
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    déjà revoie bien ta comparaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($verif_name == array_search($name, $tab_name))

  4. #4
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    La bonne manière de vérifier l'existence de l'occurence de $name dans $tab_name serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(($verif_name = array_search($name, $tab_name)) !== FALSE){
       echo 'La clé '.$verif_name.' a été trouvée';
    }
    array_search renvoie la clé si l'élément est trouvé, et non TRUE.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Merci pour toutes vos réponses, mais le problème reste là malheureusement...

    Voila le code en entier si jamais quelqu'un voit d'où vient l'horreur...

    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
     
    <?php
    session_start();
     
    //Def des var
    $_SESSION['access']=true;
     
    $tab_name = array(0 => "login1", 1 => "login2");
    $tabe_mdp = array(0 => "mdp1", 1 => "mdp2");
     
    //Test des identifiants
    function verif_id($name, $mdp){
    	if(($verif_name = array_search($name, $tab_name)) !== FALSE){
    		if($mdp == $tab_mdp[$verif_name]){
    			return true;
    		}
    		else{
    			return false;
    		}
    	}
    	else{
    		return false;
    	}
    }
     
    ///Sécurisation des pages
    function secure($name, $mdp){
    	if(verif_id($name, $mdp) == false){
    		echo "<h1><b style=\"color:red;\">Bad password !</h1>";
    		@header("Refresh: 10;url=index.php");
    		exit();
    	}
    	else{
    		$_SESSION['login'] = $name;
    		$_SESSION['mdp'] = $mdp;
    	}
    }
    ?>

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Banal problème de portée. $tab_name et $tab_mdp sont inconnues de la fonction verif_id. Il faut les passer en paramètre, les déclarer global dans la fonction ou utiliser $GLOBALS['variable'].

    Ce qui aurait dû générer deux E_NOTICE explicites ...

  7. #7
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonsoir,

    Quelques soucis de conception et de langage :

    Pour stocker les informations des utilisateurs, un tableau suffit, chaque occurence du tableau contient le login et le mot de passe de l'utilisateur. La gestion est plus aisée.

    Si dans une fonction tu souhaites accéder à une variable globale, il faut le préciser dans l'entête de fonction comme je l'ai fait dans la fonction is_valid_user(name, pwd).

    Seule la logique doit apparaitre au sein d'une fonction, elle ne doit pas contenir de "présentation", c'est à dire constituer les éléments d'affichage, ou du moins il faut éviter quand cela n'est pas nécessaire.

    Ne pas préfixer header par @ car cela masque les erreurs. Tu ne devrais pas avoir d'erreur.

    L'envoi du contenu au buffer doit se faire après l'appel à header / session_start. (inversement de header et echo)

    global.functions.php
    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
     
    <?php
    session_start();
    $_SESSION['access']=true;
    $tab_users = array(
        array(
            'login' => 'root',
            'pwd' => 't7xdmlxdse2++/access777'
        ),
        array(
            'login' => 'isabelle',
            'pwd' => 'mdpenatt'
        )
    );
     
     
    function is_valid_user($name, $mdp){
        global $tab_users;
        return in_array(array('login' => $name, 'pwd' => $mdp), $tab_users);
    }
     
    function is_authenticated_user(){
        if(!isset($_SESSION['login']) || !isset($_SESSION['mdp'])) return false;
        if(!is_valid_user($_SESSION['login'], $_SESSION['mdp'])) return false;
        return true;		
    }
     
    function authenticate_user($name, $pwd){
        if(!is_valid_user($name, $pwd)) return false;
        $_SESSION['login'] = $name;
        $_SESSION['pwd'] = $pwd;
    }
    Voici comment les utiliser :

    L'internaute arrive sur une page protégée sans s'être préalablement identifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(!is_authenticated_user()){
        header('Refresh: 10;url=index.php');
       die('<strong>You need to be authenticated !</strong>');
    }

    L'internaute tente de s'identifier via un formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(authenticate_user($_POST['login'], $_POST['pwd'])){
       echo 'Authentification réussie vous pouvez naviger dans la partie protégée';
    }else{
       header('Refresh: 10;url=index.php');
       die('<strong>Bad login or password !</strong>');
    }
    J'ai écrit çà vite fait mais ca doit fonctionner.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Merci pour vos réponses je test et je clos le sujet si c'est ok...

    Je ne connaissais pas la fonction global donc forcément...

    Merci en tout cas.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Une dernière chose qui ne marche pas...

    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
     
    $tab_users = array(
    	array(
    		'login' => 'login1',
    		'pwd' => 'mdp1'
    	),
    	array(
    		'login' => 'login2',
    		'pwd' => 'mdp2'
    	)
    );
     
    if(in_array(array('login' => $_POST['login'], 'pwd' => $_POST['mdp']), $tab_users)){
    	echo "Trouvé !";
    }
    else{
    	echo "Non trouvé !";
    }
    Et le résultat est toujours négatif...

    Une idée ?

    Merci !

  10. #10
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    La bonne manière de vérifier l'existence de l'occurence de $name dans $tab_name serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(($verif_name = array_search($name, $tab_name)) !== FALSE){
       echo 'La clé '.$verif_name.' a été trouvée';
    }
    array_search renvoie la clé si l'élément est trouvé, et non TRUE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($verif_name == array_search($name, $tab_name))
    La comparaison est bien entre $verif_name et et le résultat de array_search

  11. #11
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Citation Envoyé par Thes32 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($verif_name == array_search($name, $tab_name))
    La comparaison est bien entre $verif_name et et le résultat de array_search
    Non, c'est toi qui a rajouté un "=" supplémentaire. La comparaison se fait entre $name et les occurences de $tab_name, suite à quoi $verif_name prend la valeur FALSE ou la clé retournée. La condition booléenne est donc la valeur de $verif_name. Pour éviter à PHP le transtypage il faut donc vérifier explicitement la présence d'un booléen, d'où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    f(($verif_name = array_search($name, $tab_name)) !== FALSE)

    Une dernière chose qui ne marche pas...

    Code :


    $tab_users = array(
    array(
    'login' => 'login1',
    'pwd' => 'mdp1'
    ),
    array(
    'login' => 'login2',
    'pwd' => 'mdp2'
    )
    );

    if(in_array(array('login' => $_POST['login'], 'pwd' => $_POST['mdp']), $tab_users)){
    echo "Trouvé !";
    }
    else{
    echo "Non trouvé !";
    }


    Et le résultat est toujours négatif...

    Une idée ?
    Cela fonctionne très bien, et je t'ai développé une fonction is_valid_user qui sert à çà, pourquoi utiliser directement in_array ?

    Si cela ne fonctionne pas, c'est que tu n'as pas saisi les bons identifiants ou alors que $_POST['login'] et $_POST['mdp'] n'existent pas. La preuve :
    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
     
    <?php
    $_POST['login'] = 'login1';
    $_POST['mdp'] = 'mdp1';
     
    $tab_users = array(
    	array(
    		'login' => 'login1',
    		'pwd' => 'mdp1'
    	),
    	array(
    		'login' => 'login2',
    		'pwd' => 'mdp2'
    	)
    );
     
    if(in_array(array('login' => $_POST['login'], 'pwd' => $_POST['mdp']), $tab_users)){
    	echo "Trouvé !";
    }
    else{
    	echo "Non trouvé !";
    }
     
    ?>
    Bonne journée,

  12. #12
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Non, c'est toi qui a rajouté un "=" supplémentaire.
    oui
    Citation Envoyé par ThomasR Voir le message
    La comparaison se fait entre $name et les occurrences de $tab_name, suite à quoi $verif_name prend la valeur FALSE ou la clé retournée.
    ah ! j'ai pas vu où il a expliqué ça.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Merci pour vos réponses qui hélas ne peuvent m'aidées, car je ne vous ai pas tout montré de mon code...

    En faite voila, j'ai trois pages : index.php (le formulaire en gros), protect.php (le fichier des fonctions en gros), et la page ou la personne attérie.

    Voila les code respectif :

    index.php :
    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
     
    <?php
    session_start(); // on démarre la session avant toutes choses
    require_once "protect.php"; // on inclue la page de protection
     
    	if(isset($_SESSION['login'], $_SESSION['mdp'])){ // s'il existe une session (utilisateur déjà logué)
    		if(verif_log($_SESSION['login'], $_SESSION['mdp']) == true){ // si les log sont bons
    			@header("Location: ".$_SESSION['login'].".php"); // on le redirrige à SA page
    		}
    		else{ // sinon, mauvais log
    			echo afficher_form(); // on affiche le formulaire
    		}
    	}
    	else{ // sinon (SESSION non existante)
    		if(!isset($_POST['login'], $_POST['mdp'])){ // si le formulaire d'authentification n'a pas été posté
    			echo afficher_form(); // on affiche le formulaire
    		}
    		else{ // sinon, le formulaire a été posté
    			if(verif_log($_POST['login'], $_POST['mdp']) == false){ // si les identifiants sont érronés
    				echo "<h1><b style=\"color:red;\">Bad password !</h1>"; // on affiche les infos
    				exit();
    			}
    			else{ // sinon (identifiants corrects)
    				$_SESSION['login'] = $_POST['login'];	// on definit les varriables de session
    				$_SESSION['mdp'] = $_POST['mdp'];		//------------------------------------------------------
    				@header("Location: ".$_SESSION['login'].".php"); // on le redirrige à SA page
    			}
    		}
    	}
    ?>
    Et protect.php :
    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
     
    <?php
    session_start();
     
    //----------------------------------------------------------------
    //Def des var
    //----------------------------------------------------------------
     
    $_SESSION['access']=true;
    $tab_users = array(
    	array(
    		'login' => 'login1',
    		'pwd' => 'mdp1'
    	),
    	array(
    		'login' => 'login2',
    		'pwd' => 'mdp2'
    	)
    );
     
     
    //----------------------------------------------------------------
    //Fonctions
    //----------------------------------------------------------------
     
    function verif_log($pseudo, $mdp){
    	global $tab_users;
    	if(in_array(array('login' => $name, 'pwd' => $mdp), $tab_users)){
    		return true;
    	}
    	else{
    		return false;
    	}
    }
     
    function afficher_form(){
    	$page = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    	<title>Website protected !</title>
    </head>
    <body>
    <h1 align="center">The Aglosite website is reserved only for his adherent !</h1>
    <form action="" method="post">
    <p align="center"><b>Authentification :</b></p>
    <p align="center">Login : <input type="text" name="login"></p>
    <p align="center">Pass : <input type="password" name="mdp"></p>
    <p align="center"><input type="submit" value="Authentification"></p>
    </form>
    </body>
    </html>';
    	return $page;
    }
     
    function other_pages(){
    	if(isset($_SESSION['login'], $_SESSION['mdp'])){ // s'il existe une session (utilisateur déjà logué)
    		if(verif_log($_SESSION['login'], $_SESSION['mdp']) == true){ // si les log sont bons
    			return true; // on retourne true pour afficher la page
    		}
    		else{ // sinon, mauvais log
    			return false; // on retourne false pour redirection vers index.php
    		}
    	}
    	else{ // sinon (SESSION non existante)
    		return false; // on retourne false pour redirriger vers index.php
    	}
    }
    ?>
    Maintenant que tout les éléments sont réunis, je pense savoir d'où viens le problème mais je n'arrive pas à le régler : les post. Puisque ma page est dans une fonction, cela n'altérerait-il pas le fonctionnement des post ?

  14. #14
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    les réponses données répondent parfaitement à tes questions.

    J'ai passé une 15min à t'écrire toutes tes fonctions de manière propre et fonctionnel, tu pourrais les utiliser plutôt que d'écrire des choses non optimisées et peu propre.
    Non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    isset($_SESSION['login'], $_SESSION['mdp'])
    Oui :
    Non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(in_array(array('login' => $name, 'pwd' => $mdp), $tab_users)){
    		return true;
    	}
    	else{
    		return false;
    	}
    Oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    is_valid_user($name, $mdp)
    De plus la bonne manière de faire serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return in_array(array('login' => $name, 'pwd' => $mdp), $tab_users)
    comme je l'ai fait dans mon code.

    Non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(verif_log($_SESSION['login'], $_SESSION['mdp']) == true){ // si les log sont bons
    			return true; // on retourne true pour afficher la page
    		}
    		else{ // sinon, mauvais log
    			return false; // on retourne false pour redirection vers index.php
    		}
    Oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return is_authenticated();
    Les logs sont forcément bons puisqu'ils sont en session !



    Logger un utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    session_start();
     
    $erreur = false;
     
    if(isset($_POST['login'])){
        if(authenticate_user($_POST['login'], $_POST['pwd'])){
            header('location: admin.php'); exit();
        }else{
            $erreur = 'Impossible de se connecter';
        }
    }
     
    affiche_form($erreur);

    Rediriger un utilisateur accédant à une page protégée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(!is_authenticated_user()){
        header('Refresh: 10;url=login.php');
        die('<strong>You need to be authenticated !</strong>');
    }
    je pense savoir d'où viens le problème mais je n'arrive pas à le régler : les post. Puisque ma page est dans une fonction, cela n'altérerait-il pas le fonctionnement des post ?
    Quel problème ?
    Les valeurs POST sont superglobales donc accessibles d'où tu veux. Aucun soucis.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Alors soit, j'utilise tes fonctions...

    Résultat égal : négatif. Alors puisque je ne comprends pas très bien ces fonctions, pourais-tu s'il te plait m'expliquer d'où vient cette erreure, car après une grosse demi-heure de prise de tête je préfère laissez faire les pro...

    index.php :
    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
     
    <?php
    session_start(); // on démarre la session avant toutes choses
    require_once "protect.php"; // on inclue la page de protection
    	if(isset($_POST['login'], $_POST['pwd'])){
    		if(authenticate_user($_POST['login'], $_POST['pwd'])){
    			$_SESSION['login'] = $_POST['login'];
    			$_SESSION['pwd'] = $_POST['pwd'];
    			header("Location: ".$_SESSION['login'].".php"); // on le redirrige à SA page
    			exit();
    		}else{
    			echo "<h1><b style=\"color:red;\">Bad password !</h1>"; // on affiche les infos
    		}
    	}
    	echo afficher_form();
    ?>
    protect.php :
    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
     
    <?php
    session_start();
     
    function afficher_form(){
    	$page = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    	<title>Website protected !</title>
    </head>
    <body>
    <h1 align="center">The Aglosite website is reserved only for his adherent !</h1>
    <form action="index.php" method="post">
    <p align="center"><b>Authentification :</b></p>
    <p align="center">Login : <input type="text" name="login"></p>
    <p align="center">Pass : <input type="password" name="mdp"></p>
    <p align="center"><input type="submit" value="Authentification"></p>
    </form>
    </body>
    </html>';
    	return $page;
    }
     
    $_SESSION['access']=true;
     
    $tab_users = array(
    	array(
    		'login' => 'login1',
    		'pwd' => 'mdp1'
    	),
    	array(
    		'login' => 'login2',
    		'pwd' => 'mdp2'
    	)
    );
     
     
    function is_valid_user($name, $mdp){
    	global $tab_users;
    	return in_array(array('login' => $name, 'pwd' => $mdp), $tab_users);
    }
     
    function is_authenticated_user(){
    	if(!isset($_SESSION['login']) || !isset($_SESSION['mdp'])) return false;
    	if(!is_valid_user($_SESSION['login'], $_SESSION['mdp'])) return false;
    	return true;
    }
     
    function authenticate_user($name, $pwd){
    	if(!is_valid_user($name, $pwd)) return false;
    	$_SESSION['login'] = $name;
    	$_SESSION['pwd'] = $pwd;
    }
    ?>
    et sur la page protégée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    session_start(); // on démarre la session
    require_once "protect.php"; // on inclue le fichier de protection
     
    if(!is_authenticated_user()){
    	header('Refresh: 10;url=index.php');
    	die('<strong>You need to be authenticated !</strong>');
    }
     
    // la page...
    ?>
    Le problème ? Oh pas grand chose si ce n'est que on a beau s'authentifier encore et encore, rien ne se passe...
    D'avance, merci.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Autant pour moi, le pb venait du formulaire (le champs password s'appelait mdp au lieu de pwd).

    Bref, l'authentification a lieu, mais toujours l'authentification échoue, même avec les bons log Oo

    Des idées ?

  17. #17
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Quelle erreur ?

    Tu fais deux appels à session_start() et la fonction authenticate_user valorise déjà les sessions (puisqu'elle sert à authentifier l'utilisateur).

    La fonction qui sert à vérifier un utilisateur est is_valid_user.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    require_once "protect.php"; // on inclue la page de protection
    	if(isset($_POST['login'], $_POST['pwd'])){
    		if(authenticate_user($_POST['login'], $_POST['pwd'])){
    			header("Location: ".$_SESSION['login'].".php"); // on le redirrige à SA page
    			exit();
    		}else{
    			echo "<h1><b style=\"color:red;\">Bad password !</h1>"; // on affiche les infos
    		}
    	}
    	echo afficher_form();
    ?>
    De mon côté, j'ai testé, et les fonctions données fonctionnent bien.
    Lorsque tu tentes de t'identifier, tu as donc "Bad password" qui s'affiche ?

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    Points : 95
    Points
    95
    Par défaut
    Oui voila, j'ai un bad password, même avec les bon identifiants

  19. #19
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Peux tu afficher ce que tu reçois et vérifier si c'est correct ? il y a peut être des espaces...

  20. #20
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Si ca ne fonctionne pas c'est que tu n'as pas mis les bons identifiants :

    Pour preuve :

    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
    <?php
    $_POST['login'] = 'login1';
    $_POST['mdp'] = 'mdp1';
     
    $tab_users = array(
    	array(
    		'login' => 'login1',
    		'pwd' => 'mdp1'
    	),
    	array(
    		'login' => 'login2',
    		'pwd' => 'mdp2'
    	)
    );
    function is_valid_user($name, $mdp){
        global $tab_users;
        return in_array(array('login' => $name, 'pwd' => $mdp), $tab_users);
    }
    if(is_valid_user($_POST['login'], $_POST['mdp'])){
    	echo "Trouvé !";
    }
    else{
    	echo "Non trouvé !";
    }
     
    ?>
    Affiche "Trouvé"

    Par contre, si la page de protection ne fonctionne pas c'est surement parce que j'ai fait une faute dans la fonction is_authenticated_user:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function is_authenticated_user(){
        if(!isset($_SESSION['login']) || !isset($_SESSION['pwd'])) return false;
        if(!is_valid_user($_SESSION['login'], $_SESSION['pwd'])) return false;
        return true;		
    }
    ($_SESSION['pwd'] à la place de $_SESSION['mdp'])
    Mea culpa.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/06/2015, 13h59
  2. Réponses: 0
    Dernier message: 08/11/2010, 17h37
  3. Réponses: 4
    Dernier message: 22/09/2010, 14h42
  4. in_array : Wrong datatype for second argument
    Par yann123456 dans le forum Langage
    Réponses: 15
    Dernier message: 19/03/2009, 14h46
  5. Réponses: 5
    Dernier message: 12/02/2009, 14h36

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