Bonjour,
Voila je suis en train de "refaire" l'organisation du code d'un site que j'avais créé pour un pattern mvc.
Alors J'arrive à peu près à faire ce que je voulais sauf pour un detail, faire appel à des fonctions dans les différentes vues.
Je n'arrive pas à mettre mes requetes dans mes models sans que cela ne génere des problèmes de query()/prepare().
(Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\skydream-mc\models\modelRapport.php on line 10)
Cette erreur signifie généralement qu'on s'est gourré dans la requete mais nada, dans mon cas je glisse le code dans la vue et c'est réglé .. mais dégeulasse.
Voici un exemple :
La vue :
<section>
<div id="center">
<div id="center-down-debog">
<div id="formulaire">
<div id="englobe-debog">
<h3>Bienvenue sur la page debogueur</h3>
<p class='info'>Cette page sert à recueillir les différents bugs et autres problèmes techniques que vous avez rencontrés lors de vos passages sur notre site.
Les rapports de bugs nous permettrons de corriger au plus vite les soucis. Nous vous remercions d'avance de l'intérêt que vous portez au serveur et de votre sérieux quant à l'utilisation de ce formulaire.</p>
<form method='post' action='debogueur'>
<?php
$Rapport = Model::load("modelRapport"); // en gros $Rapport = new modelRapport()
if(isset($_POST) && !empty($_POST))
{
$Rapport->send();
}
?>
<input name='sujet' type="text" placeholder="Sujet de votre rapport." required><br>
<textarea name='contenu' placeholder="Decrivez ici les problèmes que vous rencontrez, ainsi que les conditions dans lesquelles ils apparaissent." required></textarea>
<br>
<input type="submit" value="Envoyer">
</form>
</div>
</div>
</div>
</div>
</section>
Le model
<?php
class modelRapport extends Model
{
var $table = "rapports";
public function send()
{
global $bdd;
$req = $bdd->prepare("INSERT INTO ".$this->table." (id, name, contenu) VALUES (NULL, ?, ?)");
$req->execute(array($_POST['sujet'], $_POST['contenu']));
}
}
et le controller
<?php
class Controller {
public $page = '/views/pages/index.php';
public function debogueur(){
$contenu = "/views/viewDebogueur.php";
require ROOT.$this->page;
}
}
ps : La vue n'est qu'une partie de page qui s'imbrique dans une autre.
Voila est en faisant cela à l'envoi de mon formulaire, j'ai une erreur comme cité plus haut.
J'espere que vous me donnerez des pistes.
Salut,
Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\skydream-mc\models\modelRapport.php on line 10
Cette erreur signifie généralement qu'on s'est gourré dans la requete
Non, cette erreur signifie que,
tu apelles la fonction "prepare()", sur quelque chose qui n'est PAS un objet, dans modelRapport.php, à la ligne 10.
Par contre je vais dire un mot sur la requête après.
La ligne 10 de modelRapport.php :
$req = $bdd->prepare("INSERT INTO ".$this->table." (id, name, contenu) VALUES (NULL, ?, ?)");
Donc en lisant l'erreur, on sait que $bdd n'est PAS un objet.
C'est ce qu'il faut débugger.
Juste au dessus on à :
global $bdd;
Apparemment cette variable a mal été initialisé.
Commence par mettre un var_dump dessus pour voir un peu ce qu'elle vaut,
et va là où tu l'a initialisé pour corriger le problème.
En ce qui concerne la requête :
"INSERT INTO ".$this->table." (id, name, contenu) VALUES (NULL, ?, ?)"
Ça m'intrigue de voir que tu INSERT l'id.
Normalement le champ "id" dans ta base de données DOIT être en "clé primaire", et "autoincremente".
Et quand tu fais un INSERT avec un script PHP, tu ne t'occupes pas de l'id :
"INSERT INTO ".$this->table." (name, contenu) VALUES (?, ?)"
Maintenant, juste une chose qui m'a gêné, mais qui n'a rien à voir avec ton problème :
public function send()
{
...
$req->execute(array($_POST['sujet'], $_POST['contenu']));
}
Attention, ça me semble dangereux. C'est une faille de sécurité.
Normalement, c'est dans le CONTROLLER qu'on récupère les données qui sont dans les variables $_POST.
Toujours dans ce controller, on VÉRIFIE que ces données existent, ET ne sont pas corrompus.
Et on appelle la fonction send() en lui passant ces données en paramètres.
Un peu comme ça :
// model
public function send($sujet, $contenu)
{
global $bdd;
$req = $bdd->prepare('INSERT INTO ' . $this->table . ' (name, contenu) VALUES (?, ?)');
$req->execute(array($sujet, $contenu));
}
// controller
public function send()
{
// quelques tests pour vérifier que les variables $_POST attendues existent et ne soient pas corrompus.
// si OK
modelRapport->send($_POST['sujet'], $_POST['contenu']);
// sinon
// affiche erreur, [redirection...]
}