web-dev-qa-db-fra.com

save () retournant false, mais sans erreur dans CakePHP

Ma valeur de débogage est définie sur 2 Et affiche toutes les requêtes, sauf celle dont j'ai besoin.

J'ai une méthode de contrôleur Items qui appelle cette méthode dans le modèle User ( L'élément appartient à l'utilisateur ):

function add_basic($email, $password) {
    $this->create();

    $this->set(array(
        'email' => $email,
        'password' => $password
    ));

    if($this->save()) {
        return $this->id;
    }
    else {
        return false;
    }
}

J'ai confirmé que $email Et $password Sont correctement passés dans la fonction (et sont remplis de données légitimes). email et password sont les noms des champs du modèle User.

J'ai également confirmé que sur $this->save() il renvoie false, mais lorsque je consulte la page où cela se produit, la requête n'est pas imprimée dans le débogage et aucune erreur n'est levée , donc je n'ai aucune idée de ce qui ne va pas.

Des idées sur la façon dont je peux voir l'erreur ou pourquoi la requête ne semble pas être exécutée?

C'est bizarre, car juste après cela, j'ai un autre modèle qui enregistre les données de la même manière exacte, il se déclenche sans accroc.

35
Dan

Cela vous donnera probablement les informations dont vous avez besoin (en supposant qu'elles ne soient pas enregistrées en raison de données non valides, bien sûr):

if(!$this->save()){
    debug($this->validationErrors); die();
}
42
inkedmn

contient le tableau validationErrors

if ($this->save()) {
    return $this->ModelName->id;
}
else {
    debug($this->ModelName->invalidFields());
    return false;
}
13
iman

Avez-vous une méthode beforeValidate() ou beforeSave() dans le modèle ou le modèle d'application? Si oui, reviennent-ils vrais? A défaut, utilisez un débogueur, définissez un point d'arrêt dans votre méthode IDE en haut de cake/libs/models/model.php save() et parcourez le code jusqu'à il retourne false. A défaut d'ajouter des appels die('here');.

10
neilcrookes

Essaye ça:

if ($this->save()) {
    return $this->id;
}
else {
    var_dump($this->invalidFields());
    return false;
}
8
Thiago Belem

Assurez-vous de vérifier vos tables:

  • ID a-t-il activé l'incrémentation automatique?
  • id est votre clé primaire?

les problèmes d'incrémentation automatique m'ont tué. Un moyen facile de vérifier: si l'une de vos lignes a ID = 0, auto_increment est probablement désactivé.

3
na8ur

@cakePHP 3.6: Après avoir enregistré une entité, toute erreur de validation sera stockée sur l'entité elle-même. Il peut lire par la méthode getErrors ().

\Cake\Log\Log::debug($this->ModelName->getErrors());

Si vous avez inclus la bibliothèque

use \Cake\Log\Log;

alors vous pouvez accéder aux erreurs comme ci-dessous:

Example: log::debug($contactRelationship->getErrors());

Réf: https://book.cakephp.org/3.0/en/orm/entities.html

1
Invincible

L'autre situation où CakePHP ne signale aucun $this->Model->validationErrors Et aucune autre erreur est potentiellement lorsque $this->request->data N'est pas comme le prévoit Cake et ignore simplement vos données, pas d'enregistrement, aucune erreur de validation. Par exemple, si vos données ont été fournies par DataTables, vous pouvez voir ce format $this->request->data[0]['Model']['some_field'].

$this->Model->save($this->request->data[0]) fonctionnera cependant.

0
chopstik

CakePHP 3.6

$entity = $this->Model->newEntity([
    'account_id' => $id,
    'gallery_id' => $gallery_id
]);

$result = $this->Model->save($entity);

print_r($entity->getErrors());
0
Jeffrey L. Roberts