我完全失去了爲什麼會發生這種情況,而且大約有50%的時間發生。Yii2;代碼首先在「else」塊中運行,然後在「if」塊之前運行代碼?
我有一個檢查,看看用戶是否存在通過電子郵件和姓氏,如果他們這樣做,運行一些代碼。如果用戶不存在,則創建用戶,然後運行一些代碼。
我已經使用虛擬數據進行了各種測試,即使用戶不存在,它也會先創建它們,然後在「if」塊中運行代碼。
這是我的。
if (User::existsByEmailAndLastName($params->email, $params->lastName)) {
var_dump('user already exists');
} else {
User::createNew($params);
var_dump("Creating a new user...");
}
這裏是各自的方法:
public static function existsByEmailAndLastName($email, $lastName) {
return User::find()->where([
'email' => $email,
])->andWhere([
'last_name' => $lastName
])->one();
}
public static function createNew($params) {
$user = new User;
$user->first_name = $params->firstName;
$user->last_name = $params->lastName;
$user->email = $params->email;
$user->address = $params->address;
$user->address_2 = $params->address_2;
$user->city = $params->city;
$user->province = $params->province;
$user->country = $params->country;
$user->phone = $params->phone;
$user->postal_code = $params->postal_code;
return $user->insert();
}
我已經試過清空緩存。我試過用原始SQL查詢使用Yii::$app->db->createCommand()
,但似乎沒有任何工作。我完全被難住了。
有誰知道它爲什麼會先創建用戶,然後在if語句中進行檢查?
與控制器代碼編輯:
public function actionComplete()
{
if (Yii::$app->basket->isEmpty()) {
return $this->redirect('basket', 302);
}
$guest = Yii::$app->request->get('guest');
$params = new CompletePaymentForm;
$post = Yii::$app->request->post();
if ($this->userInfo || $guest) {
if ($params->load($post) && $params->validate()) {
if (!User::isEmailValid($params->email)) {
throw new UserException('Please provide a valid email.');
}
if (!User::existsByEmailAndLastName($params->email, $params->lastName)) {
User::createNew($params);
echo "creating new user";
} else {
echo "user already exists";
}
}
return $this->render('complete', [
'model' => $completeDonationForm
]);
}
return $this->render('complete-login-or-guest');
}
這裏的多次嘗試後回答:
傳遞一個「ajaxParam」參數與的ActiveForm控件定義GET參數,這將是名如果請求是ajax請求,則發送。我給我的參數命名爲「ajax」。
下面介紹一下的ActiveForm的開頭是這樣的:
$form = ActiveForm::begin([
'id' => 'complete-form',
'ajaxParam' => 'ajax'
])
然後,我在我的控制器中添加此檢查:
if (Yii::$app->request->get('ajax') || Yii::$app->request->isAjax) {
return false;
}
這是一個AJAX的問題,所以非常感謝幫到尤皮克指向我(接受他的回答,因爲它引導我到這裏)。
在創建功能位置這個'if'叫? – Yupik
@Yupik它在控制器內部被調用。我注意到一些非常奇怪的東西。它與使用Active表單驗證表單輸入有關。顯然,如果我運行'validate()'方法,它將運行整個控制器方法(並抑制任何輸出或進行奇怪的重定向),然後再次加載控制器方法。我猜這就是這個錯誤發生的原因。它第一次運行控制器方法來驗證輸入,然後創建一個新用戶,它再次調用該方法,但到那時,用戶已經創建......至少,這是我認爲正在發生的事情。 – 9997
顯示控制器代碼 –