Erreur fetchAll() on a non-objet

Fermé
Dalbator Messages postés 51 Date d'inscription mardi 9 juillet 2013 Statut Membre Dernière intervention 3 juin 2017 - 17 oct. 2016 à 18:35
Dalbator Messages postés 51 Date d'inscription mardi 9 juillet 2013 Statut Membre Dernière intervention 3 juin 2017 - 19 oct. 2016 à 12:56
Bonjour,

Je suis entrain de suivre un tuto pour me connecter a une base de donnée en PHP mais j'ai un souci et j'arrive pas à le résoudre.

Voila le code :
Public Function GetInfoUser()
	{
		$json = array();
		
		$response = $this->executeQuery("SELECT * FROM t_InfoJoueur;", NULL, false);
		$json = $response->fetchAll(PDO::FETCH_ASSOC);
		
		$result = json_encode($json);
		$response->closeCursor();
		return ("OK:" . $result);
	}
	private function executeQuery($query, $args, $fetch = true)
	{
		$reponse = $this->bdd->prepare($query);
		$reponse->execute($args);
		if ($fetch)
		{
			$data = $reponse->fetch();
			$reponse->closeCursor();
			return($data);
		}
		else
			return ($response);
	}


Et l'erreur :
 
Fatal error: Call to a member function fetchAll() on a non-object in /home/u620002219/public_html/admin.php on line 106


Voila voila, si vous avez besoin de plus de code dites le moi.
A voir également:

2 réponses

jordane45 Messages postés 38304 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 novembre 2024 4 705
Modifié par jordane45 le 17/10/2016 à 19:39
Bonjour,

Active la gestion des erreurs PDO et places ta requête dans un bloc TRY/CATCH.... ça devrait te dire ce qui ne va pas.
Regarde ici : https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs


Cordialement, 
Jordane                                                                 
0
Dalbator Messages postés 51 Date d'inscription mardi 9 juillet 2013 Statut Membre Dernière intervention 3 juin 2017
17 oct. 2016 à 20:23
Du coup je fait ca ?

	
public function admin()
	{
		try { 
		$this->bdd = new PDO('mysql:host=localhost;dbname=****, ***, '******');
		$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
		}
		catch (Exception $ex) { die('ERROR:ERROR_BDD_CONNECTION');}
	}
	Public Function GetInfoUser()
	{
		try {
		$json = array();
		$response = $this->executeQuery("SELECT * FROM t_InfoJoueur;", NULL, false);
		$json = $response->fetchAll(PDO::FETCH_ASSOC);
		$result = json_encode($json);
		$response->closeCursor();
		return ("OK:" . $result);
		}
		catch(Exception $e){echo " Erreur ! ".$e->getMessage();}
	}



Mais j'ai cette erreur :

Fatal error: Call to a member function setAttribute() on a non-object in /home/u620002219/public_html/admin.php on line 35
0
jordane45 Messages postés 38304 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 novembre 2024 4 705 > Dalbator Messages postés 51 Date d'inscription mardi 9 juillet 2013 Statut Membre Dernière intervention 3 juin 2017
17 oct. 2016 à 21:53
D'un côté tu as
$this->bdd

et de l'autre
$bdd

Ne vois tu pas l'erreur ?

Essayes ça :
<?php

class taclass  extends PDO{

 private $bdd = null;

 function __construct(){
   parent::__construct(); 
 }
 
 public function cnx()[
   try{
    $_bdd = new PDO('mysql:host=localhost; dbname=mabdd; charset=utf8', 'user', 'password');
    $_bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //activation des erreurs
    $_bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); // type de fetch par défaut
    $this->bdd = $_bdd;
  } catch(PDOException $e) {
     die('Erreur : ' . $e->getMessage());
  }
}

 private function executeQuery($query, $args = NULL, $fetch = true) {
  try{
   $reponse = $this->bdd->prepare($query);
   $reponse->execute($args);
   if ($fetch) {
     $result = $reponse->fetch();
     $reponse->closeCursor();
   } else {
    $result = $reponse;
   }
  }catch(Exception $e){
    echo " Erreur dans la requête $query ". $e->getMessage();
	echo "<br> args : <br>";
	print_r($args);
	$result = NULL;
  }
  return $result;
 }

 Public Function GetInfoUser(){
   $result = NULL;
   try {
     $json = array();
     $response = $this->executeQuery("SELECT * FROM t_InfoJoueur;", NULL, false);
	 if(!empty($response)){
       $json = $response->fetchAll(PDO::FETCH_ASSOC);
       $result = json_encode($json);
       $response->closeCursor();
	 }
   } catch(Exception $e){
     echo " Erreur ! ".$e->getMessage();
   }
     return $result;
 }

//------ FIN DE LA CLASS ---------//
}
0
Dalbator Messages postés 51 Date d'inscription mardi 9 juillet 2013 Statut Membre Dernière intervention 3 juin 2017
18 oct. 2016 à 19:50
MERCI MERCI MERCI. Peux tu juste m'expliquer a quoi sert :

function __construct(){
   parent::__construct(); 
 }
0
jordane45 Messages postés 38304 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 novembre 2024 4 705 > Dalbator Messages postés 51 Date d'inscription mardi 9 juillet 2013 Statut Membre Dernière intervention 3 juin 2017
18 oct. 2016 à 23:19
C'est un constructeur de class
cette fonction est automatiquement appellée lorsque l'on instancie la class (avec le new).
Le parent:: ç'est pour faire référence à la class en Extend (ici PDO).
0
Dalbator Messages postés 51 Date d'inscription mardi 9 juillet 2013 Statut Membre Dernière intervention 3 juin 2017
Modifié par didi56440 le 19/10/2016 à 10:27
D'accord merci mais a présent j'ai une nouvelle erreur mais la requête fonctionne :

Erreur dans la requête UPDATE t_InfoJoueur SET Bani = 1 WHERE Pseudo_ID = ?; SQLSTATE[HY000]: General error
args :
Array ( [0] => Dalbator ) OK:BANNED

Le code :

	public function ban ($user)
	{	
		if(!$this->userExist($user)) return ("ERROR:USER_NOT_FOUND");
		$this->executeQuery("UPDATE t_InfoJoueur SET Bani = 1 WHERE Pseudo_ID = ?;", array($user));
		return("OK:BANNED");
	}
0
jordane45 Messages postés 38304 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 novembre 2024 4 705
19 oct. 2016 à 11:48
Je viens de voir ...
Tu utilises, pour faire un UPDATE la fonction executeQuery .... qui fait un FETCH (ou un fetchALL) ....
Normal que ça te retourne une erreur.
Créés donc une seconde fonction
Une pour faire des SELECT
une pour faire des UPDATE ou DELETE

Perso (j'en ai 3) :
j'ai une fonction querySELECT pour faire les select (et les fetch), une pour faire les UPDATE / DELETE que j'ai nommé queryExec
et une pour les INSERT que j'ai nommé queryInsert

Voila à quoi pourrait ressembler ta class de connexion à la BDD
<?php
//-------------------------------------------------------------------------//
//  Fichier de class : pdoFunc.class.php
// pour la connexion/gestion de la BDD  en PDO mysql
// autheur : Jordane  - Mai 2014
//-------------------------------------------------------------------------//


class pdoFunc extends PDO{
  //put your code here
  private $_obj_pdo,
          $_obj_pdo_prepare;
 
  public $_last_insert_id="";
  public $_query = array(); // contient la requête et les datas
  
  
 function __construct(){
   parent::__construct(); 
   //connexion à la BDD
   $this->cnx();
 }
 
 /**
 // Connnexion
 */
 public function cnx(){
   try{
    $_obj_pdo = new PDO('mysql:host=localhost; dbname=mabdd; charset=utf8', 'user', 'password');
    $_obj_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //activation des erreurs
    $_obj_pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); // type de fetch par défaut
    $this->_obj_pdo = $_obj_pdo;
  } catch(PDOException $e) {
	 $this->_obj_pdo = null;
     die('Erreur : ' . $e->getMessage());
	 
  }
}


/---------------------------------------------------------------------------------------------------------------------------//	
//  FONCTIONS
//---------------------------------------------------------------------------------------------------------------------------//	
		
 /**
 * Requête : SELECT
 * return : Array
 * fetchAll — > Retourne un tableau contenant toutes les lignes du jeu d'enregistrements 
 */
 public function querySelect($sql,$a_data=NULL){
   
  $this->_query = array('SQL'=>$sql, "A_DATA"=>$a_data);
  try{
   $this->_obj_pdo_prepare = $this->_obj_pdo->prepare($sql);
   $this->_obj_pdo_prepare->execute($a_data);  
   return $this->_obj_pdo_prepare->fetchAll();
  } catch(Exception $e) {
     echo "<pre><br>".$e->getMessage()."<br>";
     print_r($this->_query);
     echo "</pre>";
  }
 } 

 /**
 * Requête : INSERT
 * return : int : ID INSERT (Numéro de l'id auto_incrémenté créé lors de l'insert)
 */
 public function queryInsert($sql,$a_data=NULL){

  $this->_query = array('SQL'=>$sql, "A_DATA"=>$a_data);
    
  try{
     $this->_obj_pdo_prepare = $this->_obj_pdo->prepare($sql);
     $this->_obj_pdo_prepare->execute($a_data);
     $this->_last_insert_id = $this->_obj_pdo->lastInsertId();
     return $this->_last_insert_id ;
  } catch(Exception $e){
     echo "<pre>";
     print_r($this->_query);
     echo "</pre>";
     echo "<br>".$e->getMessage()."<br>";
  }
    
 }
  
 /**
 * Requête : EXEC (pour les Update/Delete..)
 * return : True/False
 */ 
 public function queryExec($sql,$a_data=NULL){
  $this->_query = array('SQL'=>$sql, "A_DATA"=>$a_data);
  try{
    $this->_obj_pdo_prepare = $this->_obj_pdo->prepare($sql);
    
    $result['RESULT'] = $this->_obj_pdo_prepare->execute($a_data);
    $result['NB_ROWS_AFFECTED'] = $this->_obj_pdo_prepare->rowCount();
    return $result; 
  } catch(Exception $e) {
    echo "<pre><br>".$e->getMessage()."<br>";
    print_r($this->_query);	
    echo "</pre>";
  }
 } 
 

 
}//----------- FIN DE LA CLASS -------------------//


Dans la class qui gère tes users.. il te suffit ensuite d'en faire un Extend pour pouvoir l'utiliser.
Par exemple :

<?php
//-----------------------------------------------------------------//
// Fichier users.class.php
// Class de gestion des users
// Necessite la class pdoFunc
//-----------------------------------------------------------------//
class users extends pdoFunc{
	private $table = "t_InfoJoueur";
	
	function __construct(){
		parent::__construct();
		
	}
	
	
 public Function GetUsers(){
 $result = NULL;
 $json = array();
 $response = $this->querySelect("SELECT * FROM $this->table");
 if(!empty($response)){
   $json = $response[0];
   $result = json_encode($json);
 }
 return $result;
}


public function userExist($user){
 $sql = "SELECT * FROM $this->table WHERE Pseudo_ID = :user":
 $datas = array(":user"=>$user);
 $res = $this->queryExec($sql,$datas);
 $result = !empty($res)? true : false;
 return $result;
}
	
	
	
public function ban($user)	{	
 if(!$this->userExist($user)){
  $result = "ERROR:USER_NOT_FOUND";
 }else{
  $this->queryExec("UPDATE $this->table SET Bani = 1 WHERE Pseudo_ID = ?");
  $result = "OK:BANNED";
 }
 return $result;
}	
	
		
// Fin de la class
}


NB: Si tu n'as pas d'AutoLoad pour tes class .. pense à inclure les deux class :
require_once "pdoFunc.class.php";
require_once "users.class.php";



Puis pour l'utiliser dans ton code :
 $oUser = new users();

 $arr_users = $oUser->GetUsers();
 print_r($arr_users);
0
Dalbator Messages postés 51 Date d'inscription mardi 9 juillet 2013 Statut Membre Dernière intervention 3 juin 2017
19 oct. 2016 à 12:56
Ok merci mais je comprend pas tout :/ je vais attendre d'apprendre le PHP en cour et commencer sur le site du zéro :).

Maintenant je vais essayer de joindre ca a mon programme en vb.net on vavoir ce que ca donne pour les fonctions qui fonctionnent même si j'ai déjà des erreur sur le json :'(

Je reviendrai vers toi si j'ai de nouvelles erreur
0