Problème de sauvegarde UsersController

Par SwithFr, il y a 13 ans


Bonjour,

Ca fait des heures que je m'arrache les cheveux pour ça alors que l'erreur doit être toute bête...
Lorsque je suis dans ma fonction admin_edit pour users, la sauvegarde ne se fait pas. j'ai pourtant la notif qui me dit que L'utilisateur a bien été enregistré mais la sauvegarde ne se fait pas... WHY ?

Voici mon code dans UsersController :

function admin_edit($id=null){
        if($this->request->is('post') || $this->request->is('put') ){
            $d = $this->request->data'User'];
            if($d'password'] != $d'passwordconfirm']){
                $this->Session->setFlash("Les mots de passes ne correspondent pas","notif",array('type'=>'errror'));
            }else{
                if(empty($d'password']))
                    unset($d'password']);
                if($this->User->save($d)){
                    $this->Session->setFlash("L'utilisateur a bien été enregistré","notif");
                }
            }
        }elseif($id){
            $this->User->id = $id; 
            $this->request->data = $this->User->read('username,role,id'); 
        }
        $d = array(); 
        $d'roles'] = array(
            'admin' => 'admin',
            'user' => 'membre'
        );
        $this->set($d);
    }

Si l'un de vous voit où est le problème, je le remercie d'avance.

26 réponses

Maenhyr, il y a 13 ans

Salut,

dans mon code j'ai mis ceci à la ligne 9 et ça fonctionne.

if($this->User->save($this->request->data)){
SwithFr, il y a 13 ans

Merci pour cette réponse mais non ça ne marche pas mieux :'(

Maenhyr, il y a 13 ans

ha, pas cool ça. Comment visualises tu l'insertion ? Est ce que tu n'aurais pas une méthode beforeSave() ou afterSave() qui parasiterait le système ? Est ce que tes données sont bien écrites aussi ?

SwithFr, il y a 13 ans

Pour le beforesave et aftersave voila le model

<?php 
/ ******************************************************************************************
 * MODEL POST fonctions liées au PostsController
 ***************************************************************************************** /
class Post extends AppModel{
    public $actsAs = array('containable');
    public $hasMany = array(
        'Media' => array(
            'dependent' => true
        ),
        'PostTag'
    ); 
    public $belongsTo = array(
        'Category' => array(
            'counterCache' => array('post_count' => array('Post.online'=>1))
        )
    );
    public $hasAndBelongsToMany = array('Tag');
    public $recursive = -1;
    public $validate = array(
        'slug'  => array(
            'rule' => '/^[a-z0-9\-]+$/',
            'allowEmpty'    => true,
            'message' => "L'url n'est pas valide"
        ),
        'name' => array(
            'rule' => 'notEmpty',
            'message' => "Vous devez preciser un titre"
        )

    );
    public $order = 'Post.created ASC';
    /**
     * Permet de générer un brouillon
     */
    public function getDraft($type){
        $post = $this->find('first',array(
            'conditions' => array('online' => -1, 'type' => $type)
        ));
        if(empty($post)){
            $this->save(array(
                'type' => $type,
                'online' => -1
            ),false);
            $post = $this->read();
        }
        $post'Post']'online'] = 0;
        return $post;
    }
    public function afterFind($data){

        foreach ($data as $k => $d) {
            if (isset($d'Post']'slug']) && isset($d'Post']'id']) && isset($d'Post']'type'])) {
                $d'Post']'link'] = array(
                        'controller'    =>Inflector::pluralize($d'Post']'type']),
                        'action' =>'show',
                        'id' =>$d'Post']'id'],
                        'slug' =>$d'Post']'slug']
                );
            }
            $data$k] = $d;
        }
        return $data;
    }
    public function beforeSave(){
        if (empty($this->data'Post']'slug']) && isset($this->data'Post']'slug']) && !empty($this->data'Post']'name'])) 
            $this->data'Post']'slug'] = strtolower(Inflector::slug($this->data'Post']'name'],'-'));
        return true;
    }
    public function afterSave(){
        if(!empty($this->data'Post']'tags'])){
            $tags = explode(',',$this->data'Post']'tags']); 
            foreach($tags as $tag){
                $tag = trim($tag);
                if(!empty($tag)){
                    $d = $this->Tag->findByName($tag);
                    if(!empty($d)){
                        $this->Tag->id = $d'Tag']'id']; 
                    }else{
                        $this->Tag->create(); 
                        $this->Tag->save(array(
                            'name' => $tag
                        )); 
                    }
                    $this->PostTag->create(); 
                    $this->PostTag->save(array(
                        'post_id' => $this->id,
                        'tag_id' => $this->Tag->id
                    )); 
                }
            }
        }
        return true; 
    }

}

et le sql dump me retourne ça
SELECT COUNT(*) AS count FROM users AS User WHERE User.username = 'dzqd'

dzqd etant le nom que j'ai mis au pif pour essayer ^^

Maenhyr, il y a 13 ans

Tu nous a donné le Model Post, c'est le Model User qu'il nous faut. Pour le sql dump, tu nous montres bien la requête SQL effectuée mais pas la réponse :).

SwithFr, il y a 13 ans

Quel idiot je fais ^^

Voilà le bon Model :D

<?php
class User extends AppModel{

    public $hasMany = array(
        'Media' => array(
            'dependent' => true
        )
    );
    public $validate = array(
        'username'  => array(
            array(
                'rule' => 'alphanumeric',
                'required' => true,
                'allowEmpty'    => false,
                'message' => "Ce nom d'utilisateur n'est pas valide"
            ),
            array(
                'rule' => 'isUnique',
                'message' => "Ce nom d'utilisateur est déjà pris"
            )
        ),
        'mail'  => array(
            array(
                'rule' => 'email',
                'required' => true,
                'allowEmpty'    => false,
                'message' => "Cet email n'est pas valide"
            ),
            array(
                'rule' => 'isUnique',
                'message' => "Cet email est déjà pris"
            )
        ),
        'password'  => array(
                'rule' => 'notEmpty',
                'message' => "Vous devez preciser un mot de passe",
                'allowEmpty'    => false
        )

    );
    function beforeSave($options = array()){

        if(!empty($this->data'User']'password'])){
            $this->data'User']'password'] = AuthComponent::password($this->data'User']'password'],null,true);
            return true;
        }

    }
}

Alors j'ai pas compris pour la réponse ^^ Comment on voit la réponse et non la requête ?

SwithFr, il y a 13 ans

Petit up :)

Maenhyr, il y a 13 ans

Dans ton sql dump, tu as un tableau contenant plusieurs colonnes (Nr, Query, Error affected, Num rows, took). Tu ne nous a donné que Query, du coup on a la requête mais pas le résultat, il nous faudrait les champs suivants.

Peux tu faire un debug($this->request->data) juste avant ta ligne 9 dans ton admin_edit et nous copier ce qu'il en ressort ?

SwithFr, il y a 13 ans

Voilà le debug :

app/Controller/UsersController.php (line 77)
Array
(
    [User] => Array
        (
            [username] => dzqd
            [description] => dqzd
            [password] => aze
            [passwordconfirm] => aze
            [role] => admin
            [id] => 
        )
)

et la réponse
Error
Affected 1
Num row 1
Took(ms) 0

Maenhyr, il y a 13 ans

Ok bah visiblement cela à l'air de l'avoir créé. Tu n'as vraiment rien dans ta base de données ? Tu peux regarder avec phpMyAdmin par exemple.

SwithFr, il y a 13 ans

Nop rien de rien :'( Et si j'enlève les lignes 7/8 j'ai ma notif comme quoi l'utilisateur est bien enregistré. Mais si je les laisse j'ai pas de notif du tout. peut-être que le problème viendrait de là ?

giizmo, il y a 13 ans

merci cela ma aider a corriger l erreur (j avais le meme souci ^^)

Maenhyr, il y a 13 ans

Ces lignes là ne sont pas utiles en effet, tu peux les enlever.

SwithFr, il y a 13 ans

Ok. Mais bon c'est étrange comme problème n'empêche ^^

coloo, il y a 13 ans

Il essaye d'enregistrer passwordconfirm mais y a pas le champs dans ta base ?

SwithFr, il y a 13 ans

En effet il n'y était pas ... fausse manip de ma part s'en doute et j'ai du l'enlever, cependant ça ne marche pas mieux :(

coloo, il y a 13 ans

montre nous la structure de ta table =)

SwithFr, il y a 13 ans

Voilà :)
--
-- Structure de la table users
--

CREATE TABLE users (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(255) NOT NULL,
mail varchar(255) NOT NULL,
password varchar(255) NOT NULL,
passwordconfirm varchar(255) NOT NULL,
phone int(11) NOT NULL,
media\_id int(11) NOT NULL,
active int(11) NOT NULL DEFAULT '1',
role varchar(60) NOT NULL,
description text NOT NULL,
location varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

Maenhyr, il y a 13 ans

Ce n'est pas nécessaire de sauvegarder le champ 'passwordconfirm'.

Essaye ça:

UsersController.php

function admin_edit($id=null){
    if($this->request->is('post') || $this->request->is('put') ){
        $d = $this->request->data'User'];
        if($d'password'] != $d'passwordconfirm']){
            $this->Session->setFlash("Les mots de passes ne correspondent pas","notif",array('type'=>'errror'));
        }else{
            if($this->User->save($this->request->data)){
                $this->Session->setFlash("L'utilisateur a bien été enregistré","notif");
            }
        }
    }elseif($id){
        $this->request->data = $this->User->findById($id);
        if($id) {
            unset($this->request->data'User']'password']);
        }
    }
    //$d = array(); 
    $d'roles'] = array(
        'admin' => 'admin',
        'user' => 'membre'
    );
    $this->set($d);
}

User.php

function beforeSave($options = array()){
        if(!empty($this->data'User']'password'])){
            $this->data'User']'password'] = AuthComponent::password($this->data'User']'password']); // il n'y a qu'un paramètre à entrer
            return true;
        }

    }
SwithFr, il y a 13 ans

Merci pour vos pistes et votre aide mais aucune différences. Malédiction ?

Maenhyr, il y a 13 ans

Oulà, ça m'intrigue ça ! Pourrais tu nous envoyer un zip de ton projet simplifié avec juste la partie users stp ?

Je regarderai ça la semaine prochaine.

En espérant que tu aies une réponse avant.

Maenhyr, il y a 13 ans

Oulà, ça m'intrigue ça ! Pourrais tu nous envoyer un zip de ton projet simplifié avec juste la partie users stp ?

Je regarderai ça la semaine prochaine.

En espérant que tu aies une réponse avant.

SwithFr, il y a 13 ans

D'accord je te fais ça dans le week end. Merci pour ton aide en tout cas ;) Un mail peut-être pour l'envoi du ZIO :D

Maenhyr, il y a 13 ans

EDIT : @email supprimée par l'auteur

philieric, il y a 13 ans

J'ai eut le même problème et cela ne concerne que le controller User à priori :
$this->User->save($this->request->data) ce que tu écrit est bon, mais tu dois ajouter la liste des champs à la demande du save ainsi que true en 2eme parametre.

Exemple :
$this->User->save($this->request->data,true,array('firstname','lastname','mail')

Ton problème d'enregistrement sera résolu.

SwithFr, il y a 13 ans

Oh YEAH!!!! Merci philieric le problème est résolu. A quoi correspond le true en deuxième paramètre ? Et pourquoi ça ne fait ça que sur User ?

Encore merci!