Notice: Trying to access array offset on value of type bool in

Résolu
david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021
- Modifié le 22 sept. 2021 à 11:53
jordane45
Messages postés
36047
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 août 2022
- 28 sept. 2021 à 11:42
Bonjour,

Avec la nouvelle version de php mon application de séminaire en ligne rencontre des erreurs.

Notice: Trying to access array offset on value of type bool in /home/apache/wseminaire/www/model/ModelAdmin.php on line 23

Notice: Trying to access array offset on value of type bool in /home/apache/wseminaire/www/model/ModelAdmin.php on line 29

Notice: Trying to access array offset on value of type bool in /home/apache/wseminaire/www/model/ModelAdmin.php on line 30

<?php
include_once('src/db/connect.php');
class Admin {

    private $connect;

    public function __construct(){
// Récupération de la connexion à la bdd
            $cnt = new connect;
            $this->connect = $cnt->setConnection();
        }

    public function calendar(){
// Récupération des données événement pour le calendrier
        $req = $this->connect->query('SELECT id, name_ev, date_ev FROM event ORDER BY ID');
        return $req;
    }

    public function nextEv(){
// Récupération des données du prochain événement
       $req = $this->connect->query('SELECT id, name_ev, date_ev FROM event WHERE date_ev > CURRENT_DATE ORDER BY date_ev ASC LIMIT 1');
       $data = $req->fetch();
       $id = $data['id'];
       $req2 = $this->connect->prepare("SELECT COUNT(id) as nbr_participant FROM participant WHERE id_event = :id AND particip = 'oui'");
       $req2->bindParam(':id', $id, PDO::PARAM_INT);
       $req2->execute();
       $data2 = $req2->fetch();
       $particip = $data2['nbr_participant'];
       $nextEv = $data['name_ev'];
       $dateEv = $data['date_ev'];

       $res = ['dateEv' => $dateEv, 'nextEv' => $nextEv, 'particip' => $particip];
       return $res;
    
   
    }


Pouvez-vous m'aider ?
Je vous en remercie par avance
A voir également:

6 réponses

Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
543
22 sept. 2021 à 12:48
Bonjour,

A la ligne 22, la méthode fetch() retourne à priori la valeur FALSE (booléen) : l'exécution de la requête doit déclencher une erreur sql (penser à activer l'affichage des erreurs sql).
La ligne suivante retourne donc une erreur puisqu'on essaye d'accéder à un élément d'un tableau alors que le tableau est un booléen ($data['id']).
Même chose pour les autres messages d'erreurs.

Commence par activer et traiter les éventuelles erreurs sql pour comprendre d'où vient le problème avec la requête :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

Bonne journée,
0
david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021

22 sept. 2021 à 13:46
C'est pas possible de me faire un code je n'y arrive pas merci
0
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
543 > david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021

22 sept. 2021 à 14:07
Il serait mieux de montrer ce que tu as essayé pour t'aider à progresser.

L'activation de l'affichage des erreurs se fait au moment de la connexion au serveur sql mais nous n'avons pas accès à ce code.
Quel est le code de la classe Connect ? (masquer les infos confidentielles comme le mot de passe si il est indiqué)
0
david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021

22 sept. 2021 à 14:20

ini_set('display_errors', '1');
ini_set('error_reporting', E_ALL);

class Connect {
		const SERVERNAME = "xxxxxx";
		const DBNAME = "xxxxxx";
		const DBUSER = "xxxxxxxx";
		const DBPASS = "xxxxxxxxxxxxxx";

		public function setConnection(){
			try
		  	{
				$bdd = new PDO('mysql:host='.self::SERVERNAME.';dbname='.self::DBNAME.';charset=utf8',self::DBUSER,self::DBPASS);
				$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
				
				}

			catch (Exception $e)
				{
			     	die('Erreur : ' . $e->getMessage());
				}

			return $bdd;
		}
}
?>



0
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
543
22 sept. 2021 à 15:05
A priori le mode exception est bien activé à la connexion (ERRMODE_EXCEPTION).

Une solution possible pour afficher l'exception en cas d'erreur :
public function nextEv(){
    try {
        // Récupération des données du prochain événement
       $req = $this->connect->query('SELECT id, name_ev, date_ev FROM event WHERE date_ev > CURRENT_DATE ORDER BY date_ev ASC LIMIT 1');
       $data = $req->fetch();
       $id = $data['id'];
       $req2 = $this->connect->prepare("SELECT COUNT(id) as nbr_participant FROM participant WHERE id_event = :id AND particip = 'oui'");
       $req2->bindParam(':id', $id, PDO::PARAM_INT);
       $req2->execute();
       $data2 = $req2->fetch();
       $particip = $data2['nbr_participant'];
       $nextEv = $data['name_ev'];
       $dateEv = $data['date_ev'];

       $res = ['dateEv' => $dateEv, 'nextEv' => $nextEv, 'particip' => $particip];
       
       return $res;
    } catch (Exception $e){
        // en cas d'erreur :
        echo 'Erreur SQL : ' . $e->getMessage();
        return false;
    }
}


Je retourne également la valeur false en cas d'erreur, à voir si cela convient avec le code qui utilise la fonction nextEv() : on pourrait éventuellement retourner un tableau vide à la place de false, ou remonter l'exception (via throw) afin de l'intercepter dans le code qui utilise la fonction nextEv() (via try/catch).
0
jordane45
Messages postés
36047
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 août 2022
4 275
Modifié le 22 sept. 2021 à 16:04
Bonjour,

Avant de partir sur le fait que le souci vient éventuellement du code PHP ... as tu testé ta requête DIRECTEMENT dans ta bdd ( via l'onglet requête de phpmyadmin par exemple ) ?
J'en doute, car, il me semble, que CURRENT_DATE est une fonction et doit donc être appelée avec des parenthèses
CURRENT_DATE()


Et pour en revenir à ton code php, même lorsque tu n'auras plus d'erreur dans tes requêtes SQL, tu auras toujours la même erreur lorsqu'aucun résultat ne sera retourné par ta requête ..

Il faudrait donc récupérer "proprement" la variable AVANT de l'utiliser
donc
 $id = !empty($data['id']) ? $data['id'] : NULL ;


et pour la suite du code, t'assurer que ta variable $id est bien remplie
if ($id) {
      $req2 = $this->connect->prepare("SELECT COUNT(id) as nbr_participant FROM participant WHERE id_event = :id AND particip = 'oui'");
       $req2->bindParam(':id', $id, PDO::PARAM_INT);
       $req2->execute();
 
     //... la suite du code

} // fin du if



.
Cordialement,
Jordane
0
david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021

Modifié le 22 sept. 2021 à 16:03
 public function nextEv(){
// Récupération des données du prochain événement
       $req = $this->connect->query('SELECT id, name_ev, date_ev FROM event WHERE date_ev > CURRENT_DATE ORDER BY date_ev ASC LIMIT 1');
       $data = $req->fetch();
       $id = !empty($data['id']) ? $data['id']  NULL ;
       if ($id) {
      $req2 = $this->connect->prepare("SELECT COUNT(id) as nbr_participant FROM participant WHERE id_event = :id AND particip = 'oui'");
       $req2->bindParam(':id', $id, PDO::PARAM_INT);
       $req2->execute();
       $data2 = $req2->fetch();
       $particip = $data2['nbr_participant'];
       $nextEv = $data['name_ev'];
       $dateEv = $data['date_ev'];

       $res = ['dateEv' => $dateEv, 'nextEv' => $nextEv, 'particip' => $particip];
       return $res;
    
   
    }
 } // fin du if


Cela crée une erreurParse error: syntax error, unexpected 'NULL' (T_STRING) in /home/apache/wseminaire/www/model/ModelAdmin.php on line 23


EDIT : Correction des balises de code ( ajout du LANGAGE pour avoir la coloration syntaxique et la numérotation des lignes !! ) merci d'y penser à l'avenir !!
0
jordane45
Messages postés
36047
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 août 2022
4 275 > david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021

22 sept. 2021 à 16:05
Il manque les deux points avant le null
       $id = !empty($data['id']) ? $data['id'] : NULL ;    


Mais je constate que tu n'as lu que la moitié de mon message ..... dans lequel je disais AVANT de penser au code php... il faut corriger la requête SQL ( et la tester en DIRECT via phpmyadmin )
Tu as laissé l'erreur sur le CURRENT_DATE
0
david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021
> jordane45
Messages postés
36047
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 août 2022

28 sept. 2021 à 09:41
Cela marche merci
0
david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021

22 sept. 2021 à 15:14
Rien ne s'affiche avec votre code à part les mêmes erreurs qu'avant :


Notice: Trying to access array offset on value of type bool in /home/apache/wseminaire/www/model/ModelAdmin.php on line 24

Notice: Trying to access array offset on value of type bool in /home/apache/wseminaire/www/model/ModelAdmin.php on line 30

Notice: Trying to access array offset on value of type bool in /home/apache/wseminaire/www/model/ModelAdmin.php on line 31

Il n'y a pas d'erreur sql alors ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021

28 sept. 2021 à 09:41
Ok cela marche merci jordane 45
0
david76-21
Messages postés
12
Date d'inscription
mercredi 22 septembre 2021
Statut
Membre
Dernière intervention
28 septembre 2021

28 sept. 2021 à 09:43
J'ai un autre problème sur une autre page de mon programme j'essaye la même méthode mais cela ne marche pas :

Notice: Trying to access array offset on value of type bool in /home/apache/wseminaire/www/model/ModelParticipant.php on line 51

<?php
include_once('src/db/connect.php');
class ModelParticipant {

	private $connect;

	public function __construct(){
// Récupération de la connexion à la bdd
			$cnt = new connect;
			$this->connect = $cnt->setConnection();
		}

	public function read(){
// Récupération des données événements
		$info = array();
		$nbr = array();
		$req2 = $this->connect->query('SELECT id, name_ev, date_ev FROM event ORDER BY date_ev DESC');
		$res = $this->connect->query('SELECT id, name_ev, date_ev FROM event ORDER BY date_ev DESC');
		while ($data2 = $req2->fetch()) {
			$id = $data2['id'];
// Réucpèrer le nombre de participants
            $req3 = $this->connect->prepare('SELECT COUNT(id) AS nbr FROM participant WHERE id_event=:value');
            $req3->bindParam(':value', $id, PDO::PARAM_INT);
            $req3->execute();

            array_push($nbr, $req3->fetch());

			$req3->closeCursor();
		}	
		$return = array("res" => $res, "info" => $info, "nbr" => $nbr);
		return $return;
	}

	public function readDetail($id) {
			$req = $this->connect->prepare('SELECT id, id_event, name, lastname, fonction, tel, mail, particip, dej, din, ateliers FROM participant WHERE id_event=:value');
			$req->bindParam(':value', $id, PDO::PARAM_INT);
			$req->execute();
			$req1 = $this->connect->prepare('SELECT ateliers FROM participant WHERE id_event=:value');
			$req1->bindParam(':value', $id, PDO::PARAM_INT);
			$req1->execute();
			$atelier = array();
			$i = 0;
			while ($data = $req1->fetch()){
					$at = explode(',', $data['ateliers']);
					$atelier[$i] = "";
					foreach ($at as $key) {
							$req2 = $this->connect->prepare('SELECT name_atelier FROM atelier where id=:value');
							$req2->bindParam(':value', $key, PDO::PARAM_INT);
							$req2->execute();
							$nameAt = $req2->fetch();
							$atelier[$i] .= $nameAt['name_atelier']."<br />";
					}
			$i++;
			}
			$res = $req;
			return array("1" => $res, "2" => $atelier);
	}
0
jordane45
Messages postés
36047
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
12 août 2022
4 275
28 sept. 2021 à 11:42
Tu dis avoir essayé la même méthode ... mais je ne le vois pas dans le code que tu nous montres ....

En plus, découper ton code en petites fonctions serait sûrement plus facile pour ensuite le maintenir et le debugeur.
En gros
public function getParticipantsByIdEvent($id_event) {
    try {
      $sql = 'SELECT id, id_event, name, lastname, fonction, tel, mail, particip, dej, din, ateliers FROM participant WHERE id_event=:value';
      $req = $this->connect->prepare($sql);
      $req->bindParam(':value', $id_event, PDO::PARAM_INT);
      $req->execute();
      return $req->fetchAll(); // retourne le resultat sous forme d'array
    } catch (Exception $ex) {
      echo "Erreur :" . $e->getMessage();
      exit;
    }
  }

  public function getAtelierById($id_atelier) {
    try {
      $req = $this->connect->prepare('SELECT name_atelier FROM atelier where id=:value');
      $req->bindParam(':value', $id_atelier, PDO::PARAM_INT);
      $req->execute();
      return $req->fetchColumn(); // retourne la première colonne d'une ligne de resultat sous forme d'array
    } catch (Exception $e) {
      echo "Erreur :" . $e->getMessage();
      exit;
    }
  }

  public function readDetail($id) {

    $participants = $this->getParticipantsByIdEvent($id);
    
    $atelier = array();
    
    if(!empty($participants)){
      foreach($participants as $K=>$V){
        $atelier[$K] = "";
        $at = explode(',', $V['ateliers']);
        if(!empty($at)){
          foreach ($at as $id_atelier){
            $atelier[$K] .= $this->getAtelierById($id_atelier);
          }
        }
      }
    }
    
    return array("1" => $participants, "2" => $atelier);
  }


A noter que.. si au lieu de stocker les ateliers de tes participants dans un champ tu avais créé une table spécifique
tbl_ateliers_participants ( id_participant, id_atelier )
tu aurais, via une simple jointure, pu tout obtenir avec une seule requête SQL au lieu d'exécuter des requêtes dans des boucles ( ce qui est fortement déconseillé ...et source de lenteurs dans les programmes )

Encore faut-il que tu saches ce qu'est une jointure .. et comment concevoir correctement une base de données relationnelle...


PS: A l'avenir ... pour toute nouvelle question .. merci de créer une discussion spécifique sur le forum.
Celle ci étant considérée comme déjà résolue et fermée.
0