怎樣在dede中用php標籤結合sql使用

來源:互聯網
上載者:User

本篇文章主要介紹怎樣在dede中用php標籤結合sql使用,感興趣的朋友參考下,希望對大家有所協助。

  {dede:php}      //echo 'vvvv';      {/dede:php}         {dede:php}    //print_r($refObj->Fields);  $sql = "select ars.*, art.typedir from dede_archives AS ars           LEFT JOIN dede_arctype AS art ON ars.typeid=art.id           where typeid=2 ORDER BY weight ASC ";  $dsql->SetQuery($sql);//將SQL查詢語句格式化  $dsql->Execute();//執行SQL操作  //通過迴圈輸出執行查詢中的結果  while($row = $dsql->GetArray()){      $link   = $refObj->Fields['indexurl'].'/'.$row['typedir'].'/'.$row['id'];      $link   = str_replace('{cmspath}', '', $link);      $class  = "ahy";      if($refObj->Fields['id'] == $row['id']) $class="ahytt";        echo '<a href="'.$link.'.html" class="'.$class.'">';      echo $row['title'];      echo '</a> ';  }  {/dede:php}


{dede:sql}標籤的用法

sql標籤可以稱得上是個萬能標籤了,查詢資料庫將其輸出,這裡介紹一些關於這個標籤的用法:

1.用來輸出統計內容,這個是不錯的,舉個例子,我們來統計下總共發了多少的文章,思路就是輸出dede_addonarticle這個文章附加表內容總數就可以了。

{dede:sql sql="SELECT COUNT(*) AS nums FROM dede_addonarticle"}    [field:name = "nums"/]    {/dede:sql}

2.使用~field~來進行特殊的查詢,比如之前論壇上面很多會員需要做一個輸出當前發布文章會員的相關內容,之前用sql或者arclist標籤是沒辦法實現的,因為每篇內容是不同的,這裡我們來用5.5的sql語句來做個示範。

我們首先在文章模板中相應的位置加上下面的標籤

 {dede:sql sql="SELECT * FROM dede_archives WHERE writer=~writer~"}    [field:id/], DEDE模板     {/dede:sql}

這個放到article_article.htm頁面,將會檢索出當前會員發布的相關文章,這裡的~ writer~會根據當前內容的環境變數進行替換後再執行查詢。

這裡出現在SQL語句中條件查詢的~ writer~,也就是$refObj->Fields[$value]這個裡面的相關內容

模板中使用PHP

許多人希望織夢的模板標籤能夠更加靈活,加入可以運行PHP的功能,這裡在DedeCMS V5.5中就加入了一個可以執行php的特殊標籤{dede:php}{/dede:php},這個標籤可以執行PHP語句了。

我這裡舉幾個常用的例子:

1.最簡單的輸出內容:

  {dede:php}    $numA = 1;    $numB = 2;    echo $numA + $numB;       {/dede:php}

在 {dede:php}裡想要輸出資訊 可以直接使用print , echo 之類的列印出來 賦值給@me 無效

這個輸出的內容是計算結果:

  3

2.結合SQL查詢輸出單條內容

 {dede:php}    $row = $dsql->GetOne('select id,typename from dede_arctype where id=2');    print_r($row);    {/dede:php}

這個輸出的內容是

  Array    (    [id] => 2    [typename] => 問答    )

3.擷取當前頁面的變數

比如我們這裡進入系統背景[模板]-[全域標記測試],我們在代碼中填入下面的內容:

 {dede:php}    print_r($refObj->Fields);       {/dede:php}


在PHP中想要擷取dede某個欄位值 可以使用 $refObj->Fields 對象來擷取 列入擷取 title => $refObj->Fields['title']

如果環境變數保持預設,即“不使用環境ID”,我們會看到以下的結果:

 Array    (    [typeid] => 0    [phpurl] => /plus    [indexurl] => /    [templeturl] => /templets    [memberurl] => /member    [specurl] => /special    [indexname] => 首頁    [templetdef] => /templets/default    )

那我們再換個環境變數測試看看,這裡以我本地的欄目為測試了:

 Array    (    [id] => 3    [reid] => 0    [topid] => 0    [sortrank] => 1    [typename] => 產品    [typedir] => {cmspath}/product    … …    [indexname] => 首頁    [templetdef] => /templets/default    [position] => 首頁 > 產品 >    [title] => 產品    )

這樣一來就檢索出當前頁面的局部變數了,接下來我們可以來結合前面的SQL語句來實現根據不同環境ID調用內容不同欄目內容。

例如:

 {dede:php}    $thisid = $refObj->Fields['id'];    $row = $dsql->GetOne('select id,typename from dede_arctype where id='.$thisid);    print_r($row);    {/dede:php}

這樣是來調用當前欄目的標題,這個標籤功能類似於{dede:field.typename/}

接下來我們通過執行查詢對sql及輸出變數進行處理:

$dsql->Execute('me',$sql);  while($rs = $dsql->GetArray('me'))  {  //根據屬性處理查詢變數  $rs['title'] = cn_substr($rs['title'], $titlelen);  //擷取底層模板  $ctp->LoadSource($innertext);  foreach($ctp->CTags as $tagid=>$ctag) {  if(!empty($rs[strtolower($ctag->GetName())])) {  $ctp->Assign($tagid,$rs[$ctag->GetName()]); DEDE模板   }  }  //根據底層模板及查詢變數得到處理結果  $revalue .= $ctp->GetResult();  }

這樣我們 就將查詢出來的結果同底層模板中出現的相關變數進行替換,然後產生輸出字串,將所有的字串資訊儲存到$revalue中。

最後返回這個值 return $revalue;

整個檔案內容如下:

if(!defined('DEDEINC'))  {  exit("Request Error!");  }  function lib_writerarc(&$ctag,&$refObj)  {  global $dsql,$envs;  //屬性處理  $attlist="row|12,titlelen|24";  FillAttsDefault($ctag->CAttribute->Items,$attlist);  extract($ctag->CAttribute->Items, EXTR_SKIP);  $revalue = '';  $innertext = $ctag->GetInnerText();  $ctp = new DedeTagParse();  $ctp->SetNameSpace('field', '[', ']');  $sql = "SELECT * FROM dede_archives WHERE writer='{$refObj->Fields['writer']}' limit 0, $row";  $dsql->Execute('me',$sql);  while($rs = $dsql->GetArray('me'))  {  //根據屬性處理查詢變數  $rs['title'] = cn_substr($rs['title'], $titlelen);  //擷取底層模板  $ctp->LoadSource($innertext);  foreach($ctp->CTags as $tagid=>$ctag) {   if(!empty($rs[strtolower($ctag->GetName())])) {  $ctp->Assign($tagid,$rs[$ctag->GetName()]);  }  }  //根 據底層模板及查詢變數得到處理結果  $revalue .= $ctp->GetResult();  }  return $revalue;  }  ?>

接下來我們來測試我們這個標籤,我們修改 article_article.htm模板,在裡面加入以下的標籤代碼:

{dede:writerarc row='10' titlelen='6'}  [field:title/]   {/dede:writerarc}

相關推薦:

dedecms5.7最新sql利用 guestbook.php注射漏洞

dedecms SESSION變數覆蓋導致SQL注入common.inc.php的解決

PHP命令注入dedecms遠程寫檔案連結執行個體分享


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.