0

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!"; 
            }
        }

    }
4

2 に答える 2

1

これ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と、以前に定義された変数をオーバーライドすることができます。

もう 1 つのオプションは、作成した構成ファイルに、定義する必要がある値を返すようにして、以前に既に含まれていたものをオーバーライドできるようにすることです。

于 2013-07-02T20:30:13.783 に答える
1

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");

両方を行う必要はありません。

于 2013-07-03T01:29:07.913 に答える