Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在前端控制器中从php验证脚本重定向回表单_Php_Forms_Controller_Submit - Fatal编程技术网

如何在前端控制器中从php验证脚本重定向回表单

如何在前端控制器中从php验证脚本重定向回表单,php,forms,controller,submit,Php,Forms,Controller,Submit,我读过很多关于在执行服务器端验证(假设表单有错误)并显示错误后重定向回表单的问题,但我没有发现任何与我的特定问题相关的问题。我有一个简单的前端控制器,它使用.htaccess将http请求重定向到index.php。这就是设置;我的情况如下: register.php是一个注册表单,用于发布以验证_registation.php。我有显示php变量的代码(除非运行了验证脚本,否则不会设置)。我在validate_registration.php的末尾使用了以下内容: header("Locati

我读过很多关于在执行服务器端验证(假设表单有错误)并显示错误后重定向回表单的问题,但我没有发现任何与我的特定问题相关的问题。我有一个简单的前端控制器,它使用.htaccess将http请求重定向到index.php。这就是设置;我的情况如下:

register.php是一个注册表单,用于发布以验证_registation.php。我有显示php变量的代码(除非运行了验证脚本,否则不会设置)。我在validate_registration.php的末尾使用了以下内容:

header("Location: http://www.example.com/register.php");
不幸的是,在register.php中显示错误的代码根本不起任何作用。这是不是在我的前控制器里迷路了?我的.htaccess代码如下:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond $1 !^(index\.php|ajax|css|error|form|img|js|robots\.txt|securimage|submit)
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
</IfModule>

重新启动发动机
1美元^(索引\.php | ajax | css | error | form | img | js | robots\.txt | securimage | submit)
重写规则^(.*)$index.php?url=$1[PT,L]
我的前端控制器是这样的(大多数情况下,它非常简单,带有switch语句,因为我完全不需要任何更复杂、可伸缩的东西,等等):

$url=$\u GET['url'];
需要_一次(“header.php”);
回声';
需要_一次(“banner.php”);
需要_一次(“navigation.php”);
需要一次(“login_bar.php”);
回声';
交换机($url){
大小写('register.php'):
一次需要_('register.php');
打破
违约:
一次需要_('error404.php');
打破
}
回声'//id=“main”部分的结束div标记
require_once($template_directory/general/footer.php”);
回声';
很抱歉问了这么长的问题;我好像没法把这个修好!validate_registration.php可以重定向到register.php,但是变量似乎没有通过前端控制器。此外,此表单需要在不启用Javascript的情况下工作,因此不幸的是,AJAX不是一个选项

编辑: 这是带有错误消息的表单代码;现在很简单,因为我只是在测试它

<?php

$allowed_fields = array("reg_username",
    "reg_password",
    "reg_confirm_password",
    "reg_email",
    "reg_confirm_email",
    "captcha_code",
    "reg_disclaimer",
);

$db_select_connection = DB::get_admin_connection();
$errors = array();

foreach ($_POST as $key => $value) {
    if (in_array($key, $allowed_fields)) {
        $$key = mysql_real_escape_string($value);
        if ($value == "") {
            $errors["$key" . "_blank"] = "The $key field is required.";
        }
    }
}

// Validation section
// Username
if (ctype_alnum($reg_username)) {
    $errors["reg_username_invalid"] = "Username can only contain letters and numbers.";
}

// Password
if (strlen($reg_password) < 6) {
    $errors["reg_password_short"] = "Password must be at least 6 characters long.";
}
if ($reg_password !== $reg_confirm_password) {
    $errors["reg_password_match"] = "Passwords do not match.";
}

$legal_characters = preg_quote("~!@#$%^&*()");
$trimmed_password = preg_replace("/[^a-zA-Z$legal_characters]/", "", $reg_password);
if ($trimmed_password !== $reg_password) {
    $errors["reg_pass_chars"] = "Password can only contain letters, numbers, and " .      htmlentities($legal_characters, ENT_QUOTES, 'UTF-8');
}

// Email
if ($reg_email !== $reg_confirm_email) {
    $errors["reg_email_match"] = "Email addresses do not match.";
}
if (!Email::validate_email($reg_email)) {
    $errors["reg_email_invalid"] = "Email address is invalid.";
}

//Disclaimer check box
if ($reg_disclaimer !== "on") {
    $errors["reg_disclaimer_accept"] = "You must read and accept the disclaimer to     create an account.";
}


require("http://www.example.com/register.php");
?>

表单的代码只包含和类似的代码块来显示错误。有很多格式和样式div涉及,所以我不会浪费整个表单的空间


编辑:另外,我如何将某些内容格式化为代码,而不在每行前面手动放置4个空格?我将代码直接从我的IDE Netbeans复制到编辑窗口中,突出显示它,然后按下代码,但它仍然不允许我提交我的帖子

如果重定向,将丢失所有表单数据,因为这是一个新请求。如果要显示错误,则在当前请求中呈现表单,并在成功时重定向

当表单操作成功完成时,重定向通常用于防止表单重新发送

编辑(在评论中经过相当大的演变后):

您可能需要重新设计脚本的运行方式。实际上,根本不需要
index.php
来呈现任何内容,也不需要URL始终以
.php
结尾

我将建议一种编写应用程序的方法;这可能不是最好的方式,所以请考虑其他人,但它可能会帮助你思考。
    // index.php
    switch($_REQUEST['url']) {
        case('register'):
            $page['controller'] = 'register';
            break
        /* other stuff */
    }
    include_once('controllers/'.$page['controller'].'.php');


    // controllers/register.php
    if($_POST['register_form']) {
        // logic to deal with the form, error messages etc
    }
    $page['title'] = 'Register Now!';
    $page['template'] = 'register';
    include_once('../views/layout.php');



    // views/layout.php
    <!DOCTYPE html>
    <html>
    <head>
    <title><?=$page['title'];?></title>
    </head>
    <body>
    <?php
      // headers and such
      include_once($page['template'].'.php');
      // footers and such
    ?>
    </body>
    </html>


    // views/register.php
    /* your form html */
//index.php
开关($\u请求['url']){
大小写(‘寄存器’):
$page['controller']='register';
打破
/*其他东西*/
}
包括_once('controllers/'.$page['controller'.]..php');
//controllers/register.php
如果($_POST['register_form'])){
//处理表单、错误消息等的逻辑
}
$page['title']=“立即注册!”;
$page['template']='register';
包括_once('../views/layout.php');
//views/layout.php
//views/register.php
/*您的表单是html*/

在这里,您的路由器、控制器逻辑以及布局和视图模板被划分为具有明确职责的可管理部分。这样,您就不必在应用程序中的任何地方重复编写代码。

如果重定向,您将丢失所有表单数据,因为这是一个新请求。如果要显示错误,则在当前请求中呈现表单,并在成功时重定向

当表单操作成功完成时,重定向通常用于防止表单重新发送

编辑(在评论中经过相当大的演变后):

您可能需要重新设计脚本的运行方式。实际上,根本不需要
index.php
来呈现任何内容,也不需要URL始终以
.php
结尾

我将建议一种编写应用程序的方法;这可能不是最好的方式,所以请考虑其他人,但它可能会帮助你思考。
    // index.php
    switch($_REQUEST['url']) {
        case('register'):
            $page['controller'] = 'register';
            break
        /* other stuff */
    }
    include_once('controllers/'.$page['controller'].'.php');


    // controllers/register.php
    if($_POST['register_form']) {
        // logic to deal with the form, error messages etc
    }
    $page['title'] = 'Register Now!';
    $page['template'] = 'register';
    include_once('../views/layout.php');



    // views/layout.php
    <!DOCTYPE html>
    <html>
    <head>
    <title><?=$page['title'];?></title>
    </head>
    <body>
    <?php
      // headers and such
      include_once($page['template'].'.php');
      // footers and such
    ?>
    </body>
    </html>


    // views/register.php
    /* your form html */
//index.php
开关($\u请求['url']){
大小写(‘寄存器’):
$page['controller']='register';
打破
/*其他东西*/
}
包括_once('controllers/'.$page['controller'.]..php');
//controllers/register.php
如果($_POST['register_form'])){
//处理表单、错误消息等的逻辑
}
$page['title']=“立即注册!”;
$page['template']='register';
包括_once('../views/layout.php');
//views/layout.php
//views/register.php
/*您的表单是html*/
在这里,您的路由器、控制器逻辑以及布局和视图模板被划分为具有明确职责的可管理部分。这样,您就不必在应用程序中的任何地方重复编写代码。

尝试替换

header("Location: http://www.example.com/register.php");

试着替换

header("Location: http://www.example.com/register.php");


设置location头告诉浏览器将其自身定向到register.php。可以将其视为打开一个新窗口并转到register.php。您的post变量都不会执行,因为它们被发布到validate_registration.php,然后validate_registration.php只是将浏览器重定向回register.php。这