Bonjour,
Je suis en train de faire mes pages d'articles sur mon site web et j'ai cette erreur quand j'envoie mon commentaire :

Database Error
Error: SQLSTATE[HY000]: General error: 1364 Field 'post_id' doesn't have a default value

SQL Query: INSERT INTO `sitefin`.`comments` (`username`, `mail`, `content`, `created`) VALUES ('fffffffffffff', 'fffffffffffffff@ffffffff.com', 'efuihzefuihzreuilefzghoqil', '2016-06-22 18:46:36')

Notice: If you want to customize this error message, create app\View\Errors\pdo_error.ctp

Stack Trace
CORE\Cake\Model\Datasource\DboSource.php line 461 → PDOStatement->execute(array)
CORE\Cake\Model\Datasource\DboSource.php line 427 → DboSource->_execute(string, array)
CORE\Cake\Model\Datasource\DboSource.php line 1014 → DboSource->execute(string)
CORE\Cake\Model\Model.php line 1928 → DboSource->create(Comment, array, array)
CORE\Cake\Model\Model.php line 1751 → Model->_doSave(null, array)
APP\Controller\PostsController.php line 69 → Model->save(null, boolean, array)
[internal function] → PostsController->show(string, string)
CORE\Cake\Controller\Controller.php line 490 → ReflectionMethod->invokeArgs(PostsController, array)
CORE\Cake\Routing\Dispatcher.php line 193 → Controller->invokeAction(CakeRequest)
CORE\Cake\Routing\Dispatcher.php line 167 → Dispatcher->_invoke(PostsController, CakeRequest)
APP\webroot\index.php line 57 → Dispatcher->dispatch(CakeRequest, CakeResponse)

Voici le code concerné :

function show($id = null,$slug = null){
        if(!$id)
            throw new NotFoundException('Aucunes pages ne correspond à cet ID');
        $post = $this->Post->find('first',array(
            'conditions' => array('Post.id' => $id),
            'recursive' => 0
            ));
        if(empty($post))
            throw new NotFoundException('Aucunes pages ne correspond à cet ID');

        if($slug != $post['Post']['slug'])
            $this->redirect($post['Post']['link'],301);
        $d['post'] = $post;
        $this->set($d);
        // Comment submission
        if(!empty($this->request->data)){
            $this->Post->Comment->create($this->request->data, true);
            $this->request->data['Comment']['post_id'] = $post['Post']['id'];
            if($this->Post->Comment->save(null, true, array('mail', 'username', 'content', 'post_id'))){
                $this->Session->setFlash("Thanks for your comment","success");
                return $this->redirect($this->referer());
            }else{
                $this->Session->setFlash("You have to correct your errors first","error");
            }
        }
    }

Merci d'avance !

5 réponses


Huggy
Réponse acceptée

Il doit y avoir une contrainte d'intégrité qui dit que ta valeur par défaut n'existe pas dans la table posts
le mieux serait de créer correctement le comment en inversant les 2 lignes

       $this->Post->Comment->create($this->request->data, true);
       $this->request->data['Comment']['post_id'] = $post['Post']['id'];

faire le create après avoir mis le post_id

Apparemment le commentaire est créé sans lien de parenté avec le Post, Mais le lien de parenté est ajouté juste après
Il faut donc qu'on puisse créer un commentaire sans y préciser le champ "post_id"
Pour cela il faut autoriser la valeur Null pour ce champ dans la table 'comment'
ou bien préciser une valeur par défaut (0 par exemple) mais la première solution est la meilleure car elle permet de rajouter une contrainte d'intégrité référentielle (en gros : dire que post_id, s'il n'est pas null alors sa valeur doit exister dans la table Post)

Merci mais quand je mets une valeur par defaut dans ma bdd il ne me met pas mon id de post meme si j ai précisé que Comme.post_id et égal à Post.id ...

D accord merci je vais essayer !

Merci ça fonctionne !!!