PHP表单处理顺序优先级


PHP Form Processing Order precedence

我是开发界的新手,刚刚开始学习PHP。我有一个基本表单,它尝试验证用户选择或选中的复选框。我的代码如下。我的问题是,为什么当我有我的表单的顺序如下,表单不传递值。NET, PHP或RUBY和不断传递的值是没有。

——不工作的表单代码——

<form name="checkboxes" method="post" action="form_sample_checkboxes.php">
        <input type="checkbox" name="ch1" value="net" <?php print $ch1status ?>>.NET
            <input type="hidden" name="ch1" value="no">

        <input type="checkbox" name="ch2" value="php" <?php print $ch2status ?>>PHP
        <input type="hidden" name="ch2" value="no">

        <input type="checkbox" name="ch3" value="ruby" <?php print $ch3status ?>>Ruby on Rails
        <input type="hidden" name="ch3" value="no">
        <input type="submit" name="submit" value="submit">

但是如果我的代码如下;

<form name="checkboxes" method="post" action="form_sample_checkboxes.php">
        <input type="hidden" name="ch1" value="no">
        <input type="checkbox" name="ch1" value="net" <?php print $ch1status ?>>.NET
        <input type="hidden" name="ch2" value="no">
        <input type="checkbox" name="ch2" value="php" <?php print $ch2status ?>>PHP
        <input type="hidden" name="ch3" value="no">
        <input type="checkbox" name="ch3" value="ruby" <?php print $ch3status ?>>Ruby on Rails
        <input type="submit" name="submit" value="submit">
    </form>

显示复选框。

<?php
$ch1status = "unchecked";
$ch2status = "unchecked";
$ch3status = "unchecked";
if(isset($_POST["submit"])) {
        if(isset($_POST["ch1"])) {
            if($_POST["ch1"] == "net") {
                $ch1status = "checked";
            }
        }
        if(isset($_POST["ch2"])) {
            if($_POST["ch2"] == "php") {
                $ch2status = "checked";
            }
        }
        if(isset($_POST["ch3"])) {
            if($_POST["ch3"] == "ruby") {
                $ch3status = "checked";
            }
        }
        if ($_POST["ch1"] == "no" && $_POST["ch2"] == "no" && $_POST["ch3"] == "no") {
            print "There is no such choice";
        }
}
?>
<html>
<head>
    <title>Sample form checkbxoes</title>
</head>
<body>
    <form name="checkboxes" method="post" action="form_sample_checkboxes.php">
        <input type="hidden" name="ch1" value="no">
        <input type="checkbox" name="ch1" value="net" <?php print $ch1status ?>>.NET
        <input type="hidden" name="ch2" value="no">
        <input type="checkbox" name="ch2" value="php" <?php print $ch2status ?>>PHP
        <input type="hidden" name="ch3" value="no">
        <input type="checkbox" name="ch3" value="ruby" <?php print $ch3status ?>>Ruby on Rails
        <input type="submit" name="submit" value="submit">
    </form>
<?php
if(isset($_POST["submit"])) {
    if(isset($_POST["ch1"])) {
        print $_POST["ch1"];
        print $ch1status;
    }
    if(isset($_POST["ch2"])) {
        print $_POST["ch2"];
        print $ch2status;
    }
    if(isset($_POST["ch3"])) {
        print $_POST["ch3"];
        print $ch3status;
    }
}
echo "<pre>";
print_r($_POST);
echo "</pre>";
?>
</body>
</html>
        </form>

是否有其他方法来验证用户是否没有选择任何复选框,而不是使用隐藏的表单字段

这只是浏览器的问题,而且很简单:元素具有相同的名称,后面的元素覆盖了第一个元素。

另一种验证方法是,如果一个复选框未被选中,则检查它是否设置在$POST -数组中。

未定义索引:

这是因为复选框只有在被选中时才会被发送。你可以做的一件事是在使用变量之前总是用isset检查变量(例如isset($_POST['ch1']));另一种方法是将复选框命名为相同的东西,并在名称后面加上[](例如name="languages[]"),然后像这样做:

// Create a list of languages that are OK (remember, some users are malicious)
$languages = array('net','php','ruby');
// Compile a list of the answers the user picked; force it to be an 
// array by either explicitly casting to an array, or using an empty array
//  if none chosen
$picked = isset($_POST['languages']) ? (array)$_POST['languages'] : array();
// first, use array_intersect to remove entries present in one and not the other
// i.e. invalid entries from the client or entries not picked from the whole list
// then, "flip" the array so that the values become keys, 
// because isset is faster than in_array
$valid_langs = array_flip(array_intersect($languages, $picked));
// check on languages
if (isset($valid_langs['php'])) { /* PHP picked */ }
if (isset($valid_langs['net'])) { /* NET picked */ }
if (isset($valid_langs['ruby'])) { /* Ruby picked */ }

更简单的解决方案:

<form>
    <input type="checkbox" name="php" value="yes" />
    <input type="checkbox" name="net" value="yes" />
    <input type="checkbox" name="ruby" value="yes" />
</form>

<?php
$php = $net = $ruby = 'unchecked';
if (!isset($_POST['php'],$_POST['net'],$_POST['ruby'])) {
    echo 'There is no such choice';
}
else {
    if (isset($_POST['php']) && $_POST['php'] == 'yes') {
        $php = 'checked';
    }
    if (isset($_POST['net']) && $_POST['new'] == 'yes') {
        $net = 'checked';
    }
    if (isset($_POST['ruby']) && $_POST['ruby'] == 'yes') {
        $ruby = 'checked';
    }
}
// ... snip ...

有很多方法可以做到这一点。

Php都是服务器端,所以为了防止它们提交,您需要客户端验证。最简单的客户端验证是使用javascript,或者jQuery的验证插件,如果你已经在使用jQuery(如果你计划在任何时候使用AJAX,你应该是)。

是的,你可以去掉那些隐藏的输入

您不需要这些隐藏字段。把它们去掉就可以了。

编辑:

检查这个修改

    $ch1status = "unchecked";
    $ch2status = "unchecked";
    $ch3status = "unchecked";
    if(isset($_POST["submit"])) {
        if(@$_POST["ch1"] != "") {
            $ch1status = "checked";
        }
        if(@$_POST["ch2"] != "") {
            $ch2status = "checked";
        }
        if(@$_POST["ch3"] != "") {
            $ch3status = "checked";
        }
        if (@$_POST["ch1"] . @$_POST["ch2"] . @$_POST["ch3"] == "") {
            print "There is no such choice";
        }
    }
?>
<html>
    <head>
        <title>Sample form checkbxoes</title>
    </head>
    <body>
        <form name="checkboxes" method="post" action="form_sample_checkboxes.php">
            <input type="checkbox" name="ch1" value="net" <?php echo $ch1status; ?>>.NET
            <input type="checkbox" name="ch2" value="php" <?php echo $ch2status; ?>>PHP
            <input type="checkbox" name="ch3" value="ruby" <?php echo $ch3status; ?>>Ruby on Rails
            <input type="submit" name="submit" value="submit">
        </form>
        <?php
            if(isset($_POST["submit"])) {
                if(isset($_POST["ch1"])) {
                    print $_POST["ch1"];
                    print $ch1status;
                }
                if(isset($_POST["ch2"])) {
                    print $_POST["ch2"];
                    print $ch2status;
                }
                if(isset($_POST["ch3"])) {
                    print $_POST["ch3"];
                    print $ch3status;
                }
            }
            echo "<pre>";
            print_r($_POST);
            echo "</pre>";
        ?>
    </body>
</html>