避免在OOP PHP中提交表单后需要刷新


Avoid need to refresh after submitting form in OOP PHP

当我在OOP PHP中使用MVC框架并提交表单时,我必须刷新页面才能进入下一个"elseif"。

尽管函数"$login->isConfigFileCreated()"现在返回true(在类构造函数执行之后),但它显示的视图与以前相同,并且需要刷新才能"继续"。

我确信,问题不在"createConfigFile()函数"中。这对我来说是一个常见的问题。

<?php
require_once("db.php");
require_once("classes/Login.php");
$login = new Login();
**if ($login->isConfigFileCreated() == false)
{
    include("views/config_file.php");
}
elseif ($login->isAdminCreated() == false)
{
    include("views/register.php");
}**
else
{
    include("views/not_logged_in.php");
}

config_file.php视图文件如下所示:

<form method="post" action="" name="create_config_file">
        <input type="text" name="input_db_host" required />
        <input type="text" name="input_db_name" required />
        <input type="text" name="input_db_user" required />
        <input type="text" name="input_db_pass" required />
        <input type="submit" name="create_config_file" value="Create" />
</form>

带有函数的类看起来像这样,例如:

public function __construct()
    {
        if (isset($_POST["create_config_file"]))
        {
            $this->createConfigFile();
        }
        if (isset($_POST["register"]))
        {
            $this->register();
        }
    }
public function isAdminCreated()
    {
        $this->db_connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
        if (!$this->db_connection->connect_errno)
        {
            $checksetup = $this->db_connection->query("SELECT user_email FROM users WHERE user_id = '1';");
            if ($checksetup->num_rows == 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

public function isConfigFileCreated()
    {
        if(defined('DB_HOST') && defined('DB_NAME') && defined('DB_USER') && defined('DB_PASS'))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public function createConfigFile($action)
    {
        if ($action == "complete")
        {
            $file_content = file_get_contents("db.php");
            $file_content .= 'define("CONFIG_DONE", "true");';
            file_put_contents("db.php", $file_content);
        }
        else
        {
            $this->db_connection = new mysqli($_POST['input_db_host'], $_POST['input_db_user'], $_POST['input_db_pass'], $_POST['input_db_name']);
            if (!$this->db_connection->connect_errno)
            {
                $file_content =    '<?php'."'n";
                $file_content .=   'define("DB_HOST", "'.$_POST['input_db_host'].'");'."'n";
                $file_content .=   'define("DB_NAME", "'.$_POST['input_db_name'].'");'."'n";
                $file_content .=   'define("DB_USER", "'.$_POST['input_db_user'].'");'."'n";
                $file_content .=   'define("DB_PASS", "'.$_POST['input_db_pass'].'");'."'n";
                file_put_contents("db.php", $file_content);
                fclose("db.php");
                $login->messages[] = "That's it! You're now ready to kick ass at some image management!";
            }
            else
            {
                $this->errors[] = "Wrong database credentials!"; 
            }
        }
    }

在执行createConfigFiles函数之前,db.php已包含在内。

您需要在createConfigFiles函数中定义变量,以及创建文件:

public function createConfigFile($action)
{
    if ($action == "complete")
    {
        $file_content = file_get_contents("db.php");
        $file_content .= 'define("CONFIG_DONE", "true");';
        file_put_contents("db.php", $file_content);
    }
    else
    {
        $this->db_connection = new mysqli($_POST['input_db_host'], $_POST['input_db_user'], $_POST['input_db_pass'], $_POST['input_db_name']);
        if (!$this->db_connection->connect_errno)
        {
            $file_content =    '<?php'."'n";
            $file_content .=   'define("DB_HOST", "'.$_POST['input_db_host'].'");'."'n";
            $file_content .=   'define("DB_NAME", "'.$_POST['input_db_name'].'");'."'n";
            $file_content .=   'define("DB_USER", "'.$_POST['input_db_user'].'");'."'n";
            $file_content .=   'define("DB_PASS", "'.$_POST['input_db_pass'].'");'."'n";
            file_put_contents("db.php", $file_content);
            fclose("db.php");
            define("DB_HOST", $_POST['input_db_host']);
            define("DB_NAME", $_POST['input_db_name']);
            define("DB_USER", $_POST['input_db_user']);
            define("DB_PASS", $_POST['input_db_pass']);;
            $login->messages[] = "That's it! You're now ready to kick ass at some image management!";
        }
        else
        {
            $this->errors[] = "Wrong database credentials!"; 
        }
    }
}

或者,如果Login永远不会使用__construct:上的数据库,您也可以这样做

require_once("classes/Login.php");
$login = new Login();
require_once("db.php");

两者都做是不必要的!

elseif将使所有代码相关。如果你不希望它是相关的,并且希望它继续并检查下一个If语句,那么只需删除else:

if ($login->isConfigFileCreated() == false)
{
    include("views/config_file.php");
}
if ($login->isAdminCreated() == false)
{
    include("views/register.php");
}
if( !$login->isConfigFileCreated() && $login->isAdminCreated())
{
    include("views/not_logged_in.php");
}

这将包括config_file.php,然后检查管理员是否已创建

在您输入后,这里有一个更新的答案:

所以问题是,您正在写入的文件是db.php,它已经包含在脚本中。

因此流程为require db.php->,然后写入该文件。这意味着,由于脚本已经加载,您对此文件所做的更改将不可用。

这里的解决方案是不使用常量变量,因为它们无法更改。如果使用常规变量,则可以再次使用include db.php来覆盖以前定义的变量。

另一种选择是让您的创建配置文件返回需要定义的值,这样您就可以覆盖之前已经包含的内容。