Fatal error: Cannot use object of type search as array in /home/...

Résolu
sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010 - 4 mars 2009 à 17:42
sebshiva Messages postés 194 Date d'inscription lundi 16 mars 2009 Statut Membre Dernière intervention 17 juin 2010 - 7 mars 2009 à 12:12
Bonjour! Première fois que je poste une question...
Je débute en POO et tente de passer une fonction de recherche dans une classe avant de la développer d'avantage et pouvoir l'utiliser ailleurs (le but de l'objet non?)
J'ai cherché la réponse à mon problème en vain...

Voici ma "classe".. (ma première, soyez indulgents )

<?php

require('fonctions_gepo.php');

class search

{

   var $MotifSearch;

   var $IfSearch=0;

   var $VewType;

   var $word_sound;

   var $meta=array();

   function find($MotifSearch)

   {

      connect();

      $sql = "SHOW TABLES";

      $tables = mysql_query($sql);

      if (!$tables)

      {

     echo "Erreur DB, impossible de lister les tables\n";

     echo 'Erreur MySQL : ' . mysql_error();

     exit;

      }

      $i=0;;$f=0;

      while ($table_name = mysql_fetch_row($tables))

      {

     $req_fields_name="select * from ".$table_name[0];

     $result_fields_name[$i]=mysql_query($req_fields_name);    

     for ($for=0;$for<mysql_num_fields($result_fields_name[$i]);$for++)

     {

        $meta = mysql_fetch_field($result_fields_name[$i], $for);            

        if ((!strpos($meta->name, "id_"))&& ($meta->table!="admin")     &&($meta->type=="blob")||($meta->type=="string")||($meta->type=="timestamp"))

        {

           $word_sound = soundex($MotifSearch);

           $req_r_find="select ".$meta->name.",id_".$meta->table." from ".$meta->table." where ".$meta->name." like '%".$MotifSearch."%' or soundex($meta->name) = '" . $word_sound . "'";

           $res_req_r_find=mysql_query($req_r_find);

           if (!empty($res_req_r_find))

           {

          while ($ligne_req_r_find = mysql_fetch_array($res_req_r_find))

            {

             $result_find[$f][0]=$ligne_req_r_find[$meta->name];

             $result_find[$f][1]=$meta->name;

             $result_find[$f][2]=$meta->table;

             $result_find[$f][3]=$ligne_req_r_find["id_".$meta->table];

             if ($meta->table=="contact") $result_find[$f][4]="details_contact";

             if (($meta->table=="client")||($meta->table=="fournisseur"))

             $result_find[$f][4]="details";

             if ($meta->table=="dd") $result_find[$f][4]="details_dd";

             $f++;

          }

            }

           }    

        }

        $i++;

     }

     return($result_find);

      }

   }

?>

et dans mon script :

$result_find = new search;
$result_find->find($_POST['mcle']);

count($result_find) me donne 1...
et Fatal error: Cannot use object of type search as array in /home/...

Je pense que le soucis vient de $meta->... mais je ne vois pas pourquoi... bein oui, débutant... Merci de vos lumières...

20 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 mars 2009 à 12:08
Tu fais des erreurs de débutant :
for ($t=0;$t<count($this->ResultFind);$t++)
On ne met jamais de fonction dans l'argument central d'une boucle for(), car celui-ci est évalué à chaque tour de la boucle. Et ça ne sert à rien dans la plupart des cas.
Tu dois assigner le résultat du count() dans une variable, avant ta boucle, ou dans le for() mais d'une manière bien précise :
$iCount = count($aTableau);
for($iCpt = 0; $iCpt < $iCount; $iCpt++)
oufor($iCpt 0, $iCount count($aTableau); $iCpt < $iCount; $iCpt++)
C'est valable pour d'autres boucles de ton code.

Selon moi, et hors contexte, ton objet est trop spécifique à ton applicatif.

On ne fait pas d'exit brutal dans un objet. Bon tu es en PHP4...donc tu ne peux pas utiliser les exceptions, mais générer des erreurs utilisateur et utiliser un gestionnaire d'erreur serait une bien meilleure idée.

Quand tu es certain du type des variables comparées, utilises la comparaison stricte === ou !==, au lieu des habituels == ou !=

Je n'aime pas ta façon de présenter le code...tous mes blocs sont encapsulés entre des accolades : même pour une condition if() ne contenant qu'une seule ligne.

Ton objet utilise les sessions...tu devrais vérifier qu'elles sont bien déclarées avant de les utiliser : la session est-elle démarrée, et quand tu utilises unevariable de session spécifique, vérifie qu'elle existe.
C'est valable pour toute variable.

Mais bon...globalement, j'ai vu pire :-) C'est pas mal pour un début.
3

Discussions similaires

convertir HTML en Array PHP
AFPA2003 -
GRenard -

5 réponses
Rejoignez-nous