Приоритет порядка обработки форм PHP - PullRequest
1 голос
/ 08 апреля 2011

Я новичок в мире разработки и только начинаю изучать 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>

Поля отображаются помеченными.Весь код ниже.

<code><?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 "
";?>

Также есть какой-либо другой способ проверки, если пользователь не установил какие-либо флажки каквместо использования скрытых полей формы.

Ответы [ 4 ]

1 голос
/ 08 апреля 2011

Это просто проблема браузера и довольно просто: элементы имеют одинаковое имя, а более поздний элемент перезаписывает первый.

Другим способом проверки, если флажок не установлен, является проверка, установлен ли он в массиве $POST. Если он отсутствует, он рассматривается как "не проверено".

1 голос
/ 08 апреля 2011

НЕОПРЕДЕЛЕННЫЕ ИНДЕКСЫ:

Это потому, что флажки отправляются, только если они отмечены. Одна вещь, которую вы можете сделать, это всегда проверять переменную с помощью 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 ...

Существует множество способов сделать это. Надеюсь, вам будет интересно узнать о многих из них.

0 голосов
/ 08 апреля 2011

Php - все на стороне сервера, поэтому для предотвращения их отправки вам потребуется проверка на стороне клиента. Самая простая проверка на стороне клиента выполняется с помощью javascript или плагина проверки jQuery , если вы уже используете jQuery (что и должно быть, если вы планируете использовать AJAX в любой момент).

И да, вы можете избавиться от этих скрытых вводов.

0 голосов
/ 08 апреля 2011

Вам не нужны эти скрытые поля. Удалите их, и это должно работать.

EDIT: Проверьте эту модификацию

<code>    $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 "
"; ?>
...