当我在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!";
}
}
}
答案 0 :(得分: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
- &gt;然后写入该文件。这意味着由于脚本已经加载,因此您写入此文件的更改将不可用。
这里的解决方案是不使用常量变量,因为它们无法更改。如果使用常规变量,则可以再次include db.php
覆盖之前定义的变量。
另一个选项是让你的创建配置文件返回需要定义的值,以便你可以覆盖之前已经包含的内容。
答案 1 :(得分: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");
两者都是不必要的!