Yii2;代码首先在块中运行"else"然后在块之前运行代码"if"?



我完全不知道为什么会发生这种情况,而且它发生在大约 50% 的时间内。

我检查了用户是否存在电子邮件和姓氏,如果他们存在,请运行一些代码。如果用户不存在,则创建用户,然后运行一些代码。

我已经对虚拟数据进行了各种测试,即使用户不存在,它也会首先创建它们,然后在"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();
}

我试过刷新缓存。我已经尝试过使用Yii::$app->db->createCommand()的原始 SQL 查询,但似乎没有任何效果。我完全被难住了。

有谁知道为什么它会首先创建用户,然后在 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');
}

这是多次尝试后的答案:

使用ActiveForm小部件传递"ajaxParam"参数,以定义如果请求是ajax请求时将发送的GET参数的名称。我将参数命名为"ajax"。

以下是ActiveForm 的开头:

$form = ActiveForm::begin([
'id' => 'complete-form',
'ajaxParam' => 'ajax'
])

然后我在控制器中添加了这个检查:

if (Yii::$app->request->get('ajax') || Yii::$app->request->isAjax) {
return false;
}

这是一个 ajax 问题,所以非常感谢 Yupik 指出我(接受他的回答,因为它将我带到这里)。

您可以在模型中进行如下验证:

public function rules() { return [ [['email'], 'functionName'], [['lastname'], 'functionforlastName'], ];}
public function functionName($attribute, $params) {
$usercheck=User::find()->where(['email' => $email])->one();
if($usercheck)
{
$this->addError($attribute, 'Email already exists!');
}  
}

并为姓氏创建/应用相同的函数。

放入表单字段电子邮件和姓氏 => ['enableAjaxValidation' => true]

在控制器中创建函数中

use yiiwebResponse;
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())) 
{ 
//place your code here 
}

'enableAjaxValidation' => false添加到视图中的 ActiveForm 参数中。发生这种情况是因为 yii 向您的操作发送请求以验证此模型,但在您的if语句之前不会处理它。

相关内容

最新更新