Auparavant, je n'utilisais pas la fonction $model->save()
pour insérer ou mettre à jour des données. J'utilisais simplement createCommand()
pour exécuter une requête et cela fonctionnait correctement. Mais les membres de mon équipe m'ont demandé d'éviter createCommand()
et d'utiliser $model->save();
.
Maintenant, j'ai commencé à nettoyer mon code et le problème est que $model->save();
ne fonctionne pas pour moi. Je ne sais pas où je me suis trompé.
UsersController.php (Contrôleur)
<?php
namespace app\modules\users\controllers;
use Yii;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\swiftmailer\Mailer;
use yii\filters\AccessControl;
use yii\web\Response;
use yii\widgets\ActiveForm;
use app\modules\users\models\Users;
use app\controllers\CommonController;
class UsersController extends CommonController
{
.
.
public function actionRegister() {
$model = new Users();
// For Ajax Email Exist Validation
if(Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())){
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
else if ($model->load(Yii::$app->request->post())) {
$post = Yii::$app->request->post('Users');
$CheckExistingUser = $model->findOne(['email' => $post['email']]);
// Ok. Email Doesn't Exist
if(!$CheckExistingUser) {
$auth_key = $model->getConfirmationLink();
$password = md5($post['password']);
$registration_ip = Yii::$app->getRequest()->getUserIP();
$created_at = date('Y-m-d h:i:s');
$model->auth_key = $auth_key;
$model->password = $password;
$model->registration_ip = $registration_ip;
$model->created_at = $created_at;
if($model->save()) {
print_r("asd");
}
}
}
}
.
.
}
Tout est OK sauf $model->save();
N'imprime pas 'asd' comme je l'ai répété.
Et si j'écris
else if ($model->load(Yii::$app->request->post() && $model->validate()) {
}
Cela n'entre pas dans cette condition if
.
Et si j'écris
if($model->save(false)) {
print_r("asd");
}
Il insère NULL dans toutes les colonnes et imprime 'asd'
Users.php (modèle)
<?php
namespace app\modules\users\models;
use Yii;
use yii\base\Model;
use yii\db\ActiveRecord;
use yii\helpers\Security;
use yii\web\IdentityInterface;
use app\modules\users\models\UserType;
class Users extends ActiveRecord implements IdentityInterface
{
public $id;
public $first_name;
public $last_name;
public $email;
public $password;
public $rememberMe;
public $confirm_password;
public $user_type;
public $company_name;
public $status;
public $auth_key;
public $confirmed_at;
public $registration_ip;
public $verify_code;
public $created_at;
public $updated_at;
public $_user = false;
public static function tableName() {
return 'users';
}
public function rules() {
return [
//First Name
'FirstNameLength' => ['first_name', 'string', 'min' => 3, 'max' => 255],
'FirstNameTrim' => ['first_name', 'filter', 'filter' => 'trim'],
'FirstNameRequired' => ['first_name', 'required'],
//Last Name
'LastNameLength' => ['last_name', 'string', 'min' => 3, 'max' => 255],
'LastNameTrim' => ['last_name', 'filter', 'filter' => 'trim'],
'LastNameRequired' => ['last_name', 'required'],
//Email ID
'emailTrim' => ['email', 'filter', 'filter' => 'trim'],
'emailRequired' => ['email', 'required'],
'emailPattern' => ['email', 'email'],
'emailUnique' => ['email', 'unique', 'message' => 'Email already exists!'],
//Password
'passwordRequired' => ['password', 'required'],
'passwordLength' => ['password', 'string', 'min' => 6],
//Confirm Password
'ConfirmPasswordRequired' => ['confirm_password', 'required'],
'ConfirmPasswordLength' => ['confirm_password', 'string', 'min' => 6],
['confirm_password', 'compare', 'compareAttribute' => 'password'],
//Admin Type
['user_type', 'required'],
//company_name
['company_name', 'required', 'when' => function($model) {
return ($model->user_type == 2 ? true : false);
}, 'whenClient' => "function (attribute, value) {
return $('input[type=\"radio\"][name=\"Users[user_type]\"]:checked').val() == 2;
}"], #'enableClientValidation' => false
//Captcha
['verify_code', 'captcha'],
[['auth_key','registration_ip','created_at'],'safe']
];
}
public function attributeLabels() {
return [
'id' => 'ID',
'first_name' => 'First Name',
'last_name' => 'Last Name',
'email' => 'Email',
'password' => 'Password',
'user_type' => 'User Type',
'company_name' => 'Company Name',
'status' => 'Status',
'auth_key' => 'Auth Key',
'confirmed_at' => 'Confirmed At',
'registration_ip' => 'Registration Ip',
'confirm_id' => 'Confirm ID',
'created_at' => 'Created At',
'updated_at' => 'Updated At',
'verify_code' => 'Verification Code',
];
}
//custom methods
public static function findIdentity($id) {
return static::findOne($id);
}
public static function instantiate($row) {
return new static($row);
}
public static function findIdentityByAccessToken($token, $type = null) {
throw new NotSupportedException('Method "' . __CLASS__ . '::' . __METHOD__ . '" is not implemented.');
}
public function getId() {
return $this->id;
}
public function getAuthKey() {
return $this->auth_key;
}
public function validateAuthKey($authKey) {
return $this->auth_key === $auth_key;
}
public function validatePassword($password) {
return $this->password === $password;
}
public function getFirstName() {
return $this->first_name;
}
public function getLastName() {
return $this->last_name;
}
public function getEmail() {
return $this->email;
}
public function getCompanyName() {
return $this->company_name;
}
public function getUserType() {
return $this->user_type;
}
public function getStatus() {
return $this->status;
}
public function getUserTypeValue() {
$UserType = $this->user_type;
$UserTypeValue = UserType::find()->select(['type'])->where(['id' => $UserType])->one();
return $UserTypeValue['type'];
}
public function getCreatedAtDate() {
$CreatedAtDate = $this->created_at;
$CreatedAtDate = date('d-m-Y h:i:s A', strtotime($CreatedAtDate));
return $CreatedAtDate;
}
public function getLastUpdatedDate() {
$UpdatedDate = $this->updated_at;
if ($UpdatedDate != 0) {
$UpdatedDate = date('d-m-Y h:i:s A', strtotime($UpdatedDate));
return $UpdatedDate;
} else {
return '';
}
}
public function register() {
if ($this->validate()) {
return true;
}
return false;
}
public static function findByEmailAndPassword($email, $password) {
$password = md5($password);
$model = Yii::$app->db->createCommand("SELECT * FROM users WHERE email ='{$email}' AND password='{$password}' AND status=1");
$users = $model->queryOne();
if (!empty($users)) {
return new Users($users);
} else {
return false;
}
}
public static function getConfirmationLink() {
$characters = 'abcedefghijklmnopqrstuvwxyzzyxwvutsrqponmlk';
$confirmLinkID = '';
for ($i = 0; $i < 10; $i++) {
$confirmLinkID .= $characters[Rand(0, strlen($characters) - 1)];
}
return $confirmLinkID = md5($confirmLinkID);
}
}
Toute aide est appréciable. Aidez-moi, s'il vous plaît.
Cela pourrait être un problème lié à vos règles de validation.
Essayez, en guise de test, de sauvegarder le modèle sans aucune validation de la manière suivante:
$model->save(false);
Si le modèle est enregistré, vous êtes en conflit avec vos règles de validation. Essayez de supprimer sélectivement vos règles de validation pour trouver le conflit de validation.
Si vous avez redéfini la valeur présente dans l'enregistrement actif, vous n'affectez pas la valeur à la var pour la base de données, mais pour cette nouvelle var, vous n'êtes pas enregistré.
Essayez de supprimer la var dupliquée (seuls les vars non mappés à la base de données doivent être déclarés ici.)
Je suppose que $model->load()
renvoie false
, appelez $model->errors
pour voir l'erreur du modèle.
$model->load();
$model->validate();
var_dump($model->errors);
Comme @scaisEdge le suggère, essayez de supprimer tous les champs liés aux tables de votre Utilisateurs class
class Users extends ActiveRecord implements IdentityInterface
{
/* removed because this properties is related in a table's field
public $first_name;
public $last_name;
public $email;
public $password;
public $user_type;
public $company_name;
public $status;
public $auth_key;
public $confirmed_at;
public $registration_ip;
public $verify_code;
public $created_at;
public $updated_at;
public $user_type;
public $company_name;
public $status;
public $auth_key;
public $confirmed_at;
public $registration_ip;
public $verify_code;
public $created_at;
public $updated_at;
*/
// this is properties that not related to users table
public $rememberMe;
public $confirm_password;
public $_user = false;
public static function tableName() {
return 'users';
}
/* ........... */
}
L’autre solution mentionnée $model->save(false);
. Il ne s'agit que d'une solution temporaire et vous devez toujours rechercher la raison pour laquelle la fonctionnalité de sauvegarde ne fonctionne pas.
Voici des étapes supplémentaires pour aider à diagnostiquer le problème réel:
_form
a le nom correct, et Vous faites tout le personnel correct. Je pense que vous devez ajouter une ligne pour confirmer la validation du mot de passe
if(!$CheckExistingUser) {
$auth_key = $model->getConfirmationLink();
$password = md5($post['password']);
$registration_ip = Yii::$app->getRequest()->getUserIP();
$created_at = date('Y-m-d h:i:s');
$model->auth_key = $auth_key;
$model->password = $password;
$model->confirm_password= md5($post["confirm_password"]); /// add this line
$model->registration_ip = $registration_ip;
$model->created_at = $created_at;
Et aussi après cette condition, vérifiez les attributs du modèle et les erreurs comme ceci:
if($model->save()) {
print_r("asd");
}else{
var_dump($model);exit;}
Essaye ça:
$model->save(false);
et si cela fonctionne, vérifiez vos règles de modèle () et vos règles de formulaire () si ayant les mêmes règles. la cause est généralement les champs obligatoires de votre table.
Et il y a peut-être une autre raison de ne pas enregistrer le modèle - vous avez la propriété de votre classe Utilisateurs et, avant d’enregistrer du formulaire, sa réinitialisation à NULL.
Donc, si vous définissez $ model-> saveAttributes ('favorite_book' => $ model-> favorite_book), mais que vous avez alors déclaré dans la classe Users public $ favorite_book - vous obtiendrez ce champ vide dans la base de données.
si votre type de colonne dans votre table est "entier" et que vos données sont "chaîne", vous risquez de voir cette erreur. Vous devez vérifier votre type de données et réessayer.
Je suppose que votre type de colonne est entier, vous devriez écrire le code suivant:
$model->created_at=time();//1499722038
$model->save();
mais votre type de colonne est une chaîne, vous devriez écrire le code suivant:
$model->created_at=date('d/m/Y');//11/07/2017
$model->save();