在视图文件中包含表单到控制器文件PHP

时间:2017-01-04 15:29:46

标签: php forms

我正在为我的网站创建简单的注册表单,而且我遇到显示错误的问题。当我向表单输入不正确的数据并单击“提交”按钮时,没有任何反应,只有当我再次单击它时(即使文本框为空)也会显示错误消息。这是一个包含文件的问题,如何修复它而不将php逻辑和html布局放在一起?

register.php

<?php

session_start();

require_once 'business.php';

require 'views/register_view.php';

if (isset($_POST['email']) || isset($_POST['login']) || isset($_POST['pass1']))
{
    $ok_flag=true;

    $email = $_POST['email'];
    $email2 = filter_var($email, FILTER_SANITIZE_EMAIL);

    if ((filter_var($email2, FILTER_VALIDATE_EMAIL)==false) || ($email2!=$email))
    {
        $ok_flag=false;
        $_SESSION['err_email']="Podaj poprawny adres e-mail";
    }

    $login = $_POST['login'];

    if (strlen($login)<3) 
    {
        $ok_flag=false;
        $_SESSION['err_login']="Login musi posiadać od 3 do 20 znaków";
    }

    if (ctype_alnum($login)==false)
    {
        $ok_flag=false;
        $_SESSION['err_login']="Login może składać się tylko z liter i cyfr (bez polskich znaków)";
    }

    $pass1 = $_POST['pass1'];
    $pass2 = $_POST['pass2'];

    if ((strlen($pass1)<8) || (strlen($pass1)>20) || empty($pass1))
    {
        $ok_flag=false;
        $_SESSION['err_pass']="Hasło musi posiadać od 8 do 20 znaków";
    }

    if ($pass1!=$pass2)
    {
        $ok_flag=false;
        $_SESSION['err_pass']="Podane hasła nie są identyczne";
    }   

    $pass_hash = password_hash($pass1, PASSWORD_DEFAULT);

    //Zapamiętaj wprowadzone dane
    $_SESSION['email'] = $email;
    $_SESSION['login'] = $login;
    $_SESSION['pass1'] = $pass1;
    $_SESSION['pass2'] = $pass2;

    if ($ok_flag==true) {
        //dodaj gracza do bazy danych
    }
}


?>

register_view.php

<h1>Rejstracja</h1>

    <form method="post">

    Adres e-mail:<br />
    <input type="text" name="email"/><br />

    <?php
        if (isset($_SESSION['err_email']))
        {
            echo '<div class="error">'.$_SESSION['err_email'].'</div>';
            unset($_SESSION['err_email']);
        }
    ?>

    Login:<br />
    <input type="text" name="login" maxlength="20" /><br />

    <?php
        if (isset($_SESSION['err_login']))
        {
            echo '<div class="error">'.$_SESSION['err_login'].'</div>';
            unset($_SESSION['err_login']);
        }
    ?>

    Hasło:<br />
    <input type="password" name="pass1"/><br />

    <?php
        if (isset($_SESSION['err_pass']))
        {
            echo '<div class="error">'.$_SESSION['err_pass'].'</div>';
            unset($_SESSION['err_pass']);
        }
    ?>      

    Powtórz hasło:<br />
    <input type="password" name="pass2"/><br /><br />

    <input type="submit" value="Zarejestruj się"/>

    </form>

1 个答案:

答案 0 :(得分:1)

这是你的问题:

<?php

session_start();

require_once 'business.php';

// here you include the view
require 'views/register_view.php';

if (isset($_POST['email']) || isset($_POST['login']) || isset($_POST['pass1']))
{
    ...

您正在处理表单提交的逻辑 之前 。所以第一次没有设置会话变量。

您需要将require 'views/register_view.php';移至if声明之后。

通常,在开始输出到浏览器之前,应始终进行处理。这也将允许您启动会话,使用header()重定向等,具体取决于结果。