Previously, I was not using $model->save()
function for inserting or updating any data. I was simply using createCommand()
to execute query and it was working successfully. But, my team members asked me to avoid createCommand()
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 appmodulesuserscontrollers;
use Yii;
use yiiwebNotFoundHttpException;
use yiifiltersVerbFilter;
use yiiswiftmailerMailer;
use yiifiltersAccessControl;
use yiiwebResponse;
use yiiwidgetsActiveForm;
use appmodulesusersmodelsUsers;
use appcontrollersCommonController;
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 appmodulesusersmodels;
use Yii;
use yiibaseModel;
use yiidbActiveRecord;
use yiihelpersSecurity;
use yiiwebIdentityInterface;
use appmodulesusersmodelsUserType;
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.
Есть код такого вида:
$model=new Products();
$model=$model->findOne(['id'=>1]);
$model->name="Новое название";
$model->save();
То есть нужно перезаписать поле но save не работает и подсвечивается в IDE как «not found in class null|static»
Если убрать строчку $model=$model->findOne([‘id’=>1]);
то создает новый товар, а как этот отредактировать то ? Хоть убейте не вижу тут ошибки.
class Products extends yiidbActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'products';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['name', 'url', 'price','quantity','category_id','options_id','mark','model'], 'required'],
[['price'], 'number'],
[['full_desc'], 'string'],
[['category_id','options_id','quantity','status'], 'integer'],
[['name', 'url'], 'string', 'max' => 50],
[['short_desc'], 'string', 'max' => 250]
];
}
}
P.S я знаю что кроме name есть еще поля и они обозначены как required я их тоже указываю при редактировании просто не писал в примере чтобы не усложнять читабельность
Не могу понять почему не сохраняются данные в БД
При вызове метода save(false) у заполненной модели, создаются пустые поля в БД (хотя вроде как все правила для полей прописал):
Уж сижу несколько часов.
Контроллер (точнее один метод из него)
Код: Выделить всё
public function actionAddDriver(){
$modelDriver = new Driver();
$postRequest = Yii::$app->request->post();
$isValidate = false;
if($modelDriver->load($postRequest)){
if($modelDriver->validate()){
var_dump($modelDriver, true);
$modelDriver->save(false);
$isValidate = true;
}
}
return $this->render('addDriver',['modelDriver'=>$modelDriver, 'isValidate'=>$isValidate]);
}
Модель
Код: Выделить всё
<?php
namespace appmodels;
use yiidbActiveRecord;
class Driver extends ActiveRecord{
public $name;
public $lastname;
public $patronymic;
public $percent;
public static function tableName(){
return 'drivers';
}
public function getOrder(){
return $this->hasMany(Order::className(),['driver_id'=>'id']);
}
public function attributeLabels(){
return [
'name'=>'Имя таксиста',
'lastname'=>'Фамилия таксиста',
'patronymic'=>'Отчество таксиста',
'percent' => 'Процент'
];
}
public function rules(){
return [
[['name','percent'],'required'],
[['name','lastname','patronymic'], 'string', 'length'=>[3,50]],
['percent','number'],
];
}
}
Вид:
Код: Выделить всё
<?php
use yiiwidgetsActiveForm;
use yiihelpersHtml;
?>
<?php if($isValidate):?>
<div class="alert alert-success alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
Запись добавлена!
</div>
<?php else:?>
<div class="alert alert-warning alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
ОШИБКА добавления!
</div>
<?php endif?>
<?php
$form = ActiveForm::begin(['id'=>'form-edit-driver','method'=>'post']);
echo $form->field($modelDriver,'name')->textInput();
echo $form->field($modelDriver,'lastname')->textInput();
echo $form->field($modelDriver,'patronymic')->textInput();
echo $form->field($modelDriver,'percent')->textInput();
echo Html::submitButton('Добавить',['class'=>'btn btn-success']);
ActiveForm::end();
Даже не знаю с чем может быть проблема) знаю что из-за rules может не добавлять в БД, но вроде верно написал в правилах модели.
Previously, I was not using $model->save()
function for inserting or updating any data. I was simply using createCommand()
to execute query and it was working successfully. But, my team members asked me to avoid createCommand()
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 appmodulesuserscontrollers;
use Yii;
use yiiwebNotFoundHttpException;
use yiifiltersVerbFilter;
use yiiswiftmailerMailer;
use yiifiltersAccessControl;
use yiiwebResponse;
use yiiwidgetsActiveForm;
use appmodulesusersmodelsUsers;
use appcontrollersCommonController;
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 appmodulesusersmodels;
use Yii;
use yiibaseModel;
use yiidbActiveRecord;
use yiihelpersSecurity;
use yiiwebIdentityInterface;
use appmodulesusersmodelsUserType;
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.
Hi Mr Scais. When i use $model->save(false);
. NULL is getting inserted to table.
I Updated my question with Model Mr @Scais.
But 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
Sorry @Scais. I didn’t get. Really Sorry.
You 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
Ok @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.
Is 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….
Hi @Nuriddin. Glad to see you bro. No insertion in table. Help me man. Past 6 Hours, I have been stuck to it.
Hi @Partykar Are u test my answer
Yeah. 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.
Can u post the result of this : if($model->save() )-> see my post :-> var_dump($model);
It 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
Can 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
Thanks For Answering.
This wan not an easy answer. I hoped it was also accepted as well as helpful
Yeah @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.
I 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..
did it help you? cause i can’t think of any other suggestion
Hi @NanaPartykar, thanks for remembering me my friend. These day i was busy with my new projects and is going great. How about you?
2 мая 2011
Те, кто раньше не работал с Yii, на первых порах часто совершают очень нехорошую ошибку:
$model = new Post(); if(!empty($_POST['Post'])) { $model->attributes = $_POST['Post']; $model->save(); $this->redirect(array()); } $this->render('form', array( 'model' => $model, ));
Вот такой, казалось бы, простой код убить может немало нервов. Дело в том, что save
запросто может не сработать, если не выполнится правило валидации. А т.к. мы этого не проверили, произойдёт редирект без каких-либо признаков ошибки.