Page 1 sur 2

) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 18:36
par Hyoshiko
Salut !
Je suis complètement désespérée. Ca fait 2 jour que je bloque sur le même problème...
J'ai un fatal error sur la method connexionDB:: prepare() et je ne vois vraiment pas ou j'ai fauté.
Je souhaite effectué une messagerie privé (comme le tuto de PrimFX) permettant d'envoyer un message de l'admin à l'utilisateur et inversement. j'ai début le tuto, j'ai créer dans la même base de donnée que celle de mes utilisateurs la table messages et implanté le code sur une page qui se trouve sur le dashboard de l'admin et la page s'appelle envoiexo.php la page de réception c'est celle que je vous ai envoyé qui se nomme exercices.php.
Je ne sais pas si je dois vous fournir l'autre page je le fais quand même x_x.

En plus de cette erreur, j'ai beau testé tout ce que je veux ça ne fonctionne pas


exercices.php

Code : Tout sélectionner

<?php session_start(); include('bd/connexionDB.php'); // S'il n'y a pas de session alors on ne va pas sur cette page if (!isset($_SESSION['Type']) && ($_SESSION['Type'] != '0')){ header('Location: index.php'); exit; } // On récupère les informations de l'utilisateur grâce à son ID $afficher_profil = $DB->query('SELECT * FROM utilisateur WHERE id = ?', array($_SESSION['id'])); $afficher_profil = $afficher_profil->fetch(); if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) { $msg = $DB->prepare('SELECT * FROM messages WHERE id_destinataire = ?'); $msg->execute(array($_SESSION['id'])); $msg_nbr = $msg->rowCount(); ?> <!doctype html> <html class="no-js" lang=""> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Orthoweb</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="apple-touch-icon" href="apple-touch-icon.png"> <link rel="stylesheet" href="assets/css/bootstrap.min.css"> <!--For Plugins external css--> <link rel="stylesheet" href="assets/css/plugins.css" /> <link rel="stylesheet" href="assets/css/roboto-webfont.css" /> <!--Theme custom css --> <link rel="stylesheet" href="assets/css/style.css"> <!--Theme Responsive css--> <link rel="stylesheet" href="assets/css/responsive.css" /> <script src="assets/js/vendor/modernizr-2.8.3-respond-1.4.2.min.js"></script> </head> <body> <!-- Sections --> <section id="social" class="social"> <div class="container"> <!-- Example row of columns --> <div class="row"> <div class="social-wrapper"> <div class="col-md-6"> <!--On peut rajouter ici les reseaux sociaux ---> </div> <div class="col-md-6"> <div class="social-contact"> <a href="#"><i class="fa fa-phone"></i>+011 54925849</a> <a href="contact.php"><i class="fa fa-envelope"></i>[email protected]</a> </div> </div> </div> </div> </div> <!-- /container --> </section> <nav class="navbar navbar-default"> <div class="container"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="index.php"></a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav navbar-right"> <li class="active"><a href="#">Home</a></li> <li><a href="consulter.php">Comment consulter ? </a></li> <li><a href="troubles.php">Troubles traités</a></li> <li><a href="visio.php">Télé-orthophonie</a></li> <li><a href="procedure.php">Procédure</a></li> <li><a href="contact.php">Contact</a></li> <?php if (isset($_SESSION['Type']) && ($_SESSION['Type'] == '0')){ ?> <li class="login"><a href="profil.php">Mon compte</a></li> <li class="login"><a href="deconnexion.php">Déconnexion</a></li> <?php }else{ //Sinon s'il y a une session alors on verra les liens ci-dessous header('Location: index.php'); } ?> </ul> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid --> </nav> <!--Home page style--> <header id="home" class="home6"> <div class="overlay-fluid-block"> <section id="service" class="sections3" style="padding-top:70px;background-color:#82ca9c3d;"> <div class="head_title text-center"> <h2>EXERCICES</h2> <p>TÉLÉCHARGEZ ICI TOUS VOS EXERCICES</p> </div> </section> </div> </div> </header> <div class="container"> <div class="row"> <div class="col-md-3 "> <div class="list-group "> <a href="profil.php" class="list-group-item list-group-item-action active">Dashboard</a> <a href="modifier-profil.php" class="list-group-item list-group-item-action">Mon profil</a> <a href="exercices.php" class="list-group-item list-group-item-action">Exercices</a> <a href="reponses.php" class="list-group-item list-group-item-action">Vos Réponses</a> <a href="correction.php" class="list-group-item list-group-item-action">Correction</a> </div> </div> <h1>Liste des exercices disponibles</h1> <h3>Votre boîte de réception:</h3> <?php if($msg_nbr == 0) { echo "Vous n'avez aucun message..."; } while($m = $msg->fetch()) { $p_exp = $DB->prepare('SELECT mail FROM utilisateur WHERE id = ?'); $p_exp->execute(array($m['id_expediteur'])); $p_exp = $p_exp->fetch(); $p_exp = $p_exp['mail']; ?> <b><?= $p_exp ?></b> vous a envoyé: <br /> <?= nl2br($m['message']) ?><br /> -------------------------------------<br/> <?php } ?> </div> </div> </div> </div> </div> </div> </div> <!---footer---> <?php include("includes/footer.php"); ?> <!---footer---> </body> </html> <?php } ?>


envoiexo.php

Code : Tout sélectionner

<?php session_start(); include('bd/connexionDB.php'); // S'il n'y a pas de session alors on ne va pas sur cette page if (!isset($_SESSION['Type']) && $_SESSION['Type'] == '0'){ header('Location: index.php'); exit; } if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) { if(isset($_POST['envoi_message'])) { if(isset($_POST['destinataire'],$_POST['message']) AND !empty($_POST['destinataire']) AND !empty($_POST['message'])) { $destinataire = htmlspecialchars($_POST['destinataire']); $messages = htmlspecialchars($_POST['message']); $id_destinataire = $DB->prepare('SELECT id FROM utilisateur WHERE mail = ?'); $id_destinataire->execute(array($destinataire)); $dest_exist = $id_destinataire->rowCount(); if($dest_exist == 1) { $id_destinataire = $id_destinataire->fetch(); $id_destinataire = $id_destinataire['id']; $ins = $DB->prepare('INSERT INTO messages (id_expediteur,id_destinataire,message) VALUES (?,?,?)'); $ins->execute(array($_SESSION['id'],$id_destinataire,$message)); $error = "Votre message a bien été envoyé !"; } else { $error = "Cet utilisateur n'existe pas..."; } } else { $error = "Veuillez compléter tous les champs"; } } $destinataire = $DB->query('SELECT mail FROM utilisateur ORDER BY mail'); ?> <!doctype html> <html class="no-js" lang=""> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Orthoweb</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="apple-touch-icon" href="apple-touch-icon.png"> <link rel="stylesheet" href="assets/css/bootstrap.min.css"> <!--For Plugins external css--> <link rel="stylesheet" href="assets/css/plugins.css" /> <link rel="stylesheet" href="assets/css/roboto-webfont.css" /> <!--Theme custom css --> <link rel="stylesheet" href="assets/css/style.css"> <!--Theme Responsive css--> <link rel="stylesheet" href="assets/css/responsive.css" /> <script src="assets/js/vendor/modernizr-2.8.3-respond-1.4.2.min.js"></script> </head> <body> <!-- Sections --> <section id="social" class="social"> <div class="container"> <!-- Example row of columns --> <div class="row"> <div class="social-wrapper"> <div class="col-md-6"> <!--On peut rajouter ici les reseaux sociaux ---> </div> <div class="col-md-6"> <div class="social-contact"> <a href="#"><i class="fa fa-phone"></i>+011 54925849</a> <a href="contact.php"><i class="fa fa-envelope"></i>[email protected]</a> </div> </div> </div> </div> </div> <!-- /container --> </section> <nav class="navbar navbar-default"> <div class="container"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="index.php"></a> </div> <!-- Collect the nav links, forms, and other content for toggling --> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav navbar-right"> <li class="active"><a href="index.php">Home</a></li> <li><a href="consulter.php">Comment consulter ? </a></li> <li><a href="troubles.php">Troubles traités</a></li> <li><a href="visio.php">Télé-orthophonie</a></li> <li><a href="procedure.php">Procédure</a></li> <li><a href="contact.php">Contact</a></li> <?php if(isset($_SESSION['Type']) && $_SESSION['Type'] != '0'){ ?> <li class="login"><a href="admin.php">Mon Admin</a></li> <li class="login"><a href="deconnexion.php">Déconnexion</a></li> <?php } else { //Sinon s'il y a une session alors on verra les liens ci-dessous header('Location: index.php'); echo " Vous n'avez pas les droits"; } ?> </ul> </ul> </div><!-- /.navbar-collapse --> </div><!-- /.container-fluid --> </nav> <!--Home page style--> <header id="home" class="home6"> <div class="overlay-fluid-block"> <section id="service" class="sections3" style="padding-top:70px;background-color:#82ca9c3d;"> <div class="head_title text-center"> <h2>DASHBOARD</h2> <p>BIENVENUE DANS VOTRE ESPACE ADMINISTRATEUR</p> </div> </section> </div> </div> </header> <div class="container"> <div class="row"> <div class="col-md-3 "> <div class="list-group "> <a href="admin.php" class="list-group-item list-group-item-action active">Dashboard</a> <a href="envoiexo.php" class="list-group-item list-group-item-action">Envoyer exercices</a> <a href="reprecu.php" class="list-group-item list-group-item-action">Réception réponses</a> <a href="envoicorrec.php" class="list-group-item list-group-item-action">Envoyer correction</a> </div> </div> <div class="col-md-9"> <div class="card"> <div class="card-body"> <div class="row"> <div class="col-md-12"> <h1>Exercices à envoyer</h1> <hr> </div> </div> <div class="row"> <div class="col-md-12"> <!-- formulaire d'envoi --> <form method="POST" action="exercices.php"> <label>Destinataire:</label> <select name="destinataire"> <?php while($d = $destinataire->fetch()) { ?> <option><?= $d['mail'] ?></option> <?php } ?> </select> <br /><br /> <textarea placeholder="Votre message" name="message"></textarea> <br /><br /> <input type="submit" value="Envoyer" name="envoi_message" /> <br /><br /> <?php if(isset($error)) { echo '<span style="color:red">'.$error.'</span>'; } ?> </form> </div> </div> </div> </div> </div> </div> </div> <!---footer---> <?php include("includes/footer.php"); ?> <!---footer---> </body> </html> <?php } ?>

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 18:44
par or 1
c'est le contenu de bd/connexionDB.php qu'il faudrait.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 18:45
par Hyoshiko
je le fourni de suite !

Code : Tout sélectionner

<?php // Déclaration d'une nouvelle classe class connexionDB { private $host = 'localhost'; // nom de l'host private $name = 'repet'; // nom de la base de donnée private $user = 'root'; // utilisateur private $pass = ''; // mot de passe //private $pass = ''; // Ne rien mettre si on est sous windows private $connexion; function __construct($host = null, $name = null, $user = null, $pass = null){ if($host != null){ $this->host = $host; $this->name = $name; $this->user = $user; $this->pass = $pass; } try{ $this->connexion = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name, $this->user, $this->pass, array(PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8', PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)); }catch (PDOException $e){ echo 'Erreur : Impossible de se connecter à la BDD !'; die(); } } public function query($sql, $data = array()){ $req = $this->connexion->prepare($sql); $req->execute($data); return $req; } public function insert($sql, $data = array()){ $req = $this->connexion->prepare($sql); $req->execute($data); return $req->execute($data) ? $this->connexion->lastInsertId() : false; } public function getError() { return $this->connexion->errorInfo()[2]; } } // Faire une connexion à votre fonction $DB = new connexionDB(); ?>

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 18:58
par or 1
la classe connexionDB a une méthode insert mais pas de méthode prepare donc le message d'erreur est parfaitement logique.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 19:02
par Saian
Salut Hyoshiko, tu n'as tout simplement pas de méthode prepare sur ta class connexionDB. "Call to undefined method" ça veut dire "Appelle de la méthode non définie".

Tu as en revanche une méthode query qui prend en paramètre la requête et le tableau des données et qui fait le prepare et le execute. Alors utilises simplement ta méthode query.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 19:05
par Hyoshiko
J'ai déjà testé et quand je le fais ça me fait ça x_x
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in C:\wamp\www\ortho\bd\connexionDB.php on line 30

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 19:07
par Saian
C'est que les paramètres donnés ne collent pas entre ta requête et ton tableau. Je t'invite a bien regarder les exemples de code ici :
https://www.php.net/manual/fr/pdo.prepare.php

Je pense que tu devrais comprendre pourquoi ça ne fonctionne pas.

Par exemple ceci devrait fonctionner :
$messages = $DB->query('SELECT * FROM messages WHERE id_destinataire = ?', array($_SESSION['id']));
$msg_nbr = $messages->rowCount();

Tu peux modifier ta méthode query comme ceci pour avoir un maximum d'informations lorsqu'elle termine en erreur (à vérifier toutefois que l'erreur déclenche bien une exception car j'ai un doute la) :
public function query($sql, $data = array()){
  try {
    $req = $this->connexion->prepare($sql);
    $req->execute($data);
  }
  catch (Exception $e) {
    echo $e->getMessage().'<br/>';
    echo $sql.'<br/>';
    print_r($data);
    debug_print_backtrace();
    exit();
  }

  return $req;
}
La backtrace te permettra de retrouver lors de quel appel à $DB->query() l'erreur s'est produite. De plus avec la requête et le tableau des paramètres ça devrait t'aider à comprendre ce qui ne fonctionne pas entre ta requête et tes paramètres.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 19:29
par Hyoshiko
Du coup je viens de modifier et lire la doc je pense que ça devrait fonctionner. Le soucis c'est que je ne sais pas ahah ... Quand je fais le test donc je me connecte à mon compte admin j'envoi un message ça ne m'indique aucune erreur et me redirige vers la page d'accueil je me déconnecte et me reconnecte sur le compte utilisateur ou j'ai envoyé le message mais ça m'indique le message " vous n'avez aucun message" :/ . Là je vous avouerai que j'arrive à saturation je ne sais plus ce que je fais de travers ou de droit ahah...

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 19:35
par Saian
Dans ce cas va vérifier via phpmyadmin (ou tout autre gestionnaire de base de données que tu utilises) ta table messages pour t'assurer que le message est bien présent et pour t'assurer que les id sont correctes et en particulier l'id du destinataire. C'est en tout cas la première chose que je ferais. ;)

Selon ce que tu y trouveras ou n'y trouveras pas, tu pourras déterminer où se trouve le problème et contrôler et corriger le code qui en est responsable.

PS : Et après vérification, à priori les Fatal error ne sont pas "capturables" par try catch donc il ne sert à rien. Il faudrait utiliser la fonction set_error_handler et à moins que tu ais très envi de te lancer la dedans il faudra se passer de la back trace. ^^

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 19:47
par Hyoshiko
Je n'ai pas de messages enregistrés et l'id destinataire semble correspondre au code. T-T est-ce que ça peut venir des redirections de compte ? ( j'ai mis des conditions pour reconnaître un admin d'un utilisateur peut être de la mauvaise manière)

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 19:52
par Saian
Si tu n'as rien dans la table messages c'est que php ne passe probablement pas sur le code d'insertion du message lorsque tu soumets le formulaire d'envoi de message. Tu aurais donc un problème à ce niveau là (enfin un premier problème ^^). Le formulaire est-il soumis au bon script php ? les conditions pour rentrer dans le code d'insertion sont elles bonnes ? tu peux t'aider du echo éventuellement couplé au exit pour essayer de comprendre ce que fait ton script. Encore mieux tu pourrais utiliser xdebug mais si tu ne l'as jamais utilisé ça peut être compliqué à configurer pour un débutant et ça dépend pas mal de l'IDE que tu utilises si tu en utilises un.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 20:01
par Hyoshiko
Est ce qu'il ne faudrait pas que je fasse une jointure entre la table des utilisateurs et messages ?

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 20:04
par Saian
Pas sur de comprendre Hyoskiko, tu dis "Je n'ai pas de messages enregistrés" moi je comprends que ta table messages est vide. Est ce la cas ou non ? as tu vérifié son contenu avec phpmyadmin comme je te le suggérais ?

Si tu me dis OUI le message est bien enregistré ET l'id destinataire est le bon alors LA d'accord on va regarder comment tu récupères les messages à destination de l'utilisateur.
Si tu me dis que la table est vide faut déjà que tu regardes pourquoi l'insertion ne se fait pas et je t'ai déjà indiqué comment faire pour essayer de comprendre ce qui ne va pas.

Parce que bon si tu fais un SELECT * FROM messages WHERE id_destinataire = 1 et que tu as bien des lignes qui correspondent, nul besoin de faire une jointure pour remonter les lignes.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 20:36
par Hyoshiko
Excuse moi je me suis mal exprimée, j'ai vérifié ma table message, là ou sont censé être les messages mais elle est vide. Le formulaire est bien censé aller vers exercices.php ... . Le code de PrimFx et quasi telle qu'elle je me suis contentée de modifier les variables c'est tout u_u. c'est pour ça que je ne comprends pas trop.

Re: ) Fatal error: Call to undefined method connexionDB::prepare() in C:\wamp\www\ortho\exercices.php on line 20

Posté : 01 juin 2019, 20:47
par Saian
Et bien comme je te dis si tu veux essayer de comprendre joue avec le echo par exemple pour voir si php passe bien à tel ou tel endroit du script.
C'est le script envoiexo.php qui gère l'envoi de message, tu peux par exemple mettre un echo dans le if principal de traitement de la soumission du formulaire au tout début juste avant le $destinataire = htmlspecialchars($_POST['destinataire']);. ( par exemple echo "formulaire soumis<br/>"; ensuite tu peux mettre un echo après le if($dest_exist == 1) { par exemple echo "le destinataire existe, on enregistre le message<br/>"; etc etc. Si le echo ne s'affiche pas ça montre bien que la condition n'est pas remplie, à toi d'essayer de comprendre pourquoi dans ce cas. Bref essaie de debuguer ton script il faut bien que tu apprennes à le faire. On a pas toujours une solution clé en main à donner.

EDIT : tu vois déjà tu me dis "Le formulaire est bien censé aller vers exercices.php" alors même que le code d'insertion du message est dans envoiexo.php. Tu vois donc que déjà la première chose que je t'ai dit de vérifier si la table est vide n'est pas bonne. Y a pas de secret, il faut juste prendre les problèmes dans l'ordre et faire appel à la logique pour comprendre d'où ils viennent et comment les corriger. La table est vide, première question, pourquoi est-elle vide ? le formulaire est-il soumis vers le bon script ? si oui, le script rentre-t-il dans la condition d'insertion ? etc ;)