[RESOLU] Fatal error: Cannot use object of type stdClass as array

Eléphant du PHP | 71 Messages

19 déc. 2014, 18:45

Bonjour,

Tout d'abord, merci à ceux qui vont me lire en entier :)

J'en appelle aux experts car là je ne comprends pas d'où vient mon erreur...

Mon but est d'avoir, dans la méthode les_eleves() de la page_securisee.php une liste d'eleves. Je m'explique : On à une liste déroulante contenant le nom de chaque élève et quand on clique sur un nom, les infos concernant cet élève s'affichent.

Cette fonction servira dans modif_eleves() qui n'est pas encore faite, pour que l'on puisse update la bdd apres modification des infos de l'eleve (infos que l'on aura normallement via les_eleves().

Le soucis ? Une erreur que je n'arrive pas à résoudre peu importe la façon dont je m'y prend ! -> Fatal error: Cannot use object of type stdClass as array in C:\Workspace\.....\page_securisee.php on line 64.

Voici donc mes pages (toutes en php objet):

page_securisee.php :
<?php
class page_securisee extends contenu_page {
	private $connexion;
	
	public function __construct($p)
	 {
		parent::__construct($p);
		include_once('connexpdo.php');
		$this->connexion=connexpdo();
	 }
	 
	 public function connect() // vide
	 {
	 	 
	 }
    		  
     public function register() // vide
     {
    		  	
     }
     
     # GESTION DES ELEVES
     
     public function ajoute_eleve()	// OK
     {
     	// variables recuperées du formulaire 
     	$ecole=$_POST['ecole'];
     	$nom=$_POST['nom'];
     	$prenom=$_POST['prenom'];
     	$date=$_POST['datenaiss'];
     	$adresse=$_POST['adresse'];
     	$ville=$_POST['ville'];
     	$CP=$_POST['CP'];
     	$sex=$_POST['sex'];
     	$droit_image=$_POST['droit_image'];
     	$certif_chu=$_POST['certif_chu'];
     	$auto_parent=$_POST['auto_parent'];
     	
     	// requete
     	$requete = 'insert into eleve values(null,'.$ecole.',"'.$nom.'","'.$prenom.'","'.$date.'","'.$adresse.'","'.$ville.'",'.$CP.',"'.$sex.'","'.$droit_image.'","'.$certif_chu.'","'.$auto_parent.'")';
     	// echo $requete; // voir si la requete est bonne -> OK
     	$resultat=$this->connexion->query($requete);
     	echo "<script>alert('L\'eleve a bien ete enregistre.');</script>"; 
     	header('Location: index.php');
     	
     }
     
     public function les_eleves()
     {
     	
     	// requete d'affichage des eleves en fonction du nom
     	$requete='SELECT * FROM eleve;';
     	$result=$this->connexion->query($requete);
     	if (!$result)
     	{
     		echo 'lecture imposible';
     	}
     	else
     	{
     		$nb = $result->rowCount();
     		while ($lignes = $result->fetch(PDO::FETCH_OBJ))
     		{
     			echo"<h3>".$lignes['nom']."</h3>";
     			//echo '<option value="'.$ligne['nom'].'">'.$ligne['prenom'].'</option>';
     		}
     	}
     	$result->closeCursor();
     	$result = null;
     }
     
     public function modif_eleve()
     {
     	// A COMPLETER PLUS TARD
     }
     
     public function delete_eleve() // OK
     {
     	// variables recuperées du formulaire
     	$nom=$_POST['nom'];
     	$prenom=$_POST['prenom'];
     	$date=$_POST['datenaiss'];
     	 
     	// requete
     	$requete = 'delete from eleve where nom="'.$nom.'" and datenaiss="'.$date.'" and prenom="'.$prenom.'"';
     	// echo $requete; // voir si la requete est bonne -> OK
     	$resultat=$this->connexion->query($requete);
     	echo "<script>alert('L\'eleve a bien ete supprime.');</script>";
     	header('Location: index.php');
     	 
     }

     # GESTION DES ECOLES
     
     public function ajoute_ecole() // OK
     {
     	// variables recuperées du formulaire
     	$ecole=$_POST['ecole'];
     	$nom=$_POST['nom'];
     	$adresse=$_POST['adresse'];
     	$ville=$_POST['ville'];
     	$CP=$_POST['CP'];
     	$tel=$_POST['tel'];
     	$fax=$_POST['fax'];
     	$mail=$_POST['mail'];
     	$mdp=$_POST['mdp'];
     
     	// requete
     	$requete = 'insert into ecole values('.$ecole.',"'.$nom.'","'.$adresse.'","'.$ville.'",'.$CP.',"'.$tel.'","'.$fax.'","'.$mail.'","'.$mdp.'")';
     	// echo $requete; // voir si la requete est bonne -> OK
     	$resultat=$this->connexion->query($requete);
     	echo "<script>alert('L\'ecole a bien ete enregistree.');</script>";
     	header('Location: index.php');
     
     }
     
     public function delete_ecole() // OK
     {
     	// variables recuperées du formulaire
     	$nom=$_POST['nom'];
     	$mdp=$_POST['mdp'];
     	 
     	// requete
     	$requete = 'delete from ecole where nom="'.$nom.'" and mdp="'.$mdp.'"';
     	// echo $requete; // voir si la requete est bonne -> OK
     	$resultat=$this->connexion->query($requete);
     	echo "<script>alert('L\'ecole a bien ete supprimee.');</script>";
     	header('Location: index.php');
     	 
     }
		
     public function modif_ecole()	//
     {
     	// variables recuperées du formulaire
     
        
     }
}
index.php :
<?php // PAGE ACCEUIL
include_once('class/autoload.php');   // pour inclure nos classes

$site = new page_securisee('accueil');
$site->titre = "Accueil";
$site->corps ='	<h1> CE SERA LA PAGE D ACCUEIL </h1>
				<a href="ajouteleve.php">Ajouter des eleves</a> <br>
				<a href="suppreleve.php">Supprimer des eleves</a> <br>
				<a href="modifeleve.php">Modifier des eleves</a> <br>
				<a href="ajoutecole.php">Ajouter des ecoles</a> <br>
				<a href="supprecole.php">Supprimer des ecoles</a>
			  ';
$site->affiche();

?>
modifeleve.php
<?php
include_once('class/autoload.php');   // pour inclure nos classes
$site = new page_securisee('');
$site->titre = "INSCRIPTION Eleves";
$site->corps ="	Choisir eleve : ";
$site->les_eleves();
contenu_page.php :
<?php
class contenu_page {

	protected $titre;
	protected $style=array('');
	protected $javascript=array('');
	protected $corps;
	protected $page;
	private $connexion;
	private $i;

	public function __construct($p) {
		session_start();
		$this->page = $p;
		
	}
   
	
	
	/*************Gestion des setters *********************/
	
	public function __set($propriete, $valeur) {
		switch ($propriete) {
			case 'style' : {
				$this->style[count($this->style)+1] = $valeur;
				break;
			}
			case 'javascript' : {
				$this->javascript[count($this->javascript)+1] = $valeur;
				break;
			}
			case 'corps' : {
				$this->corps = $valeur;
				break;
			}
			case 'titre' : {
				$this->titre = $valeur;
				break;
			}
		}
	}
	
	/*************Gestion du titre *********************/
	
	private function affiche_titre() {
		echo $this->titre;
	}
	
	/*************Gestion des header *********************/
	
	protected function affiche_header() {
		?>
		 <div id="header"> 
		<h1><a href="index.php" id="logo">USEP49 <em> Maine Et Loire</em></a></h1>
		<nav id="nav">
		<ul>						
				<li>
					<a href="index.php">Accueil</a>
				</li>
				<li>
					<a href="http://usep49.fr/grr/month_all.php?area=1">Matériel</a>
				</li>
				<li>
					<a href="news.php">Actualités</a>
				</li>
				<li>
					<a href="about.php">A propos</a>
				</li>
				<li>
					<a href="contact.php">Contactez-nous</a>
				</li>
				<li>
					<a href="connexion.php">Connexion</a>
				</li>
			</ul>
			</nav>
			</div>
		<?php 
		}
			
		/*************Gestion des styles *********************/
		
		private function affiche_style() {
			foreach ($this->style as $s) {
				echo "<link rel='stylesheet' href='css/".$s.".css' />\n";
			}
		}
		
		/*************Gestion du javascript *********************/
		
		private function affiche_js() {
			foreach ($this->javascript as $js) {
				echo "<script type='text/javascript' src='js/".$js.".js'></script>";
			}
		}
		
		/******** Gestion du contenu  *******************/
		
		private function affiche_corps() {
			echo $this->corps;
			}
		/************** Gestion du Slider   ***************************/
		public function affiche_banner (){
			?>
			<section id="banner">
			<header>
			
			<a href="#" class="button">Learn More</a>
			</header>
			</section><?php 
}
		/************** Gestion des footers ***************************/
		private function affiche_footer() {
			?>
					<p>
						<b></b>
					</p>
			<?php
			}
			
		/*************Connexion *********************/
			
		protected function autorize_connexion() {
			echo '<form action="#" method="post" name="formulaire">';
			echo '<p>Votre nom : <input type="text" name="pseudo" /></p>';
			echo '<p><input type="submit" value="Se connecter"></p>';
			echo '</form>';
			}
			
			
		/************* Récupération de la connexion *********************/
			
		public function recup_connexion ()
		{
			if (isset($_POST['identifiant']))
			{
				if (!empty($_POST['identifiant']))
				{
					$_SESSION['identifiant']=$_POST['identifiant'];
				}
			}
		}
		
		/************* Déconnexion *********************/
		
		
		 protected function autorize_deconnexion() {
			echo '<form action="#" method="post" name="formulaire">';
			echo '<input type="hidden" name="deco" />';
			echo '<p><input type="submit" value="Déconnexion"></p>';
			echo '</form>';
		}
		
		
		/************* Récupération de la déconnexion *********************/
		
		public function recup_deconnexion () 
		{
				$_SESSION=array();
				session_destroy();
		}
			
		/******************** Fonction permettant l'affichage de la page **************/
		public function affiche() {
			$this->recup_connexion(); 
		
			?>
					<!DOCTYPE html>
					<html lang='fr'>
						<head>
							<title>
								<?php $this->affiche_titre(); ?>
							</title>
							<meta charset="utf-8" />
							<?php 
								$this->affiche_style(); 
								$this->affiche_js();
							?>
						</head>
						<body>
							<div id="header">
							
									<?php 
									$this->affiche_header();
									if (isset($_SESSION['identifiant']))
									{
										
									}
										else
										{
										session_unset();		
										}
									
									?>
								
							</div>
									<section class="wrapper style1">
											<div class="container">
												<article> 
													<?php $this->affiche_corps();?>
												</article>
											</div>
									</section>
									<div id="footer">
								
									<?php $this->affiche_footer();?>
								
							</div>
						</body>			
					</html>
				<?php
			}
}
Merci de m'aider à résoudre ce problème :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 déc. 2014, 00:03

Bonsoir,

En fait, tu as toutes les informations dans le message d'erreur
Fatal error: Cannot use object of type stdClass as array in C:\Workspace\.....\page_securisee.php on line 64.
A la ligne 64 du fichier page_securisee.php, tu essayes d'utiliser un objet "stdClass" comme un tableau.

La ligne en question :
echo"<h3>".$lignes['nom']."</h3>";
$ligne est chargé par cette ligne là (ligne 62) :
while ($lignes = $result->fetch(PDO::FETCH_OBJ))


Ici, tu indiques explicitement à PDO qu'il doit te retourner chaque résultat sous forme d'une instance de la classe stdClass

A partir de là, 2 solutions :

1/ Utiliser correctement l'instance de stdClass
Remplacer
echo"<h3>".$lignes['nom']."</h3>";
par
echo"<h3>".$lignes->nom."</h3>";
2/ Demander à PDO de te retourner chaque résultat sous forme d'un tableau
Remplacer
while ($lignes = $result->fetch(PDO::FETCH_OBJ))
par
while ($lignes = $result->fetch(PDO::FETCH_ASSOC))
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 71 Messages

20 déc. 2014, 03:32

Bonsoir,

Tout d'abord merci pour ta réponse :)
Après quelques heures de recherche et réflexion de plus, j'avais réussi à faire ce que je voulais (code ci-dessous)

page_securisée.php : (ce qui a changé ? -> les_eleves() n'existe plus et modif_ecole() est finie, enfin presque ^^' )
<?php
class page_securisee extends page_base {
 private $connexion;
 
 public function __construct($p)
  {
  parent::__construct($p);
  include_once('connexpdo.php');
  $this->connexion=connexpdo();
  }
  
  public function connect() // vide
  {
  	// Vérification des identifiants
  	$req = $bdd->prepare('SELECT id FROM ecole WHERE nom = :nom AND mdp = :mdp');
  	$req->execute(array(
  			'nom' => $nom,
  			'mdp' => $mdpe));
  	$resultat = $req->fetch();
  	if (!$resultat)
  	{
  		echo 'Mauvais identifiant ou mot de passe !';
  	}
  	else
  	{
  		session_start();
  		$_SESSION['id'] = $resultat['id'];
  		$_SESSION['nom'] = $nom;
  		echo 'Vous êtes connecté !';
  	}
  }
        
     public function register() // vide
     {
     	
     	
     }
     
     # GESTION DES ELEVES
     
     public function ajoute_eleve() // OK
     {
      // variables recuperées du formulaire 
      $ecole=$_POST['ecole'];
      $nom=$_POST['nom'];
      $prenom=$_POST['prenom'];
      $date=$_POST['datenaiss'];
      $adresse=$_POST['adresse'];
      $ville=$_POST['ville'];
      $CP=$_POST['CP'];
      $sex=$_POST['sex'];
      $droit_image=$_POST['droit_image'];
      $certif_chu=$_POST['certif_chu'];
      $auto_parent=$_POST['auto_parent'];
      
      // requete
      $requete = 'insert into eleve values(null,'.$ecole.',"'.$nom.'","'.$prenom.'","'.$date.'","'.$adresse.'","'.$ville.'",'.$CP.',"'.$sex.'","'.$droit_image.'","'.$certif_chu.'","'.$auto_parent.'")';
      // echo $requete; // voir si la requete est bonne -> OK
      $resultat=$this->connexion->query($requete);
      echo "<script>alert('L\'eleve a bien ete enregistre.');</script>"; 
      header('Location: index.php');
      
     }
     
     public function les_eleves()
     {
      
      // requete d'affichage des eleves en fonction du nom
      $requete='SELECT * FROM eleve;';
      $result=$this->connexion->query($requete);
      if (!$result)
      {
       echo 'lecture imposible';
      }
      else
      {
       $nb = $result->rowCount();
       while ($lignes = $result->fetch(PDO::FETCH_OBJ))
       {
        echo"<h3>".$lignes['nom']."</h3>";
        //echo '<option value="'.$ligne['nom'].'">'.$ligne['prenom'].'</option>';
       }
      }
      $result->closeCursor();
      $result = null;
     }
     
     public function modif_eleve()
     {
      // A COMPLETER PLUS TARD
     }
     
     public function delete_eleve() // OK
     {
      // variables recuperées du formulaire
      $nom=$_POST['nom'];
      $prenom=$_POST['prenom'];
      $date=$_POST['datenaiss'];
       
      // requete
      $requete = 'delete from eleve where nom="'.$nom.'" and datenaiss="'.$date.'" and prenom="'.$prenom.'"';
      // echo $requete; // voir si la requete est bonne -> OK
      $resultat=$this->connexion->query($requete);
      echo "<script>alert('L\'eleve a bien ete supprime.');</script>";
      header('Location: index.php');
       
     }

     # GESTION DES ECOLES
     
     public function ajoute_ecole() // OK
     {
     	// variables recuperées du formulaire
     	$ecole=$_POST['ecole'];
     	$nom=$_POST['nom'];
     	$adresse=$_POST['adresse'];
     	$ville=$_POST['ville'];
     	$CP=$_POST['CP'];
     	$tel=$_POST['tel'];
     	$fax=$_POST['fax'];
     	$mail=$_POST['mail'];
     	$mdp=$_POST['mdp'];
     	 
     	// requete
     	$requete = 'insert into ecole values('.$ecole.',"'.$nom.'","'.$adresse.'","'.$ville.'",'.$CP.',"'.$tel.'","'.$fax.'","'.$mail.'","'.$mdp.'")';
     	// echo $requete; // voir si la requete est bonne -> OK
     	$resultat=$this->connexion->query($requete);
     	echo "<script>alert('Vous êtes bien enregistré.');</script>";
     	header('Location: index.php');
     }
     
     public function delete_ecole() // OK
     {
      // variables recuperées du formulaire
      $nom=$_POST['nom'];
      $mdp=$_POST['mdp'];
       
      // requete
      $requete = 'delete from ecole where nom="'.$nom.'" and mdp="'.$mdp.'"';	// prepare la requete
      // echo $requete; // voir si la requete est bonne -> OK
      $resultat=$this->connexion->query($requete);								// execute la requete sur la bdd
      echo "<script>alert('L\'ecole a bien ete supprimee.');</script>";
      header('Location: index.php');
       
     }
  
     public function modif_ecole() //
     {
     	# Liste deroulante
     	$req=$this->connexion->query("SELECT * FROM ecole ");
     	echo '<form method="POST" action="#">';
     	echo '<select name="ecole">'."\n";
     	while($eco=$req->fetch()) //Boucle sur la requête [0] -> =id & [1] -> nom
     	{
     		echo '<option value="'.$eco[0].'">'.$eco[1].'</option>'."\n";
     	}
     	echo '</select>'."\n";
     	echo '<input type="submit" name="" value="Afficher"><br><br>';
     	
     	# Formulaire via liste
     	if(!empty($_POST['ecole']))
     	{
     	// requete
     	$req_2 =$this->connexion->prepare('select * from ecole where id=:id;');
     	$req_2->bindValue(':id',$_POST['ecole'], PDO::PARAM_STR);
     	$req_2->execute();
     	$ligne=$req_2->fetch();
     	
     	// affichage du formulaire
     		echo '<form action="#" method="post" class="message"name="formulaire2"> <br>';
     		echo 'Numero ecole : <input type="text" name="numecole" id="numecole" value="'.$ligne[0].'"readonly/><br>';
     		echo 'Nom ecole : <input type="text" name="newnom" id="newnom" value="'.$ligne[1].'"/> <br>';
     		echo 'Adresse : <input type="text" name="newadresse" id="newadresse" value="'.$ligne[2].'"/> <br>';
     		echo 'Ville : <input type="text" name="newville" id="newville" value="'.$ligne[3].'"/> <br>';
     		echo 'Code Postal : <input type="text" name="newCP" id="newCP" value="'.$ligne[4].'"/> <br>';
     		echo 'Tel ecole : <input type="text" name="newtel" id="newtel" value="'.$ligne[5].'"/>	<br>';
     		echo 'Fax ecole : <input type="text" name="newfax" id="newfax"value="'.$ligne[6].'"/> <br>';
     		echo 'Mail  : <input type="text" name="newmail" id="newmail" value="'.$ligne[7].'"/> <br>';
     		echo 'Mot de passe ecole  : <input type="password" name="newmdp" id="newmdp" value="'.$ligne[8].'" readonly/> <br>';
     		echo '<input type="submit" value="Envoyer"/>';
     	    echo '</form><br>';
     	}
     	
      # Faire la modification SI les champs sont non nuls
      if (!empty($_POST['numecole'] && $_POST['newnom'] && $_POST['newadresse'] && $_POST['newville'] && $_POST['newCP'] && $_POST['newtel'] && $_POST['newfax']&& $_POST['newmail'] && $_POST['newmdp']))
      {
      	// variables recuperées du formulaire
     	$ecole=$_POST['numecole'];
     	$nom=$_POST['newnom'];
     	$adresse=$_POST['newadresse'];
     	$ville=$_POST['newville'];
     	$CP=$_POST['newCP'];
     	$tel=$_POST['newtel'];
     	$fax=$_POST['newfax'];
     	$mail=$_POST['newmail'];
     	$mdp=$_POST['newmdp'];
     	
     	// requete ->OK
     	$requete ='UPDATE ecole SET id='.$ecole.',nom="'.$nom.'",adresse="'.$adresse.'",ville="'.$ville.'",codepostal='.$CP.',tel="'.$tel.'",fax="'.$fax.'",mail="'.$mail.'",mdp="'.$mdp.'" WHERE nom="'.$nom.'";';
     	//echo $requete; // voir si la requete est bonne -> OK
     	$resultat=$this->connexion->query($requete);
     	//header('Location: index.php');
      }
     }
     
}
J'ai donc , via la fonction modif_ecole() pu afficher une liste déroulante qui contient le nom des écoles enregistrées dans la BDD et charger les infos de l'ecole une fois l'appui sur le bouton Afficher (voir image). De plus, on peux modifier les informations de chaque école en cliquant sur le bouton Envoyer (faudrait que je le rename d'ailleurs :lol: )

MAIS il reste un problème ! Je ne sais pas pourquoi mais quand les infos sur l'école sont chargées, je peux tout modifier.... SAUF LE NOM DE L'ECOLE !!!! Je ne sais pas si ça à un rapport avec le fait qu'il soit placé dans la liste déroulante (ça m’étonnerais mais bon, on sait jamais :P )

Voila l'image de ce que j'ai obtenu :
1_ Lors du 1er chargement de la page il me met cette erreur
2_Apres le choix de l'ecole, les infos sont chargées et modifiables (sauf l'id et le mot de passe qui reste caché) MAIS le nom ne VEUX PAS se modifier x)
pb.png
Bonne nuit et merci pour votre aide :)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

20 déc. 2014, 22:38

salut,
if (!empty($_POST['numecole'] && $_POST['newnom'] && $_POST['newadresse'] && $_POST['newville'] && $_POST['newCP'] && $_POST['newtel'] && $_POST['newfax']&& $_POST['newmail'] && $_POST['newmdp'])){}
empty ne s'utilise pas ainsi c'est un par variable.
Tel que tu l'utilise lorsque tu affiche le formulaire tu passe sur le test et vu le problème de l'utilisation de la fonction empty tu as un message d'erreur (car avant la soumission $_POST est vide.

donc en gros
      if (!empty($_POST['numecole']) && !empty($_POST['newnom']) && !empty($_POST['newadresse']) && !empty($_POST['newville']) && !empty($_POST['newCP']) && !empty($_POST['newtel']) && !empty($_POST['newfax'])&& !empty($_POST['newmail']) && !empty($_POST['newmdp'])))

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 71 Messages

21 déc. 2014, 00:27

      if (!empty($_POST['numecole']) && !empty($_POST['newnom']) && !empty($_POST['newadresse']) && !empty($_POST['newville']) && !empty($_POST['newCP']) && !empty($_POST['newtel']) && !empty($_POST['newfax'])&& !empty($_POST['newmail']) && !empty($_POST['newmdp'])))
Merci ! Grâce à toi je n'ai plus l'erreur qui persiste :D et j'ai réussi à régler le problème (le fait que le nom ne se changeais pas) c’était du à ma requête :
$requete ='UPDATE ecole SET id='.$ecole.',nom="'.$nom.'",adresse="'.$adresse.'",ville="'.$ville.'",codepostal='.$CP.',tel="'.$tel.'",fax="'.$fax.'",mail="'.$mail.'",mdp="'.$mdp.'" WHERE nom="'.$nom.'";';
Elle changeais les infos en fonction du nom !

Qui est finalement devenue :
$requete ='UPDATE ecole SET id='.$ecole.',nom="'.$nom.'",adresse="'.$adresse.'",ville="'.$ville.'",codepostal='.$CP.',tel="'.$tel.'",fax="'.$fax.'",mail="'.$mail.'",mdp="'.$mdp.'" WHERE id='.$ecole.';';
Par contre j'aurais un dernier service à vous demander (oui encore un je sais x) ) mais celui-ci ne crée pas d'erreur ou autres. Le "soucis" c'est que pour que les infos soient modifiées maintenant, il faut que je clique 2 fois sur le bouton "Envoyer", quand je clique une seule fois il ne modifie rien.

Eléphant du PHP | 71 Messages

21 déc. 2014, 20:19

Problème résolu :)