2013-12-22 64 views
0

fetchdata.php - 發送所需的數據分離用戶界面和數據庫開發在PHP應用

function FetchItems() 
{ 
    while($Items = mysql_fetch_object("SELECT * FROM items")) //function is deprecated, would be changing it 
    { 
     $TotalItems[] = $Items; 
    } 
    return $TotalItems; 
} 

listitems.php - 用於用戶界面和項目的列表顯示給用戶

require_once('fetchdata.php'); 
$Items = FetchItems(); 
echo '<table>'; 
foreach($Items as $ItemDetails) 
{ 
    echo '<tr>'; 
    echo '<td>'; 
    echo $ItemDetails->ItemName; // right now the UI developer requires the actual column names to display data but I don't want this 
    echo '</td>'; 
    echo '<td>'; 
    echo $ItemDetails->ItemQty; 
    echo '</td>'; 
    echo '<td>'; 
    echo $ItemDetails->ItemCost; 
    echo '</td>'; 
    echo '</tr>'; 
} 

echo '</table>'; 

我需要分開mysql開發和用戶界面開發,以便在不同的人之間分配工作量。 UI開發人員不應要求實際的列名/表名/數據庫名向用戶顯示數據。 但這些只會被後端開發者需要。

從一個開發者角度,如果萬一我想改變我的表的列名一樣,ItemQtyItemAvailableQty那麼我要問的UI開發人員編輯UIE文件即listItems中。 PHP的,但我想,只有後端文件是fetchdata.php應該編輯和UI文件不應該被觸及這種數據庫的變化。無論數據庫中發生了哪些變化,這些更改都應獨立於UI文件,UI文件不應該知道/需要這些後端更改,即更改對於UI文件是不可見的。 UI文件只有當且僅當有一些UI改變時纔會被編輯。

我應該採取哪些措施來實現這個目標?我是否需要創建視圖/存儲過程等?或者我必須去MVC框架,如果是的話,那麼如何?

+1

首先,'mysql_ *'函數不再維護**,不應該用在任何新的代碼庫中。它正逐漸被淘汰,轉而採用更新的API。相反,您應該使用[PDO](http://php.net/pdo)或[MySQLi]([**準備好的語句**])(https://www.youtube.com/watch?v=nLinqtCfhKY)( http://php.net/mysqli)。 –

回答

1

你不需要使用MVC框架,但它會比重新發明輪子更好。在MVC的全局概念中,您有一個View對象,它包含您的UI運行所需的變量。這取決於你實施它的方式。在View對象的大多數情況下,您需要一個魔術set方法,該方法將值分配給不存在的變量。

class View { 

    public function __set($name, $value) { 
     $this->$name = $value 
    } 

    public function __get($name) { 
     return $this->$name; 
    } 
} 

以非常簡單的方式,如果您嘗試將值設置爲View的對象的不存在的屬性,它將即時創建屬性。

然後在你的後臺交互,你有保存視圖對象全局類,讓我們不要把它應用程序,但是控制器。

class Controller { 

    protected $view; 

    public function __construct() { 
     $this->view = new View(); 
    } 
} 

沒有魔力,只是通過保存View對象的所有後端交互的共享屬性。

你現在有一類你FetchItems()方法,我們稱之爲,Items

所以,你創建一個使用數據庫操作的控制器(MVC中的,這將是一個模型)和受讓人返回值來查看的魔法屬性。

class ItemsController extends Controller { 

    public function ItemsList() { 
     $items = new Items(); 
     foreach ($items->FetchItems() as $item) { 
      $this->view->ItemName[] = $item->ItemName; 
      $this->view->ItemQty[] = $item->ItemQty; 
      $this->view->ItemCost[] = $item->ItemCost[]; 
     } 
} 

因此,在這裏,我們在您的Items模型的返回數據的View對象中創建了3個數組變量。這不會是最好的方法,因爲UI開發人員應該使用一些後臺功能與他們進行互動,所以你可能要創建一個大的陣列,它擁有他們像$this->view->Items['name'] = $item->ItemName$this->view->Items['Qty'] = $item->ItemQty,所以你只送出可變Items到視圖。

現在,如果您更改列名稱,則只需在業務邏輯中進行更改,您將在此創建$this->view->Items['qty'] = $item->ItemAvailableQty;,但在UI部分中,$this->Items['qty']將保留。

這當然不顯示如何實現整個MVC,它只是顯示你可以遵循的邏輯。當然,您可以使用現有的MVC框架,或者只是將您的應用程序改爲具有共享變量,這樣您的UI部分將從對象接收信息,該對象可以使用創建時的屬性。因此,一旦將值分配給內部屬性,您只需更改分配,但不需要在模板中使用的實際屬性。

例如,在嚴格的OOP或框架中,您可以將值分配給包含FetchItems()方法的類的內部屬性,以便您的UI開發人員使用它們而不是原始返回的數據庫數據。

但是,最後,這不會讓你花費更多時間並且值得嗎?爲了不讓你的UI開發人員關心這些列,你將會使用數百萬個指定來查看變量。數據庫表不打算在挖掘時更改其列。更甚者,如果你已經在這張桌子後面有後端。

+0

謝謝先生,所以,根據你的說法,我將爲Item創建一個類,然後在處理項時使用該類及其方法。然後,我將不得不只改變類文件中的列名而不是UI文件。但這種方法在UI文件中使用ClassName ...有沒有一種方法可以避免在UI文件中使用類的名稱.....就像Items - class,然後在UI文件中我會這樣做 - $ item = new Items(); $用品 - > FetchItems(); – sqlchild

+0

也,你說我不需要MVC,爲什麼呢?但是你已經給出了我想的方法。 – sqlchild

+1

您可以在其中實例化類的外部文件,因此UI文件只需要它。 MVC是沒有必要的,但是很好的解決方案,這就是爲什麼我給了這個方法:) –

1

您可以使用模板引擎,如SmartyTwig。它們確保了應用程序設計和邏輯之間的清晰分離。作爲一個例子,我建議你看看Smarty的崩潰過程:http://www.smarty.net/crash_course

甚至可以將這樣的模板引擎與MVC框架結合起來。