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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    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 expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 127
    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
    Membre Expert
    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
    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 : 38
    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
    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 éclairé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 241
    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
    Membre expérimenté

    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
    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 : 38
    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
    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 Expert
    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
    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

  9. #9
    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 : 38
    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
    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,

+ Répondre à la discussion
Cette discussion est résolue.

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