【问题标题】:Validating radio buttons in php验证 php 中的单选按钮
【发布时间】:2013-08-01 05:11:24
【问题描述】:

我是 PHP 新手,我正在尝试编写代码来测试用户是否点击了单选按钮以响应调查问题。有许多单选按钮。如果他们没有点击一个,那么我想向用户发出错误。我尝试了几种方法,但没有找到任何有效的方法。这是我当前的代码和我收到的错误消息。对于 PHP 脚本,我已经尝试了以下三个示例:

    ....

    if ($_POST['degree_type'] == "MS"||"MA"||"MBA"||"JD"||"PhD") {
        $degree_type = ($_POST['degree_type']); 
    } else if ($_POST['degree_type'] == null) {
        $errors[] = 'Please select a degree type.';
    }

    if (isset($_POST['degree_type'])) {
      $errors[] = 'Please select a degree type.';
    } else {
      $degree_type= $_POST['degree_type'];
    }

   if (array_key_exists('degree_type', $_POST)) {
      $degree_type = ($_POST['degree_type']); 
    } else {
      $errors[] = 'Please select a degree type.';
    }
    ....

这是我的 html,位于同一页面中,位于 PHP 下方。

          <table>
            <tr>
              <td class="span6">What type of degree?</td>
              <td class="span6">
                      <input type="radio" name="degree_type" value="MA"
                        <?php if (($_POST['degree_type']) == 'MA') {echo 'checked="checked"';} ?>
                      >MA
                      <input type="radio" name="degree_type" value="MS"
                        <?php if (($_POST['degree_type']) == 'MS') {echo 'checked="checked"';} ?>
                      >MS
                      <input type="radio" name="degree_type" value="MBA"
                        <?php if (($_POST['degree_type']) == 'MBA') {echo 'checked="checked"';} ?>
                      >MBA
                      <input type="radio" name="degree_type" value="JD"
                        <?php if (($_POST['degree_type']) == 'JD') {echo 'checked="checked"';} ?>
                      >JD
              </td>
            </tr>
           ETC....

我在每个引用单选按钮的 HTML 行上都收到“未定义索引”错误。我知道这在 JavaScript 中可能更容易做到,但我对 JS 了解不多......非常感谢详细的回复!

谢谢!

【问题讨论】:

  • if else语句的第二组是否应该使用!isset而不是isset,目前有post值时会报错

标签: php forms validation radio-button


【解决方案1】:

如果您在 HTML 页面上遇到未定义的错误,只需将isset() 检查添加到您打印出值的逻辑。例如:

<input type="radio" name="degree_type" value="JD" <?php if (($_POST['degree_type']) == 'JD') {echo 'checked="checked"';} ?> >JD

变成

<input type="radio" name="degree_type" value="JD" <?php if (isset($_POST['degree_type']) && $_POST['degree_type'] == 'JD') {echo 'checked="checked"';} ?>>JD

【讨论】:

  • 它有效,但不能解决根本问题。只是处理症状!
  • 只是为了确定......在检查学位类型之前,您实际上是在提交表单(即使用提交按钮),对吧?
【解决方案2】:

PHP 中的“未定义索引”错误意味着您在表达式中使用了未定义的变量。例如,当你这样做时:

<?php if (($_POST['degree_type']) == 'MA') {echo 'checked="checked"';} ?>

$_POST['degree_type'] 未定义。变量未定义有几个不同的可能原因。我必须查看 PHP 文件的其余部分才能知道确切的原因。

其中一个原因可能是表单未正确提交。另一个原因可能是在提交表单之前对表达式进行了评估。

无论哪种方式,下面的代码都应该可以工作。请注意,在尝试验证每个字段或比较它的值之前,我正在检查是否设置了每个字段。

注意: 显然,您必须有一个正确的 HTML 文档类型、打开和关闭正文标签等。本示例中的 HTML 只是页面的表单部分。

 <!-- myform.php -->
    <form name="my-form" method="POST" action="/myform.php">

        <span>What degree do you have?</span>
        <label for="bs">BS</label>
        <input type="radio" name="degree" id="bs" value="BS" <?php if(isset($degree) && $degree == 'BS') echo 'checked="checked"';?> />

        <label for="ma">MA</label>
        <input type="radio" name="degree" id="ma" value="MA" <?php if(isset($degree) && $degree == 'MA') echo 'checked="checked"';?> />

        <label for="phd">PHD</label>
        <input type="radio" name="degree" id="phd" value="PHD" <?php if(isset($degree) && $degree == 'PHD') echo 'checked="checked"';?> />


        <span>Which do you like better?</span>
        <label for="steak">steak</label>
        <input type="radio" name="food" id="steak" value="steak" <?php if(isset($food) && $food == 'steak') echo 'checked="checked"';?> />

        <label for="lobster">lobster</label>
        <input type="radio" name="food" id="lobster" value="lobster" <?php if(isset($food) && $food == 'lobster') echo 'checked="checked"';?> />

        <input type="hidden" name="submitted" value="submitted" />
        <input type="submit" name="submit" value="submit" />

    </form>

    <?php
    if (isset($_POST['submitted'])) {

        $errors = array();

        if (isset($_POST['degree'])) {
            $degree = $_POST['degree'];
        } else {
            $errors[] = 'Please select your degree type.';
        }

        if (isset($_POST['food'])) {
            $food = $_POST['food'];
        } else {
            $errors[] = 'Please select your food preference.';
        }

        if (count($errors) > 0) {
            foreach($errors as $error) {
                echo $error;
            }
        } else {
            echo 'Thank you for your submission.';
        }
    }
    ?>

【讨论】:

    【解决方案3】:

    您看到这些通知的原因是因为 $_POST['degree_type'] 根本没有设置。要么是错字,要么只是没有提交(因为您在提交表单之前没有选择任何内容)。

    另请注意,

    if ($_POST['degree_type'] == "MS"||"MA"||"MBA"||"JD"||"PhD") {
    

    这样不行。这将检查 $_POST['degree_type'] == "MS" 或:"MS" is truthy (always true)"MA" is truthy (always true)... 看看我要去哪里?

    if (in_array($_POST['degree_type'], array("MS", "MA", "MBA", "JS", "PhD")) {
    

    是更好的选择。


    无关的:

    你真的应该使用&lt;label&gt; 元素来标记你的标签。示例:

    <label><input type="radio" name="degree_type" value="MA"> MA</label>.
    

    这将有 MA 可点击。

    【讨论】:

    • 不是错字;如果没有选择单选按钮组的成员,则不会创建 $_POST 中的键。 in_array() 因此仍会产生“未定义索引”通知。不过,关于逻辑错误的好地方。
    • @AaronMiller:“要么是错字,要么就是没有提交”,所以是的,我已经说过了。我将进行编辑以使其更清晰。
    • 谢谢,但我仍然收到未定义索引通知。感谢您提供有关使用标签的说明,忘记包括在内。
    【解决方案4】:

    当提交的表单没有选择单选按钮组(定义为name 属性相同的单选按钮组)的成员时,提交的数据根本不包括该名称。

    这就是您收到“未定义索引”错误的原因(实际上是一个通知);当您测试$_POST['degree_type'] 的值,并且没有选择名为“degree_type”的单选按钮时,$_POST['degree_type'] 根本不存在。

    幸运的是,这简化了您的验证任务。通过调用array_key_exists('degree_type', $_POST),您可以找出键是否存在,从而确定是否选择了单选按钮,而不会提示PHP“未定义索引”通知。如果函数调用返回 true,您就知道选择了一个单选按钮;否则,您知道不是,这就是您的验证试图确定的内容。因此:

    if (array_key_exists('degree_type', $_POST)) {
      $degree_type = $_POST['degree_type'];
    }
    else {
      array_push($errors, "Please select a degree type.");
    };
    

    会干净利落地完成你的任务。

    【讨论】:

    • 感谢您的解释。不幸的是,使用这种方法我仍然收到相同的错误消息。
    • 仍然从您的验证代码或您的表单重新显示代码(即,您在哪里绘制单选按钮)收到通知?
    • PHP 应该执行short-circuit evaluation,这意味着像if (array_key_exists('degree_type', $_POST) &amp;&amp; $_POST['degree_type'] == 'MA') { ... } 这样的东西只会评估&amp;&amp; 条件的右侧,如果左侧评估为真。假设是这种情况,修改表单重新显示代码中的条件以类似于该示例应该会阻止它们生成“未定义索引”通知。
    【解决方案5】:
    //set a default 
    $degree_type = "";
    if (isset($_POST['degree_type'])) {
        $degree_type = $_POST['degree_type']; 
    } else {
        $errors[] = 'Please select a degree type.';
    }
    

    然后代替使用

    if (($_POST['degree_type']) == 'MA') 
    

    对于您的检查,请使用:

    if($degree_type == 'MA')
    

    未定义索引表示您使用的键尚未初始化。所以 $_POST['degree_type'] 直到第一次提交表单之后才会出现。

    【讨论】:

    • 发生了什么?它仍然是未定义的索引吗?您是否更换了所有 if($_POST['degree_type'] == "some degree") echo "checked";与 $degree_type?
    • 是的,我仍然在 html 上获得未定义的索引。对于检查,我确实将所有 if($_POST['degree_type'] 替换为 $degree_type。
    • 您的 if else 语句包含在哪里,它们是否在另一个 if 语句中以检查表单已提交?
    • 是的,它们被包裹在一个条件 if (isset($POST_['submitted'])) ... 语句中
    • 放置 $degree_type = "";在该行上方检查提交的内容。也只需检查它是 $_POST['submitted']
    猜你喜欢
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2012-12-01
    • 2013-10-02
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多