2014-09-21 48 views
0

我正在學習php。我看到人們推薦分開html和php或邏輯和標記。但在某些特定的場合,我不知道該怎麼做。爲了可讀性和可維護性,我嘗試將所有的php放在一個單獨的文件中,但現在我必須從數據庫中下載一個標題,而我所看到的唯一方法是將其與html的其餘部分以及這個html和php混合使用。在這個特定的情況下,是否有更加乾淨和有組織的方式?可以把這個和平的PHP在「設計」文件?可以或應該把這個PHP代碼與其餘的PHP?邏輯和標記,HTML和PHP

<?php 
include("../../externs/includes/connexio.php"); 

$result = mysqli_query($con, "SELECT * FROM myTable"); 

while ($row = mysqli_fetch_array($result)) { 
    $id = $row["id"]; 
    $title = $row["title"]; 
    $subtitle = $row["subtitle"]; 
?> 

<div class="title" id="<?php echo $id; ?>"><?php echo $title; ?> </div> 
<div class="subtitle"><?php echo $subtitle;?> </div> 
<br> 

<?php 
}//end while items 
?> 
+0

我在這裏沒有看到任何問題,我認爲那還是可以的 – Ghost 2014-09-21 11:03:28

+0

沒有問題。有用。我的問題是:有沒有更好的方法來做到這一點?可以/我應該分開的HTML和PHP? – Nrc 2014-09-21 11:04:47

+0

你可以通過將你的邏輯工作在不同的文件中,並將它包含到你的html文件中來始終將php代碼從html上下文中分離出來 – justrohu 2014-09-21 11:11:33

回答

1

首先我會推薦閱讀有關MVC(模型 - 視圖 - 控制器),你可以在此維基百科文章的開始: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

對於一個簡單的情況下,你的問題的一個來回,你的解決方案在我看來,最好的。其他任何事情都會增加不必要的複雜性。這就是說,我會嘗試使用這種簡單的情況,並提供一種可能的方式來將邏輯從表示中分離出來,希望一些基本概念能夠從中解脫出來。

my_controller.php

include("../../externs/includes/connexio.php"); 

$result = mysqli_query($con, "SELECT * FROM myTable"); 

$myList = array(); 
while ($row = mysqli_fetch_array($result)) 
{ 
    $myList[] = $row; 
} 

// Now load the view. 
include "my_view.php"; 

my_view.php

<?php foreach ($myList as $row) : ?> 

    <div class="title" id="<?php echo $row['id']; ?>"><?php echo $row['title']; ?></div> 
    <div class="subtitle"><?php echo $row['subtitle'];?></div> 
    <br> 

<?php endforeach; ?> 

正如你看到的,我只是把你的代碼,這將是業務邏輯和表示分開了。 這裏的想法是,要呈現的數據應該在視圖之外生成。視圖應該對數據如何「生成」一無所知。

在這個例子中,View只知道變量$ myList包含字段:id,title和subtitle。如果您曾更改數據庫或決定從文件甚至Web服務中獲取數據,你根本不需要觸摸視圖。

與此同時,控制器不關心View如何顯示數據。不管來源:數據庫,Web服務,文件等;它將始終生成一個至少包含View所期望的字段的數組。

MVC的下一步是將數據操縱從控制器移動到模型。我不會去那裏的細節,但這是控制器會是什麼樣子:

include "my_model.php"; 
$myList = fetchData(); 
include "my_view.php; 

my_model.php文件將基本上做同樣如上my_controller.php內的fetchData()功能。

一個非常值得商榷和爭議的問題是,在View中是否有任何PHP代碼是一種很好的做法。有人認爲應該使用其他模板語言,如Smarty。我的觀點是,通過添加另一種語言來更改語法並不會改變View中需要某些邏輯的不可避免的事實,否則您將無法將動態引入到應用程序中。

正如你感覺閱讀PHP代碼更加舒服一樣,你將能夠看看周圍的幾個框架,看看他們是如何做到的。他們都有一個共同點,那就是它們在表示層都有一些邏輯,無論是PHP還是別的。

+0

感謝您的解釋並努力使用相同的代碼。現在我更瞭解它。 – Nrc 2014-09-25 14:17:53

0

以下是在將PHP與標記混合時可以遵循的最佳實踐。

(不是最佳做法)

1)例如,如果你有在頂部的邏輯,你想生成的標記,你可以做一個不那麼好方法是:

<?php 
$query = mysql_query("SELECT id,name FROM table"); 

while($row = mysql_fetch_assoc($query)){ 
    $id = $row['id']; 
    $name = $row['name']; 
?> 

<div>ID:<?php echo $id;?></div> 
<div>NAME:<?php echo $name;?></div> 

<?php 
} 
?> 

在上面的代碼中,你必須跟蹤結束大括號,如果你的應用程序很複雜,它可能會產生一個問題,特別是在多於一個級別的迭代中。

2)良好的方式做是使用PHP標籤,如

<?php if(count($array)):?> 

    <?php foreach($array as $result):?> 

     <div><?php echo result;?></div> 

    <?php endforeach;?> 

<?php else:?> 

    <div>NO results found</div> 

<?php endif;?> 

你的代碼有沒有問題,演示,但如果它是一個複雜的應用程序,那麼你需要遵循最佳做法。

<?php 
$array = array(); 
$query = mysql_query("SELECT id,name FROM table"); 

while($row = mysql_fetch_assoc($query)): 
    $array[] = $row; 
endwhile; 
?> 

PHP標籤外面檢查$array計數,如果有計數,然後生成標記。

<?php if(count($array)):?> 

    <?php foreach($array as $result):?> 

     <div>ID<?php echo result['id'];?></div> 
     <div>ID<?php echo result['name'];?></div> 

    <?php endforeach;?> 

<?php else:?> 

    <div>NO results found</div> 

<?php endif;?> 

使用這種格式可以實現令人滿意的結果。嘗試分離或避免混合太多的PHP與標記。如果您希望您的演示邏輯與業務邏輯分離,那麼我建議您使用MVC模型,因爲它可以提高可讀性和可維護性。