Раньше я не использовал функцию $model->save()
для вставки или обновления любых данных. Я просто использовал createCommand()
для выполнения запроса, и он успешно работал. Но, мои члены команды попросили меня избегать createCommand()
и использовать $model->save();
Теперь я начал очищать свой код, а проблема – $model->save();
не работает для меня. Я не знаю, где я ошибся.
UsersController.php (контроллер)
<?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('Ymd 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"); } } } } . . }
Все в порядке, кроме $model->save();
Не печатать «asd», как я его вторил.
И, если я напишу
else if ($model->load(Yii::$app->request->post() && $model->validate()) { }
Он не входит в это условие.
И, если я напишу
if($model->save(false)) { print_r("asd"); }
Он вставляет NULL во все столбцы и печатает 'asd'
Пользователи.php (модель)
<?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('dmY h:i:s A', strtotime($CreatedAtDate)); return $CreatedAtDate; } public function getLastUpdatedDate() { $UpdatedDate = $this->updated_at; if ($UpdatedDate != 0) { $UpdatedDate = date('dmY 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); } }
Любая помощь заметна. Пожалуйста помогите.
Это может быть проблема, связанная с вашими правилами проверки.
Попробуйте в качестве теста сохранить модель без какой-либо проверки следующим образом:
$model->save(false);
Если модель сохранена, у вас есть конфликт с вашими правилами проверки. Попробуйте выборочно удалить свое правило (ы) проверки, чтобы найти конфликт проверки.
Если вы переопределили значение, присутствующее в активной записи, вы не присваиваете значение var для db, а для этого нового var, а затем не сохраняете.
Попробуйте удалить дублированный var .. (здесь должны быть объявлены только символы, не отображаемые в db).
Как показано в @scaisEdge, попробуйте удалить все поля, связанные с таблицей, в классе « Пользователи »
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'; } /* ........... */ }
Вы делаете весь персонал правильным. Я думаю, u должен добавить одну строку для подтверждения подтверждения пароля
if(!$CheckExistingUser) { $auth_key = $model->getConfirmationLink(); $password = md5($post['password']); $registration_ip = Yii::$app->getRequest()->getUserIP(); $created_at = date('Ymd 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;
А также после этого условия проверяют атрибуты модели и ошибку, например:
if($model->save()) { print_r("asd"); }else{ var_dump($model);exit;}
Я думаю, $model->load()
возвращает false
, вызывает $model->errors
чтобы увидеть ошибку модели.
$model->load(); $model->validate(); var_dump($model->errors);
Попробуй это:
$model->save(false);
и если это работает, проверьте свои правила модели () и свои правила формы (), если они имеют одинаковые правила. обычно причиной являются обязательные поля в таблице.
если ваш тип столбца в вашей таблице «integer», а ваши данные «string», вы можете увидеть tis-ошибку. Вы должны проверить свой тип данных и повторить попытку.
Я полагаю, что ваш тип столбца целочисленный, вы должны написать следующий код:
$model->created_at=time();//1499722038 $model->save();
но ваш тип столбца – строка, вы должны написать следующий код:
$model->created_at=date('d/m/Y');//11/07/2017 $model->save();
в вашей модели я нашел Имя, фамилию, адрес электронной почты, пароль – обязательные поля, а в вашем контроллере вы обновляете или сохраняете только
$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;
но должны быть указаны имя и фамилия и адрес электронной почты, чтобы он выдавал ошибку проверки, чтобы проверить использование этой ошибки.
$model->load(); $model->validate(); var_dump($model->errors);
он покажет вам ошибку. исправьте ошибки, тогда модель получит сохранение. вы можете решить эту ошибку, используя сценарий или
$model->saveAttributes('favorite_book'=>$model->favorite_book,'favorite_movie'=>$model->favorite_movie);
Надеюсь, это поможет вам.