簡體   English   中英

PHP - 如何干掉重復的數據庫查詢和html塊?

[英]PHP - How to DRY repetitive database queries and html blocks?

我有一種情況是重復相同的數據庫查詢,並在應用程序的各個地方使用相同的相關HTML。

那么干燥這個的通常/最佳實踐方法是什么?

包括完美適用於這種情況,但如果我采用它作為DRYing的方法,我可能最終會得到太多包括減慢應用程序的速度嗎?

我通常用靜態方法創建實用程序類來處理重復塊的回顯。 例如,看看我的social plugins

您可以嘗試使用中央文件進行數據庫查詢,並僅將其包含在您需要的位置。 類似的html片段。

您可能會發現在此實例中有用的MVC模式(請參閱http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

如果你真的想要自己 - 至少部分地,而不是使用一個完整的框架,你可以混合一些完善的庫,並從模板中分離邏輯。

例如,我所做的就是使用Smarty--一個成熟的模板引擎 - 並擴展其基類以進行廉價查詢。

通常你會以這種方式使用Smarty,將你的邏輯與模板分開:

$Smarty = new Smarty();
$Smarty->assign( 'myvariable', array( ... ) ); // usually a database query return
$Smarty->display( 'template.tpl' );

所以我把它擴展為查詢:

class QSmarty extends Smarty {
    function query( $sql ) {
        $args = func_get_args();
        $sql = array_shift( $args );
        foreach( $args as $k => $v ) $args[$k] = mysql_escape_string( $v );
        $safe_sql = vsprintf( $sql, $args );

        // assuming this will be manageable (paginated or reasonably sized)
        $ret = array();
        $t = mysql_query( $safe_sql );
        while( $r = mysql_fetch_assoc( $t ) ) {
            $ret[] = $r;
        }
        return( $ret );
    }
}

因此你可以一遍又一遍懶洋洋地使用它:

$Smarty = new QSmarty();
$Smarty->assign( 'users', $Smarty->query(
    "select * from users where group=%s",
    $_GET['group'] // gets sanitized automatically
));

$Smarty->display( 'users.tpl' );

模板文件users.tpl可能如下所示:

<ul>
{foreach $users as $user}
    <li class="{cycle values='odd,even'} {if $user@last}last_user{/if}">
        {$users.id}: {$users.username|lower}
    </li>
{/foreach}
</ul>

由於Smarty支持模板繼承,自定義模板函數和其他功能嵌套,因此您可以將可重用HTML分段為各自的文件,並在其他模板中使用模板標記,例如{include users.tpl},如您所見,分配和重新分配變量適合。 非常干燥。

說實話,是的,這幾乎是Smarty的銷售宣傳,展示或突出了它的一些功能。 除了質詢之外,Smarty正在這里做所有繁重的工作。 給它或另一個模板引擎一個旋轉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM