model->save() Not Working In Yii2
Solution 1
It could be a problem related with your validation rules.
Try, as a test, to save the model without any validation in this way:
$model->save(false);
If the model is saved you have conflict with your validation rules. Try selectively removing your validation rule(s) to find the validation conflict.
If you have redefined the value present in active record you don't assign the value to the var for db but for this new var and then are not save.
Try removing the duplicated var.. (only the vars non mapped to db should be declared here.)
Solution 2
I guess $model->load()
returns false
, call $model->errors
to see model's error.
$model->load();
$model->validate();
var_dump($model->errors);
Solution 3
Check model saving error like this :
if ($model->save()) {
} else {
echo "MODEL NOT SAVED";
print_r($model->getAttributes());
print_r($model->getErrors());
exit;
}
Solution 4
As @scaisEdge suggest, try removing all table related field in your Users 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';
}
/* ........... */
}
Solution 5
The other solution mentioned $model->save(false);
. That is just a temporary workaround, and you should still find the actual reason why the save functionality is not working.
Here are additional steps to help diagnose the actual issue:
- check that
_form
input field has the proper name, and - check that if you have added any dropdown functionality, then check whether it's working properly or not
Nana Partykar
A Fan Account. Dedicated To Legendary Nana Patekar SoReadyToHelp "A Silent Toilet Leak Could Waste From 30 To 500 Gallons/Day!" ~ Save Water. Save Lives.
Updated on August 23, 2022Comments
-
Nana Partykar over 1 year
Previously, I was not using
$model->save()
function for inserting or updating any data. I was simply usingcreateCommand()
to execute query and it was working successfully. But, my team members asked me to avoidcreateCommand()
and use$model->save();
Now, I started cleaning my code and problem is
$model->save();
not working for me. I don't know where i did mistake.UsersController.php (Controller)
<?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"); } } } } . . }
Everything OK in this except
$model->save();
Not printing 'asd' as i echoed it.And, if i write
else if ($model->load(Yii::$app->request->post() && $model->validate()) { }
It's not entering to this
if
condition.And, if i write
if($model->save(false)) { print_r("asd"); }
It insert NULL to all columns and print 'asd'
Users.php (model)
<?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); } }
Any help is appreciable. Please Help me.
-
Nana Partykar over 8 yearsHi Mr Scais. When i use
$model->save(false);
. NULL is getting inserted to table. -
Nana Partykar over 8 yearsI Updated my question with Model Mr @Scais.
-
ScaisEdge over 8 yearsBut you have redifined the value present in active record... I have update the answer... You are not using insert anymore.. you are using active record
-
Nana Partykar over 8 yearsSorry @Scais. I didn't get. Really Sorry.
-
ScaisEdge over 8 yearsYou do not have to be sorry this is a mistake that I have made several times ... The important thing is that the answer is correct and that your programs to operate it properly
-
Nana Partykar over 8 yearsOk @Scais. If you don't mind, Can you point out the changes i need to do in my Users.php Model. If possible, can you give One example.
-
ScaisEdge over 8 yearsIs easy simply remove Or comment) the vars with same name of the column table of your user table... You can do it progressively if you want test....
-
Nana Partykar over 8 yearsHi @Nuriddin. Glad to see you bro. No insertion in table. Help me man. Past 6 Hours, I have been stuck to it.
-
Nuriddin Rashidov over 8 yearsHi @Partykar Are u test my answer
-
Nana Partykar over 8 yearsYeah. I did. Even, i add
captcha
to it. But, no result man. Now, my brain also stopped working. One more answer @Scais Has given above, but i'm not able to understand what he is saying. Do something @nuriddin. -
Nuriddin Rashidov over 8 yearsCan u post the result of this : if($model->save() )-> see my post :-> var_dump($model);
-
Nana Partykar over 8 yearsIt printed lot of things @nuriddin.
["id"]=> NULL ["first_name"]=> string(6) "danish" ["last_name"]=> string(4) "enam" ["email"]=> string(14) "[email protected]" ["password"]=> string(32) "e10adc3949ba59abbe56e057f20f883e" ["rememberMe"]=> NULL ["confirm_password"]=> string(6) "123456" ["user_type"]=> string(1) "1" ["company_name"]=> string(0) "" ["status"]=> NULL ["auth_key"]=> string(32) "5276a550bf50d7bdd2067a63c32e0daf" ["confirmed_at"]=> NULL
Thses are the first few lines -
Nuriddin Rashidov over 8 yearsCan you do this, i think you confirm_password and password not equal to each other because of md5, pls try $model->confirm_password= md5($post["confirm_password"]); for test reason. If it is work, we can do this yii2 way ;)
-
Nana Partykar over 8 yearsLet us continue this discussion in chat.
-
Nana Partykar over 8 yearsThanks For Answering.
-
ScaisEdge over 8 yearsThis wan not an easy answer. I hoped it was also accepted as well as helpful
-
Nana Partykar over 8 yearsYeah @Scais. From Yesterday I was banging my head. Now issue is resolved. And, at last your suggestion/answer came into existence. Thank You so much for spending time. It is always an honour to get answer/comment from you.
-
ScaisEdge over 8 yearsI have see you take the wrong road but i not insisted in my answer. (I know by my personal experience was right). I have hoped you return to my suggestion. The knowledge in our fields is a precoius stuff. Good Work and thanks..
-
David over 8 yearsdid it help you? cause i can't think of any other suggestion
-
Nuriddin Rashidov over 8 yearsHi @NanaPartykar, thanks for remembering me my friend. These day i was busy with my new projects and is going great. How about you?