Fatal error: Call to a member function fetch() on a non-object

Résolu
Bonjour,
J'ai cette erreur dans cette partie de code :

Fatal error: Call to a member function fetch() on a non-object in ....
//au niveau du while.

function getEventsDate($mois, $annee) {
$result = array();
$sql = 'SELECT DISTINCT jour_taches, titre_taches FROM calendrier c, taches t WHERE mois_taches='.$mois.' AND annee_taches='.$annee.' AND c.id_taches = t.id_taches ORDER BY jour_taches';
if($sql)
{
}else{
die("Une requête a échouée.");
}
while ($row = $sql->fetch(PDO::FETCH_NUM)){
$result[] = $row[0];
$result[] = $row[1];
}
if($pdo){
$pdo = NULL;
}
return $result;
}

Merci de bien vouloir m'aider car je suis perdu

3 réponses

  1. Bonjour,

    Tu appel une méthode PDO sur un string.. je ne vois nul par une ligne concernant ta BDD...

    Ha et aussi met un titre plus explicite ;)

    Merci de mettre "Résolu" quand le problème est réglé!
    La connaissance c'est comme la confiture: moins on en a et plus on l'étale.
    1
    1. Bonjour,
      j'ai maintenant la meme erreur a prepare() :

      function getEventsDate($mois, $annee) {
      $result = array();
      $sql = 'SELECT DISTINCT jour_taches, titre_taches FROM calendrier c, taches t WHERE mois_taches='.$mois.' AND annee_taches='.$annee.' AND c.id_taches = t.id_taches ORDER BY jour_taches';
      $query = $pdo->prepare($sql);
      $query->execute();
      if($query)
      {
      }else{
      die("Une requête a échouée.");
      }
      while ($row = $query->fetch(PDO::FETCH_NUM)){
      $result[] = $row[0];
      $result[] = $row[1];
      }
      if($pdo){
      $pdo = NULL;
      }
      return $result;
      }

      function afficheEvent($i, $event) {
      $texte = ""; $suivant = false;

      foreach($event as $cle => $element) {
      if($suivant) {
      $texte .= $element."<br/>";
      }
      if($element == $i) {
      $suivant = true;
      } else {
      $suivant = false;
      }
      }

      return $texte;
      }
      0
      1. Où est déclaré $pdo?
        0
      2. J'ai inclué le fichier config qui est :

        <?php
        // Connexion a la base de donnees
        $host='**';
        $database='**';
        $user='**';
        $password='**';

        $strCon = "mysql:host=$host;dbname=$database";
        $arrExtraParam= array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");
        $pdo = new PDO($strCon, $user, $password, $arrExtraParam);
        $pdo->exec("SET NAMES 'utf8'");
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        ?>
        0
      3. Dans ce cas :
        global $pdo;
        au début de ta fonction car la porté des variable global n'est pas la même comme en C/C++ ;)
        0
      4. function getEventsDate($mois, $annee) {
        global $pdo;
        $result = array();
        $sql = 'SELECT DISTINCT jour_taches, titre_taches FROM calendrier c, taches t WHERE mois_taches='.$mois.' AND annee_taches='.$annee.' AND c.id_taches = t.id_taches ORDER BY jour_taches';
        $query = $pdo->prepare($sql);
        $query->execute();
        if($query)
        {
        }else{
        die("Une requête a échouée.");
        }
        while ($row = $query->fetch(PDO::FETCH_NUM)){
        $result[] = $row[0];
        $result[] = $row[1];
        }
        if($pdo){
        $pdo = NULL;
        }
        return $result;
        }

        function afficheEvent($i, $event) {
        $texte = ""; $suivant = false;

        foreach($event as $cle => $element) {
        if($suivant) {
        $texte .= $element."<br/>";
        }
        if($element == $i) {
        $suivant = true;
        } else {
        $suivant = false;
        }
        }

        return $texte;
        }

        comme ceci ?

        Merci
        0
      5. Dans le cas ou l'include est fait à l'extérieur de ta fonction oui, ca me semble juste.
        0
    2. Je t'ai mis juste avant comme faire pour ne pas incorporer des variables dans la requete, et tu me refais ca. Donc fais comme je t'ai montré avant ;-)
      0
      1. Je voudrais voir si sa marche déjà comme sa (car c'est la méthode la plus facile) même si c 'est pas sécurisé...
        Comment ca se fait qu'il me dise sa comme erreur stp...
        0
      2. C'est pas plus facile, tu risques plus de faire une erreur de cote/double cote comme ca qu'en faisant un bindValue avec un tableau dans le execute. D'ailleurs c'est ton probleme ici
        0
      3. function getEventsDate($mois, $annee) {
        global $pdo;
        $proprietaire=($_SESSION['username']);
        $result = array();
        $query = $pdo->prepare('SELECT jour_taches, intitule, proprietaire FROM calendrier c join taches t on c.id_taches = t.id_taches WHERE mois_taches=:mois AND annee_taches=:annee AND proprietaire=:proprietaire ORDER BY jour_taches');
        $query->bindParam(':mois',$mois);
        $query->bindParam(':annee',$annee);
        $query->bindParam(':proprietaire',$proprietaire,PDO::PARAM_STR);
        $query->execute();

        sa ne marche plus depuis que j'ai fait les bindparam...
        0
      4. A defaut si tu lui dit pas, il met des string. Donc si tes mois taches et annee taches sont des number, il faut mettre PDO::PARAM_INT
        Et c'est pas pcq tu mets des bindValue qu'il faut zapé les " " !
        WHERE proprietaire=":proprietaire"
        0