如何缩短php条件?

时间:2012-07-23 11:03:28

标签: php html if-statement switch-statement

您好我有以下问题:

我有一个表格,我想通过PHP检查一些输入错误。除此之外,我想显示有关错误的用户信息。

我遇到的问题是,我只想显示一条消息,而不是同时显示所有消息。因此,我需要过滤来自php的所有错误消息,将其限制为一个。

所以php正在寻找这个:

<?php if (isset($errors['for_a']):?><div id="errormessage">some text</div><?php endif; ?>

并且php规则是:

(case1) ... if ( isset($errors['for_a']) AND (!isset($errors['for_b'])) AND (!isset($errors['for_c'])) OR (!isset($errors['for_d'])) ...
OR
(case 2) ...AND (!isset($errors['for_b'])) AND (!isset($errors['for_c'])) AND (!isset($errors['for_d'])) ...
and so on for input field a...

所以问题是我有7个输入字段,这意味着我必须写出所有可能性。有没有办法缩短这个?

非常感谢。

更新:

好吧,也许它不够清楚我想要实现的目标。

我没有显示错误消息的问题。这很好用。每个特定输入字段的每条错误消息都可以正确显示。

问题是我每个都有不同的错误信息。我把它存储在一个更维度的数组中:

if(empty($a)){$errors['a'][]="first failure for a"}
if(something else happens($a)){$errors['a'][]="second failure for a"}
...

if(empty($b)){$errors['b'][]="first failure for b"}
if(something else happens($b)){$errors['b'][]="second failure for b"}
...

显示错误消息也不是问题。

<?php if (isset($errors['a'])):?>
<?php echo "<div class='erl'>"; 
echo $errors['a'][0];
echo "</div>";          
endif;?>
<?php endif;?>

问题是同时只显示一条错误消息的条件!

所以这里有一些图形来显示我的意思:

这是目前的情况,所有错误div将同时显示:

f0

这是我想要实现的,只有一条错误消息会同时显示,从第一个输入字段开始检查:

f2

以便在显示第二个错误层之前强制用户更正第一个输入字段:

f5

希望现在能够明白。

4 个答案:

答案 0 :(得分:1)

我不确定你在问什么。通常使用表单,如果您有许多字段,则可以创建错误数组,并将错误显示为表单顶部的项目符号列表,或者与其对应的表单元素内联。

<?php
$errors = array();

if (isset($_POST['submit'])) {
    // for each form field check it's valid, if it's not add a key to the errors array, i.e.
    if (empty($_POST['name'])) {
        $errors['name'] = 'Name is a required field';
    }
}

// display form
?>

您现在将拥有一个$errors数组。如果它不是空的,那么表单有错误。然后,您可以通过以下两种方式之一显示这些错误。作为表单顶部的项目符号列表:

<!DOCTYPE html>
<html>
  <body>
    <form method="post">
<?php if (!empty($errors)): ?>
      <p>Please correct the following errors:</p>
      <ul>
<?php foreach ($errors as $error): ?>
        <li><?php echo $error; ?></li>
<?php endforeach; ?>
      </ul>
<?php endif; ?>
      <!-- the rest of your form -->
    </form>
  </body>
</html>

或与每个表单字段内联:

<form method="post">
  <div class="input">
    <label for="name">Name:</label>
    <input type="text" name="name" id="name" />
<?php if (isset($errors['name'])): ?>
    <div class="error"><?php echo $errors['name']; ?></div>
<?php endif; ?>
  </div>
</form>

希望有所帮助。

答案 1 :(得分:0)

你如何进行错误处理?

如果您只设置$errors['for_a']等,如果输入字段for_a中存在错误,您可以这样做:

if (count($errors) > 0) {
    foreach ($errors as $input => $errormsg) {
        echo '<div id="errormessage">' . $errormsg . '</div>'
    }
} else {
    // continue normally
}

答案 2 :(得分:0)

OO解决方案怎么样?类似的东西:

<?php echo $errors->show('for_a', 'some text'); ?>

其中$ errors指向一个类,只有在之前没有输出任何内容时才会输出'some text'。

答案 3 :(得分:0)

最简单的解决方案可能是使用一个globalvariable,如果你显示错误就会保留。

例如:

$errorShown = false;

一个功能:

function showError($whatError,$errArr){
  global $errorShown;
  if ((isset($errArr[$whatError])) && (!$errorShown)){
    echo $whatError;
    $errorShown = true;
  }
}

并改为调用该函数。

<?php showError('for_a',$errors); ?>