如何在PHP中检查多个条件

问题描述 投票:0回答:3

我想检查表单的安全性输入。人们应该用“允许”,“允许”或“允许”等字来回答安全问题。这3个答案都被接受了。

我尝试下面的代码,但如果我输入这3个答案中的一个,它就不会通过if循环。我做错了什么?

if( ! isset($_POST['security']) || empty($_POST['security']) || $_POST['security'] != 'allow' || $_POST['security'] != 'Allow' || $_POST['security'] != 'ALLOW') {
      $error .= "<p class=\"message-error\">" . $messages['security_invalid'] . "</p>";
}
php
3个回答
3
投票

试试这个:

if( empty($_POST['security']) or strtolower($_POST['security']) != 'allow') {
    $error .= "yaddayadaa";
}

使用empty()足以检查它是否未设置,或为空,或为零或为空。然后,只需小写帖子并检查一次不是allow


2
投票

当您尝试比较字符串值时,问题基本上就出现了。那是因为你需要像下面这样测试它:

if (!isset($_POST['security']) || empty($_POST['security']) || ($_POST['security'] != 'allow' && $_POST['security'] != 'Allow' && $_POST['security'] != 'ALLOW'))

事实上,字符串值可以是其中一个字符串,当然,如果例如allow,则$_POST['security'] != 'Allow'将失败。


0
投票
$security = 'Allow';
var_dump($security != 'allow' || $security != 'Allow');

输出:

bool(true)

第一个比较$security != 'allow'评估为true,这使表达式短路。

您可以将表达式重写为:

$security = 'Allow';
var_dump($security != 'allow' && $security != 'Allow' && $security != 'ALLOW');

输出:

bool(false)

这仍然有点笨拙。

您最终可能需要在多个地方检查错误。拆分验证可能有助于清理问题。

<?php  
$security = isset($_POST['security']) ? $_POST['security'] : null;
$email    = isset($_POST['email'])    ? $_POST['email']    : null;
$errors   = [];

if(!in_array($security, array('allow', 'Allow', 'ALLOW')))
    $errors['security'] = 'Invalid security answer.';
if(filter_var($email, FILTER_VALIDATE_EMAIL) === false)
    $errors['email'] = 'Invalid email address.';

$has_errors = (bool) count($errors);

$error = '';
foreach($errors as $error)
    $error .= "<p class=\"message-error\">" . $error . "</p>";
© www.soinside.com 2019 - 2024. All rights reserved.