Yii2 ошибка сохранения модели

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">&times;</button>
            Запись добавлена!
        </div>
    <?php else:?>
        <div class="alert alert-warning alert-dismissable">
            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</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 запросто может не сработать, если не выполнится правило валидации. А т.к. мы этого не проверили, произойдёт редирект без каких-либо признаков ошибки.

  • Yii2 вывести сообщение об ошибке
  • Yesterday i get up very early текст содержит разные ошибки
  • Yes of course not ошибка
  • Yealink zadarma ошибка регистрации
  • Yealink w52p ошибка регистрации трубки