表单不能正常工作

时间:2016-03-06 07:24:01

标签: php html5

如果所有输入都已填满,一切正常。但是,如果我只勾选复选框,表格让我注册,无论我没有填写所有输入。 另外,如果将var_dump添加到页面底部(只选中复选框),则会显示" boolean false"请帮忙......

<?php

    $page_title = 'Registracija'; // Definiše title i h1

    $folder = 'registration-db';

    if (!file_exists($folder)) {

        mkdir($folder, 0777, true);`enter code here`

    }

    $fajl = $folder . '/registrovani_korisnici.txt';

    // Citanje podataka
    if (file_exists($fajl)) {
        $podaci = file_get_contents($fajl);

        $registracija = explode("\n", rtrim($podaci)); //Vracanje података iz baze
    }



    $errors = false;




    //Obrada forme i provera podataka

    if (!empty($_POST)) { //ako nije prazna promenljiva


        //Provera da li su podaci unešeni


        if (empty($_POST['user_name'])) { //radi
            $errors[] = 'Niste upisali ime i prezime!<br>';
        }
        if (empty($_POST['user_email'])) { //radi
            $errors[] = 'Niste uneli E-mail!<br>';
        }
        if (filter_var($_POST['user_email'], FILTER_VALIDATE_EMAIL) === false) {// Izbacio !empty($_POST['user_email']) &&
            $errors[] = 'Nije validna email adresa!<br>';
        }
        if (empty($_POST['user_password'])) { //radi
            $errors[] = 'Niste uneli lozinku!<br>';
        }
        if (strlen($_POST[]) <= 5) {  //radi
            $errors[] = 'Lozinka mora da ima više od 5 karaktera!<br>';
        }
        if (empty($_POST['user_password2'])) { //radi
            $errors[] = 'Niste potvrdili lozinku!<br>';
        }

        if ($_POST['user_password'] !== $_POST['user_password2']) {
            $errors[]  = 'Lozinka mora da bude ista u oba pokušaja!';
        }
        if (empty($_POST['day']) || empty($_POST['month']) || empty($_POST['year'])) { //radi
            $errors[] = 'Niste uneli ispravan datum!<br>';
        }
        if (empty($_POST['check'])) { //radi
            $errors[] = 'Niste prihvatili uslove korišćenja!<br>';
        }

        /*if (date('Y') - $_POST['year'] < 15) {
            $errors[] = 'Nemate dovoljno godina, da biste se registrovali!<br>';
        }*/ //Problem kada se ne definiše vrednost  $_POST['year']!!!!!

        else {
            // Data forwarding
            extract($_POST);

            // Name

            // Skidanje tagova - Zbog bezbednosti!!!
            $user_name = strip_tags($user_name);
            //Pretvaranje u mala slova
            $user_name = strtolower($user_name);
            //Pretvaranje prvih slova u velika (Ime Prezime)
            $user_name = ucwords($user_name);


            // Čišćenje Email-a
            $user_email = strip_tags($user_email);


            //Čišćenje Lozinke
            $user_password = strip_tags($user_password);

            //Čišćenje Lozinke2
            $user_password2 = strip_tags($user_password2);

            /*html_entity_decode();
            htmlentities();*/


            $podaci .= $user_name . '#!$!#' . $user_email . '#!$!#' . $user_password . '#!$!#' . $user_password2 . '#!$!#' . $day . '.' . $month . '.' . $year . '#!$!#' . PHP_EOL;

            //Zapisivanje u fajl
            file_put_contents($fajl, $podaci);


            header('Location: registracija.php?sent=1');
        }


    }

    ?>



    <?php include 'inc/header.php'; //include header?>

    <!-- Prikazivanje greške-->

    <?php if ($errors !== false) : ?>

        <p>GREŠKA: </p>

        <?php foreach ($errors as $error) : ?>

            <p><?php echo $error; ?></p>

        <?php endforeach; ?>

    <?php endif; ?>


    <?php if (isset($_GET['sent']) && $_GET['sent'] == 1): ?>
        <h2>Uspešno ste registrovani! Hvala.</h2>

    <?php else : ?>


        <!-- Form -->
        <form action="" method="post">

            <p>
                <input type="text" name="user_name" placeholder="Ime i prezime">
            </p>

            <p>
                <input type="email" name="user_email" placeholder="E-mail">
            </p>

            <p>
                <input type="password" name="user_password" placeholder="Lozinka">
            </p>

            <p>
                <input type="password" name="user_password2" placeholder="Ponovite lozinku">
            </p>

            <h2>Datum rodjenja</h2>

            <select name="day">

                <option selected disabled>Dan</option>
                <?php for ($i = 1; $i <= 31; $i++) : ?>
                    <option> <?php echo $i; ?> </option>
                <?php endfor; ?>

            </select>

            <select name="month">

                <option selected disabled>Mesec</option>
                <?php for ($i = 1; $i <= 12; $i++) : ?>
                    <option> <?php echo $i; ?> </option>
                <?php endfor; ?>

            </select>

            <select name="year">

                <option selected disabled>Godina</option>
                <?php
                $start = date("Y");
                $end = date("Y") - 100;
                ?>
                <?php for ($i = $start; $i >= $end; $i--) : ?>
                    <option> <?php echo $i; ?> </option>
                <?php endfor; ?>
            </select>
            <br>
            <br>
            <input type="checkbox" name="check"> Prihvatam uslove korišćenja

            <p>
                <button>Registrujte se</button>
            </p>
        </form>

    <?php endif; ?>

    <!-- Form END -->
    <?php include 'inc/footer.php'; //include footer?>

2 个答案:

答案 0 :(得分:1)

首先,您可能希望将if语句转换为if - else if - else链。在您的情况下,如果last if语句返回false,则您之前的验证将失效。

if (empty($_POST['day'])) {
    //Validation
}
else if (empty($_POST['year'])) {
    //Validation
}
else if (empty($_POST['check'])) {
    //Validation
}
// Other validations
else {

}

此外,您应该为您的复选框添加一个值,如下所示:

<input type="checkbox" name="check" value="1" /> 

这样,如果选中它,它会发布一个值。

在您目前的情况下,即使选中了复选框,您也不会发送任何值,而您的最后一个if语句的评估结果为false。

修改

要一次显示所有缺少的字段,只需将else语句更改为另一个if-else语句,如下所示:

if (empty($_POST['user_name'])) {
    $errors[] = 'Niste upisali ime i prezime!<br>';
}
if (empty($_POST['check'])) {
    $errors[] = 'Niste prihvatili uslove korišćenja!<br>';
}
//Other validations

if($errors) {
    //Show errors
}
else{
    // Data forwarding
    // Same as your former else statement
}

答案 1 :(得分:0)

这是一个小的逻辑错误。您的else阻止版仅与您上一个if阻止相关联。因此,如果未执行最后一个else块,则会输入if

如果$_POST['check'] is not empty that is if the condition inside the last if block`返回false,则输入else并完成注册。

你能做些什么来解决这个问题?

使用旗帜。将变量声明为$c=1;。如果输入任何0,我们会将此变量的值更改为if block

 $c=1;
    if (empty($_POST['user_name'])) { //radi
    $errors[] = 'Niste upisali ime i prezime!<br>';
    $c=0; 
    }
    if (empty($_POST['user_email'])) { //radi
    $errors[] = 'Niste uneli E-mail!<br>';
    $c=0;
    }
    if (filter_var($_POST['user_email'], FILTER_VALIDATE_EMAIL) === false) {// Izbacio !empty($_POST['user_email']) &&
    $errors[] = 'Nije validna email adresa!<br>';
    $c=0;
    }
    if (empty($_POST['user_password'])) { //radi
    $errors[] = 'Niste uneli lozinku!<br>';

    $c=0;
    }
    if (strlen($_POST[]) <= 5) {  //radi
    $errors[] = 'Lozinka mora da ima više od 5 karaktera!<br>';
    $c=0;
    }
    if (empty($_POST['user_password2'])) { //radi
    $errors[] = 'Niste potvrdili lozinku!<br>';
    $c=0;
    }

    $if ($_POST['user_password'] !== $_POST['user_password2']) {
    $errors[]  = 'Lozinka mora da bude ista u oba pokušaja!';
    $c=0;
    }
    $if (empty($_POST['day']) || empty($_POST['month']) || empty($_POST['year'])) { //radi
    $errors[] = 'Niste uneli ispravan datum!<br>';
    $c=0;
    }
    $if (empty($_POST['check'])) { //radi
    $errors[] = 'Niste prihvatili uslove korišćenja!<br>';
    $c=0;
    }
     elseif ($c==1)
    {
    //CODE
    }
仅当else if为真时才会输入

$c==1阻止。

你也可以使用if-elseif-else阶梯。

OR: 您可以在每个输入标记中使用required属性强制用户在提交之前填充该特定字段。

    eg:

        <input type="email"  name="user_email" Placeholder="Email" required>

在每个输入标记中添加required属性,以便在未输入字段时停止提交表单。

例如,在上述情况下,如果未输入email-id,则不会提交表单。