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 :

must be an array, boolean given,


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut must be an array, boolean given,
    Bonjour tout le monde. Je sollicite votre aide.

    J'ai un espace membre en objet, avec une classe membre, et un manager. Voilà mon problème, sur le page de profil, j'appelle une méthode pour récupérer et afficher les informations sur les membres selon l'ID.

    Quand les infos correspondant à l'id sont bien dans la bdd, ça s'affiche correctement, par contre mon problème se situe lorsque je modifie les valeurs du paramètre de l'url. Si je touche au paramètre, pas de problème, la redirection se fait bien, mais si je modifie la valeur de l'id, par exemple profil.php?id=151fs61df5s au lieu de profil.php?id=1, ça plante avec ce message :

    "Catchable fatal error: Argument 1 passed to Membres::hydrate() must be an array, boolean given".
    J'ai tenté de mettre une condition, if(lafonction==false){header(etc..);} Mais rien à faire. Voici mon code.

    La méthode dans ma classe manager:
    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
       public function get($info)
      {	
    	if(is_int($info))
    	{
    	 $q = $this->_db->prepare('SELECT * FROM membres WHERE id = :id');
         $q->execute(array(
    	 'id'=>$info));
    	 $donnees = $q->fetch(PDO::FETCH_ASSOC);
    	 return new Membres($donnees);
    	}
     
    	$q=$this->_db->prepare('SELECT * FROM membres WHERE pseudo=:pseudo');
    	$q->execute(array(
    	'pseudo'=>$info
    	));
    	$donnees=$q->fetch(PDO::FETCH_ASSOC);
    	return new Membres($donnees);
       }
    Puis voici mon le code du profil:

    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
    if (!empty($_GET['id']))
    {	
    	$_GET['id']=(int)$_GET['id'];
    	$membre=$manager->get($_GET['id']);
    		if($membre==false) //C'est ici que j'essaie de régler le souci, mais ça ne marche pas.
    		{
    			header('location:../list_membres/list_membres.php');
    		}
    }
     
    else
    {
    	header('location:../list_membres/list_membres.php');
    }
     
     
     
    require_once ('../../vue/profil/profil.php');
    Puis un bout la vue:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <p>Âge: <?php echo $membre->age(); ?></p>
    				   <p>Email: <?php echo $membre->mail(); ?></p>
    				   <p>Signature: <?php echo $membre->signature(); ?>  </p>

    Je me suis resté dessus toute la journée, mais je ne trouve pas de solution.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Par défaut
    Bonsoir,

    tu donne à la méthode hydrate un booléen alors qu'elle attend un tableau,

    tu lui passe un booléen car ta requête ne trouve pas l'id ou le pseudo dans la BDD,

    a la place de tester après la méthode get() de ton manager fait plutôt :
    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
    public function get($info)
      {	
    	if(is_int($info))
    	{
    	 $q = $this->_db->prepare('SELECT * FROM membres WHERE id = :id');
         $q->execute(array(
    	 'id'=>$info));
    	 //Test si une personne est trouvé en fonction de l'id
             if( $donnees = $q->fetch(PDO::FETCH_ASSOC) )
             	 return new Membres($donnees);
             else
                     return false;
    	}
     
    	$q=$this->_db->prepare('SELECT * FROM membres WHERE pseudo=:pseudo');
    	$q->execute(array(
    	'pseudo'=>$info
    	));
    	//En fonction du pseudo
            if( $donnees=$q->fetch(PDO::FETCH_ASSOC) )
            	return new Membres($donnees);
            else
            	return false;
       }
    Ensuite tu laisse le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $membre=$manager->get($_GET['id']);
    		if($membre==false)
    		{
    			header('location:../list_membres/list_membres.php');
    		}

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Il y a un problème de conception dans ta méthode get: elle cherche à la fois pour un id et pour un pseudo. Il est préférable qu'une méthode fasse une seule chose, sinon ça mène à des confusions.

    Lorsque tu utilises un string dans l'url, ton code le caste en int, et la valeur de cet int est cherché dans ta table membres. Comme la valeur ainsi résultant n'existe pas dans ta table, $données est false, et ton new Member reçoit false en paramètre. D'où l'erreur, puisque hydrate attends un tableau et reçoit un boolean (false) à la place.

    - il ne faut pas que tu convertisses la valeur de GET[id], il faut que tu vérifie si id est bien présent dans $_GET et que tu testes si c'est bien une valeur numérique (en utilisant filter), autrement en fonction de la conversion, tu risques d'avoir des résultats non prévus.
    - le test ne doit pas avoir lieu après la création de $membres, mais avant: tu dois vérifier que $données est bien un tableau avant de créer un nouveau membre.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut
    Merci pour vos conseils. Je rectifie le tir demain et je fais un retour pour dire ce qu'il en est.


  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Catchable fatal error: Argument 1 passed to Membres::hydrate() must be an array, boolean given
    un simple bloc try/catch autour de la méthode posant problème permet de régler ça proprement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
        fonction_qui_genere_erreur();
    } catch(Execption $e) {
        //Rediriger, afficher un message d'erreur ...
    }
    Voir cet article sur la gestion des exceptions
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Par défaut
    Ok merci pour vos réponses.

    Donc j'ai opté pour cette solution:

    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
     
      public function idExists($info)
      {
    	$q=$this->_db->prepare('SELECT COUNT(*) FROM membres WHERE id = :id');
    	$q->execute(array(
    	'id'=>$info
    	));
    	return (bool) $q->fetchColumn();
      }
     
       public function get($info)
      {	
    	 $q = $this->_db->prepare('SELECT * FROM membres WHERE id = :id');
         $q->execute(array(
    	 'id'=>$info));
    	 $donnees = $q->fetch(PDO::FETCH_ASSOC);
    	 return new Membres($donnees);
     }
    Puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if(isset($_GET['id']))
    {
    	if($manager->idExists($_GET['id']))
    		{
    			$membre=$manager->get($_GET['id']);
    		}
    	else {header('location:../list_membres/list_membres.php');}
     
    }
    else{
     
    	header('location:../list_membres/list_membres.php');
    }

    En j'ai donc changé la méthode get pour éviter les confusion, et je test l'existence des données dans la bdd avant de créer l'objet, ce qui est logique quand on y pense.

    Ah je me suis au php depuis peu, à fond, mais il va falloir que je multiplie les efforts. Merci pour les liens aussi.

Discussions similaires

  1. [MySQL] mysql_fetch_assoc() , boolean given
    Par JiBLG dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/06/2014, 08h13
  2. [MySQL] Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in
    Par Sarah sh dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/12/2013, 18h12
  3. Réponses: 4
    Dernier message: 05/05/2013, 20h22
  4. Réponses: 3
    Dernier message: 04/08/2012, 13h11
  5. [1.x] erreur sfForm::bind() must be an array()
    Par megaloplex dans le forum Symfony
    Réponses: 3
    Dernier message: 08/07/2010, 15h53

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