Bonjour,
J'ai suivi le tutoriel concernant la création d'un site de A à Z qui est très bien réalisé mais cependant il manque une parti sur la gestion des utilisateur en particulier l'inscription.
J'ai ajouté des champs supplémentaires dans la table users et mis en place un formulaire pour l'inscription et créé une methode dans le UserController (signup) mais lors de l'envie du formulaire rien n'est enregistré en base de donnée

Ci-joint la page UsersController

$this->loadModel('Contact');
        if($this->request->data){
            if($this->Contact->validates($this->request->data)){
                $this->request->data->type = 'post';
                //$this->Contact->save($this->request->data);
                $this->Session->setFlash('Le mail a bien ete envoye'); 
            }else{
                $this->Session->setFlash('Merci de corriger vos informations','error'); 
            }   
        }
    }
}

Code concernant mon formulaire

<div class="page-header">
    <h1>Inscription</h1>
</div>  
<form action="<?php echo Router::url('users/signup'); ?>" method="post">
        <?php echo $this->Form->input('login','Identifiant '); ?>
        <?php echo $this->Form->input('name','Nom '); ?>
        <?php echo $this->Form->input('surname','Prenom '); ?>
        <?php echo $this->Form->input('sex','Sexe '); ?>
        <?php echo $this->Form->input('mail','Email '); ?>
        <?php echo $this->Form->input('password','Mot de passe ',array('type'=>'password')); ?> 
        <?php echo $this->Form->input('country','Ville '); ?>
        <?php echo $this->Form->input('signup','Signature',array('type'=>'textarea','class'=>'xxlarge wysiwyg','rows'=>5)); ?>

        <div class="actions">
            <input type="submit" class="btn primary" value="Enregistre">
        </div>
</form>

je vous remercie de votre aide car pour le moment je suis bloquer pour avancer dans la suite de mon projet

Cafreunion

6 réponses


cafreunion
Auteur
Réponse acceptée

Re, j'ai fais un die($sql); avant $pre = $this->db->prepare($sql); dans le Model.php et je me suis apercu qu'une ligne n'avait pas lieu d'être dans mon UsersController

$this->request->data->type = 'user';
Requête sql avec cette ligne : INSERT INTO users SET login=:login,name=:name,surname=:surname,sex=:sex,mail=:mail,password=:password,country=:country,signup=:signup,type=:type

D'ou mon message d'erreur il cherchait la colonne type. J'ai retiré cette ligne et maintenant tout fonctionne

en retirant cette ligne ma requête est bonne :

INSERT INTO users SET login=:login,name=:name,surname=:surname,sex=:sex,mail=:mail,password=:password,country=:country,signup=:signup

Merci de votre aide

cafreunion

Il faut que les champs de ton tableau de BDD 'Contact' auront le nom de l'input.
Exemple :

echo $this->input('<strong><u>name</u></strong>', 'Votre nom');

INSERT INTO CONTACT ( <u>name</u> ) VALUES ( la valeur du champ )

Bonjour merci de votre réponse mes champs correspondent bien a la base de donnée (base users --> traduit par contact sur ce forum)
Ci-joint la structure de ma table users, le champs created est automatiquement mis à jour lors de la création date serveur par défaut et le rôle est défini par défaut aussi

--
-- Base de données: `transparence`
--
-- --------------------------------------------------------
--
-- Structure de la table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `login` varchar(50) CHARACTER SET ucs2 NOT NULL,
  `name` varchar(70) NOT NULL,
  `surname` varchar(70) NOT NULL,
  `sex` varchar(5) NOT NULL,
  `mail` varchar(100) NOT NULL,
  `password` text NOT NULL,
  `country` varchar(100) NOT NULL,
  `signup` mediumtext NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `role` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-

c'est pour cette raison que j'ai pas mis les deux champs dans mon formulaire

Merci de votre aide

Pourquoi t'as commenté cette ligne dans ton UsersController

$this->Contact->save($this->request->data);

Re,

j'ai refais un point sur la methode, la ligne ci-dessus n'est pas commenté dans mon code.
J'avais fait une erreur sur un ligne donc après correction ca me donne le script ci-dessous (UserController)

* Inscription d'un nouveau utilisateur
    **/
    function signup(){
        $this->loadModel('User');
        if($this->request->data){
            if($this->User->validates($this->request->data)){
                $this->request->data->type = 'user';

                $this->User->save($this->request->data);

                $this->Session->setFlash('Inscription reussie'); 
            }else{
                $this->Session->setFlash('Merci de corriger vos informations','error'); 
            }   
        }

lors de la validation du formulaire j'ai l'erreur suivant qui apparait

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'type' in 'field list' in E:\wamp\www\rougebleuciel\core\Model.php on line 208

En vérifiant dans le fichier concerné cela correspond à

public function save($data){
        $key = $this->primaryKey;
        $fields = array();
        $d = array(); 
        foreach($data as $k=>$v){
            if($k!=$this->primaryKey){
                $fields] = "$k=:$k";
                $d":$k"] = $v; 
            }elseif(!empty($v)){
                $d":$k"] = $v; 
            }
        }
        if(isset($data->$key) && !empty($data->$key)){
            $sql = 'UPDATE '.$this->table.' SET '.implode(',',$fields).' WHERE '.$key.'=:'.$key;
            $this->id = $data->$key; 
            $action = 'update';
        } else{
            $sql = 'INSERT INTO '.$this->table.' SET '.implode(',',$fields);
            $action = 'insert'; 
        }
        $pre = $this->db->prepare($sql); 
        $pre->execute($d);
        if($action == 'insert'){
            $this->id = $this->db->lastInsertId(); 
        }
    }

La ligne 208 : $pre->execute($d); du fichier Model.php

Merci de votre aide

cafreunion

Tu peux faire un die($sql); avant $pre = $this->db->prepare($sql); dans le Model.php, et mettre la requête ici