Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'ai suivi le tuto de Jonathan sur la POO php tp réaliser un blog. Je n'ai pas appliqué les Design pattern etc.
Au dessous de mes articles j'ai ajouté un formulaire d'ajout de commentaire. J'ai créé dans mon dossier pages un fichier comment-post.php.

Quand je souhaite inséré le commentaire j'utilise comme pour la page article ce code :

$com= \App\App::getDb()->prepare(''INSERT INTO commentaires (pseudo, commentaire) VALUES(:pseudo, :commentaire)', 'App\Table\Commentaire'); ?>

Ce que je veux

Je souhaite tout bêtement ajouter des commentaires dans ma BDD.

Ce que j'obtiens

Dans le navigateur j'ai un message d'erreur il me dit qu'il n'arrive pas à trouver la class App\App alors que dans mes autres documents il le trouve bien.

Merci à vous pour votre future réponse.

10 réponses


bjr, tu as 2 quotes devant le INSERT...
le second param d'un pdo::prepare doit être un array key=>value (cd manuel) pas un string.

Salut,

je ne crois pas qu'il faille mettre un \ (anti-slash), au début.

Essaie de remplacer :
$com= \App\App::...
par
$com= App\App::...

(avec un anti-slash, tu demandes à sortir de ton namespace, pour aller chercher le "App..." interne de PHP, et ça n'existe pas)

@saibe,
je crois que sa fonction "prepare" ne vient pas de pdo.
Dans le tutoriel qu'il mentionne, je crois me rappeler qu'on réécrit une fonction "prepare" dans la classe "Database", et que getDb() retourne une instance de cette classe.

Par contre dans le tuto, Grafikart utilise un meilleur système.
Il définit la table à utiliser dans un attribut de la classe, plutôt que de mentionner la table à utiliser en 2ème paramètre à chaque appel.

@SLK, ok :) je vais jeter un coup d'oeil à ce tuto...

@SLK avec un anti-slash tu parts de la racine tandis que sans anti-slash tu rajoutes le namespace courant devant
donc \App est cherché sans préfixer quoi que ce soit, pour moi ça devrait marcher.
Pour débugguer il faudrait savoir ce que fait l'autoload et vérifier qu'il est bien chargé.

Bonjour tout le monde, merci d'avoir répondu je n'avais pas recu de notification.

j'ai essayé d'enlever l'antislash ainsi que le double quote le résultat

@SLK -> Oui effectivement ce n'est pas la requete preapre de PDO mais bien celle de la classe Database, mais étant donné qu'elle fonctionne très bien pour les articles et également la liste de mes commentaires je me disais que pouvais la réutiliser.

Mais visiblement ça ne marche pas...

T'as le lien de la vidéo, je ne retrouve pas Php POO -> Tp -> "'création d'un blog"'

Alors ça commence vraiment à partir du TP : Cnnexion à la base de donnée

@huggy
Ah bon zut.
J'ai du mal avec les namespace.

La dernière fois j'avais eu un problème en voulant faire un new PDO, et ça ne fonctionnait pas.
(j'étais dans mon namespace)
Quelqu'un m'avait expliqué qu'il fallait mettre un "\" : new \PDO,
il disait que SANS l'anti-slash, il essayait de trouver "mon" PDO dans "mon" namespace (une classe PDO que j'aurai éventuellement écrite),
et que AVEC l'anti-slash, il prenait le PDO de PHP (celui à la racine comme tu dis donc).

Du coup je pensais avoir compris mais là du coup je ne sais plus quoi penser xD

@JayTricks

  • En haut de la page (celle où ça ne fonctionne pas) il y a un namespace de mentionné ? C'est lequel ?
  • Je ne vois pas pourquoi ça marcherait, mais essaie de mettre un use pour voir..?
    
    <?php
    namespace App\Ton\Namespace

use App\App;
?>


 - Et sur les autres pages (là où ça fonctionne), quand tu utilises "App", tu l'écris de la même manière : `\App\App::...` ?
 - quel est le namespace mentionné en haut de la page php où est écrite la classe "App" ?

@SLK -> Je viens en fait de comprendre mes autres pages sont appelés directement depuis l'index qui utilise l'autoloader, mais la page comment-post est une page seule donc il fallait ajouter le require de l'autoloader... Encore un peu jeune sur le php :p

Mais le problème d'ajout de commentaire n'est toujours pas réglé ^^

Merci de votre aide.

Je viens en fait de comprendre

Ah ben très bien ^^

Mais le problème d'ajout de commentaire n'est toujours pas réglé ^^

$com = \App\App::getDb()->prepare('INSERT INTO commentaires (pseudo, commentaire)
                                  VALUES (:pseudo, :commentaire)',
                                  'App\Table\Commentaire'
                                 );

Dans ta requête tu mets :pseudo, :commentaire, mais il faut leur attribuer des valeurs maintenant.
Dans ta fonction "prepare", il me semble qu'elle attend un tableau associatif en paramètre.
C'est ce paramètre qu'il faut renseigner,
dans le genre :

$sql = 'INSERT INTO commentaires (pseudo, commentaire) VALUES (:pseudo, :commentaire)';
$class = 'App\Table\Commentaire';
$values = array (
    "pseudo" => $pseudo,
    "commentaire" => $commentaire
);

$com = \App\App::getDb()->prepare($sql, $class, $values);