bonjour, je suis débutant dans PHP, mais je cherche beaucoup sur internet.
ce matin j'ai voulu mettre montre programme en POO, pour avoir un code plus efficace, mais maintenant çà ne marche plus.
pouvez-vous me dire pourquoi ?
j'ai un programme qui est sur la base du MVC
dans ma view j'ai le programme suivant :

<?php $msg->listerMessage();?
<tr>
<td class="element_tableau"><?= $msg->references ?></td>

dans mon model, j'ai le code suivant :

public function listerMessage(){
$tableau = array();
require ("../models/params.php");
$db_base = "adminpccsono";
$db_table = "message";
$db_conn = new PDO ( "mysql:host=" . $db_server . ";port=" . $db_port . ";dbname=" . $db_base, $db_user, $db_password );
$db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db_conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
$listMessage = $db_conn -> prepare("SELECT * from ". $db_table );
$listMessage -> execute ();
$listok = $listMessage->fetchAll();
foreach ($listok as $list =>$v){
$this->$list = $v;
}

à la fin de mon code, j'ai mis ce petit code pour instancier mon model
$msg = new messageModel();

je reçois le message suivant que je ne comprends pas :
Fatal Error : Uncaught Error. Cannot access private property messageModel//$references in listerMesage.php:58

Pouvez-vous me dire ce que j'ai oublié ?
merci

14 réponses


Bonjour.
Pourrais-tu nous montrer le code complet de ta classe messageModel ?
Ensuite, à quoi te servent :

  • $tableau = array(); car tu ne sembles pas utiliser la variable par la suite dans ta fonction.
  • require ("../models/params.php");, je ne vois rien qui semble dépendre de ce fichier, étant donné que même la connexion à la base de données tu la fais directement dans ta fonction.

Ensuite, j'ai du mal à comprendre ce que tu fais avec :

foreach ($listok as $list =>$v){
    $this->$list = $v;
}

Surtout ta fonction ne retourne rien, je vois donc mal comment tu pourrais lister des messages avec ta fonction.

raoul
Auteur

Ok, je vais vous donner le code qui fonctionne quand je mets tous dans la même page

<?php
//connection bdd
$bdd = new PDO('mysql:host=127.0.0.1;dbname=adminpccsono', 'root', 'root' );

//lister tous les messages
$listMessage = $bdd -> prepare("SELECT * from message");
$listMessage -> execute ();
$listok = $listMessage->fetchAll();

//lister les années
$listAnnee = $bdd -> prepare("SELECT DISTINCT LEFT (`references`, 4) from message");
$listAnnee -> execute ();
$listAnneeok = $listAnnee->fetchAll();
?>

<?php include ('header.php') ?>
<?php include ('header_nav.php') ?>

        <!-- FIN HEADER -->
<!-- -----------------------------DEBUT DU TABLEAU ------------------------------------------ -->
<div>
        <div class="page-header">
        <h2  class="cgo-title_h2">LISTE DES MESSAGES</h2>
            <td align="right">
             <select name="">
                 <option value="">Sélectionner année</option>
                 <option value="1993">1993</option>
                 <option value="1994">1994</option>
             </select><br>

            </td>
      </div>
              <div class="tableau">
                 <table id="example" class="table table-striped table-bordered table-condensed">
                    <thead>
                      <tr>
                            <th class="titre_tableau">Référence</th>
                                      <th class="titre_tableau">Heure</th>
                                      <th class="titre_tableau">Titre des messages</th>
                                      <th class="titre_tableau">Orateurs</th>
                                      <th class="titre_tableau">Sources</th>
                                      <th class="titre_tableau">Thèmes</th>
                                      <th class="titre_tableau">Numériser</th>
                                      <th class="titre_tableau">Mastériser</th>
                                      <th class="titre_tableau">MP3</th>
                                      <th class="titre_tableau">Durée Message</th>
                                      <th class="titre_tableau">Monteur</th>
                                            <th class="titre_tableau">Date Traitement</th>
                                            <th class="titre_tableau">actions</th>

                      </tr>
                    </thead>
                            <tfoot>
                                <tr>
                            <th class="titre_tableau">Référence</th>
                                      <th class="titre_tableau">Heure</th>
                                      <th class="titre_tableau">Titre des messages</th>
                                      <th class="titre_tableau">Orateurs</th>
                                      <th class="titre_tableau">Sources</th>
                                      <th class="titre_tableau">Thèmes</th>
                                      <th class="titre_tableau">Numériser</th>
                                      <th class="titre_tableau">Mastériser</th>
                                      <th class="titre_tableau">MP3</th>
                                      <th class="titre_tableau">Durée Message</th>
                                      <th class="titre_tableau">Monteur</th>
                                            <th class="titre_tableau">date traitement</th>
                      </tr>
                            </tfoot>
                    <tbody>
                                    <?php foreach ($listok as $list) {?>
                      <tr>
                        <td class="element_tableau"><?= $list['references'] ?></td>
                        <td class="element_tableau"><?= $list ['heure'] ?></td>
                        <td class="element_tableau"><?= $list['titres'] ?></td>
                        <td class="element_tableau"><?= $list['orateurs'] ?></td>
                                <td class="element_tableau"><?= $list['sources'] ?></td>
                                <td class="element_tableau"><?= $list['themes'] ?></td>
                                    <td class="element_tableau"><?= $list['numeriser'] ?></td>
                                    <td class="element_tableau"><?= $list['masteriser'] ?></td>
                                    <td class="element_tableau"><?= $list['mp3'] ?></td>
                                    <td class="element_tableau"><?= ($list['duree']) ?></td>
                                    <td class="element_tableau"><?= $list['monteur'] ?></td>
                                <td class="element_tableau"><?= $list['datetraitement'] ?></td>
                                <td  align="center" ><a href="modifierMessage.php" class="btn btn-danger btn-xs" data-toggle="tooltip" data-placement="bottom" title="Modifier" ><span class="glyphicon glyphicon-edit"></span></a>&nbsp;&nbsp;
                                        <a href="supprimerMesage.php"class="btn btn-danger btn-xs" data-toggle="tooltip" data-placement="bottom" title="Supprimer"><span class="glyphicon glyphicon-trash"></span></a></td>
                      </tr>
                                <?php } ?>
                    </tbody>
                  </table>
            </div>

            <!-- indicateur Statistiques  -->
            <div class="col-sm-5 col-md-5 col-lg-5">
                <div class="tabstats">
                    <table class="table table-striped table-bordered table-condensed">
                        <tbody>
                            <tr>
                                <td>nbre message à masteriser</td>
                                <td>nbre message à mettre en mp3</td>
                            </tr>
                        </tbody>
                    </table>

                </div>
            </div>
    </div>

<?php include ('footer.php') ?>

<script>
$(document).ready(function() {
    $('#example').DataTable({
        "lengthMenu": [[10, 50, -1], [20, 50, "All"]],
        "order": [[ 1, "asc" ]],
        "scrollCollapse": true,
        "pagingType": "full_numbers"
      });
} );
</script>
</html>

maintenant que je veux faire propre, j'ai des difficultés :
voici le code de messageModel :

<?php
class messageModel{
  public function listerMessage(){
    $tableau = array();
    require ("../models/params.php");
    $db_base = "adminpccsono";
    $db_table = "message";
    $db_conn = new PDO ( "mysql:host=" . $db_server . ";port=" . $db_port . ";dbname=" . $db_base, $db_user, $db_password );
    $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db_conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    $listMessage = $db_conn -> prepare("SELECT * from ". $db_table );
    $listMessage -> execute ();
    $listok = $listMessage->fetchAll();
    foreach ($listok as $list =>$v){
      $this->$list = $v;
    }
  }

  public function modifierMessage($db_base, $id){
    require "../models/params.php";
        $db_table = "message";
        $db_conn = new PDO ( "mysql:host=" . $db_server . ";port=" . $db_port . ";dbname=" . $db_base, $db_user, $db_password );
    $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db_conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    $req_sql = "UPDATE" . $db_tabe . "SET 'references'='" .$message->getReference () . "',
                                     'heure'='" . $message->getHeure () . "',
                                      'titres'='" .$message->getTitre () . "',
                                      'orateur'='" .$message->getOrateur () ."',
                                      'source'='" .$message->getSource () ."',
                                      'theme'='" . $message->getTheme () . "',
                                      'date_traitement'='" . $message->getDatetraitement () ."',
                                      'monteur'='" . $message->getMonteur () ."',
                                      'numeriser'='" . $message->getNumeriser () ."',
                                      'Masteriser'='" . $message->getMasteriser () ."',
                                      'mp3'='" . $message->getMp3 () ."',
                                      'duree'='".$message->getDuree () ."',
                                      'commentaires'='" . $message->getCommentaire () ."' WHERE 'id'=" . $message->getId ();

    $db_result = $db_conn->exec ( $req_sql );
  }

  public function supprimerMessage($db_base, $id){
    require "../models/params.php";
        $db_table = "message";
        $db_conn = new PDO ( "mysql:host=" . $db_server . ";port=" . $db_port . ";dbname=" . $db_base, $db_user, $db_password );
    $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db_conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    $req_sql = "UPDATE " . $db_table . " SET 'references' WHERE `id`=" . $id;
        $db_result = $db_conn->exec ( $req_sql );
  }

  public function creerMessage($db_base, $message){
    require "../models/params.php";
        $db_table = "message";
        $db_conn = new PDO ( "mysql:host=" . $db_server . ";port=" . $db_port . ";dbname=" . $db_base, $db_user, $db_password );
    $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db_conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    $req_sql = "INSERT INTO " . $db_table . " (`references`,`heure`,`titres`,`orateurs`,`sources`,`themes`,'datetraitement',`monteur`,'numeriser','masteriser','mp3','duree','commentaires') VALUES
              ('" . $message->getReference () . "',
              '" . $message->getHeure () . "',
              '" . $message->getTitre () . "',
              '" . $message->getOrateur () . "',
              '" . $message->getSource () . "',
              '" . $message->getTheme () . "',
              '" . $message->getDatetraitement () . "',
              '" . $message->getMonteur () . "'
              '" . $message->getNumeriser () ."'
              '" . $message->getMasteriser () ."'
              '" . $message->getMp3 () ."'
              '" . $message->getDuree () ."'
              '" . $message->getCommentaire () ."')";
        $db_result = $db_conn->exec ( $req_sql );
  }
}
$msg = new messageModel();
?>

le code du param est :

<?php
    $db_server = "127.0.0.1";
    $db_port = 3306;
    $db_user = "root";
    $db_password = "root";
?>

merci de votre aide, come je débute et que c'est mon 1er gros projet, j'ai un peu de difficulté, mais j'irai jusqu'au bout.

À la vue de ta classe, la partie suivante est totalement inutile, mais surtout fausse :

foreach ($listok as $list =>$v){
    $this->$list = $v;
}

Je ne sais pas ce que tu essaies de faire avec cette boucle, ce serait bien que tu nous le dise, ça nous permettrait de pouvoir t'aider.

raoul
Auteur

l'objectif est de récupérer tous les élements que j'ai dans ma base de donnée.

Je te demande à quoi tu t'addends quelle fasse la boucle que j'ai reproduis de ton code dans mon précédent post.

raoul
Auteur

il faut quelle récupère tous les éléments qu'il y a dans ma base de donnée

raoul
Auteur

Bonjour, je reviens vers vous car j'ai une Fatal error qui est le message suivant : "Fatal error: Uncaught Error: Cannot access private property messageModel::$references in"

voici l'extrait de mon code, dans la views

<?php
                                    $msg->listerMessage();?>
                      <tr>
                        <td class="element_tableau"><?= $msg->references ?></td>

voici mon code dans mon model :

$listMessage = $db_conn -> prepare("SELECT * from ". $db_table );
    $listMessage -> execute ();
    $listok = $listMessage->fetchAll();
    }
    $msg = new messageModel();

Pouvez-vous m'ader, car je n'avance pas.
Merci

L'erreur t'indique que tu ne peux pas accéder à la propriété privée references.
Si tu veux vraiment t'en sortir avec ton code, il faut absolument que tu suives la formation sur la Programmation Orientée Objet qui est disponible sur le site, car là il est clair que tu ne comprends absolument pas ce que tu fais et on ne va ni te donner la solution toute faite, ni t'apprendre la POO sur le forum, rien que la portion de code que j'ai cité dans mon précédent message ne peut absolument pas être fonctionnel, surtout que ta méthode listerMessage ne retourne absolument rien.

raoul
Auteur

merci, j'ai regardé les 2 vidéos, et justement, j'ai essayer de faire pareil.

en fait, dans le MVC, le model est sensé te retourner les valeurs a ton controlleur que tu transmets ensuite a la vue. ici, tu mélanges un peu tout.

public function listerMessage(){
    $tableau = array();
    require ("../models/params.php");
    $db_base = "adminpccsono";
    $db_table = "message";
    $db_conn = new PDO ( "mysql:host=" . $db_server . ";port=" . $db_port . ";dbname=" . $db_base, $db_user, $db_password );
    $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db_conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    $listMessage = $db_conn -> prepare("SELECT * from ". $db_table );
    $listMessage -> execute ();
    $listok = $listMessage->fetchAll();
    foreach ($listok as $list =>$v){
      $this->$list = $v;
    }
  }

ta partie : a la fin... foreach {...}, tu devrai mieux te retourner ta variable pour pouvoir mieux débugger... parce que ici, ce que tu fait c'est pas affecter $this->references, mais $this->listok[0], $this->listok[1], $this->listok[2] etc..., donc forcement, $this->reference est inconnu...

    $listok = $listMessage->fetchAll();
    /*foreach ($listok as $list =>$v){
      $this->$list = $v;
    }*/
    return $listok;

pour ensuite pouvoir appeler dans ta vue (normalement c'est au controlleur de gérer ca mais bon... passons...)

<?php $listeok = $msg->listerMessage();?> // du coup ici, tu demande a ta classe message de te retourner TOUTES les lignes (CF ta requette)
<?php var_dump($listeok); ?> // petit debug pour voir ce qui se passe....
<?php foreach ($listeok as $row) : ?> // et c'est sur ce retour que tu traite avec ta boucle.
    <tr>
        <td class="element_tableau"><?= $row->references ?></td>
        [... autres collones de ton tableau ...]
    </tr>
<?php endforeach ?>
raoul
Auteur

Merci je vais essayer çà

en plus en faisant comme ca, tu va pouvoir mettre en place des try catch pour te retourner le status des requettes. example :

public function creerMessage($db_base, $message){
    try{
        require "../models/params.php";
        $db_table = "message";
        $db_conn = new PDO ( "mysql:host=" . $db_server . ";port=" . $db_port . ";dbname=" . $db_base, $db_user, $db_password );
        $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $db_conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
        $req_sql = "INSERT INTO " . $db_table . " (`references`,`heure`,`titres`,`orateurs`,`sources`,`themes`,'datetraitement',`monteur`,'numeriser','masteriser','mp3','duree','commentaires') VALUES
              ('" . $message->getReference () . "',
              '" . $message->getHeure () . "',
              '" . $message->getTitre () . "',
              '" . $message->getOrateur () . "',
              '" . $message->getSource () . "',
              '" . $message->getTheme () . "',
              '" . $message->getDatetraitement () . "',
              '" . $message->getMonteur () . "'
              '" . $message->getNumeriser () ."'
              '" . $message->getMasteriser () ."'
              '" . $message->getMp3 () ."'
              '" . $message->getDuree () ."'
              '" . $message->getCommentaire () ."')";
        $db_result = $db_conn->exec ( $req_sql );
      }
      return true;
  } catch ($error) {
    return false;
  }

ce qui va te permettre de gérer tes message d'erreurs correctement.

    <?php if ($msgClass->creerMessage($data)){
        $message = 'success'
    } else {
        $message = 'erreur d\'insert...'
    }
raoul
Auteur

Merci, beaucoup, j'ai compris, maintenant je vais mettre en place un Controller qui va renvoyer à la view

raoul
Auteur

Merci, je n'avais pas vu çà comme çà, mais vous avez raison. je vais mettre le Try Catch