2013-07-02 47 views
0

當我在OOP PHP中使用MVC框架時,我提交了一個表單,我必須刷新頁面才能繼續下一個「elseif」。避免在OOP提交表單後刷新PHP

即使函數「$ 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

您可以擴展您的場景和問題嗎? '你是什麼意思'我必須刷新頁面才能繼續下一個「elseif」'代碼與它有什麼關係? – Gordon

+0

是的,我不完全確定你的問題是 – Kris

+0

如果函數isConfigFileCreated()返回false,代碼顯示config_file.php。然後我填寫表格,然後按提交。頁面重新加載,constructer運行,看到我按下提交,並創建配置文件。所有這一切發生在「$ login = new Login();」因爲constructer檢查$ _POST。 但是畢竟這樣,ir會檢查顯示內容,並顯示config_file.php AGAIN。即使該文件已被創建。 但是當我刷新一次,它「繼續前進」。 – MathiasJakobsen

回答

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

} 

或者你可以做到這一點,如果登錄永遠不會使用的數據庫__construct:

require_once("classes/Login.php"); 

$login = new Login(); 

require_once("db.php"); 

兩者都是不必要的!

1

elseif將使所有的代碼相關。如果你不想它有關,並希望它繼續和檢查下,如果語句,則只是刪除其他:

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來覆蓋之前定義的變量。

另一種選擇是讓您的創建配置文件返回需要定義的值,以便覆蓋之前已包含的值。

+0

當我這樣做,功能失敗,並沒有任何顯示。 – MathiasJakobsen