:::

7. 置頂、計數器與 join

一、 整理post.php

  1. 顏我們將發布表單的HTML語法放在post_tpl.html樣板檔中,如此,會造成post.php不好維護的問題,因此,我們將發布表單做成函數,並傳回完整表單語法。
  2. 可利用Heredoc定界符<<<的用法(左邊不可有任何空白)來做:
    $form = <<<form
      //表單HTML語法(這裡面要秀出$或"或'都不用加\)
    form;
  3. 樣板中,原本的表單位置請用[var.main]及[var.error_msg]樣板標籤代替之。
  4. 預設流程中,請去呼叫發布表單的函數。該函數需可傳入一個流水號參數,以便讓程式判斷是新增還是修改。若是修改(有流水號),則讀出該筆資料預設值。

二、 置頂功能、醒目功能

  1. 所謂置頂就是會永遠秀在最上方的新聞。簡單想,就是優先讀出的新聞。
  2. 如何讓系統知道此新聞要優先讀出?很簡單,多設一個欄位(如:status)來註記即可。
  3. 請編輯eznews.sql檔,加入一組欄位(同時記得真的去資料表新增一個欄位):
    `status` varchar(255) NOT NULL,
  4. 表單部份,請多一個「置頂」的勾選鈕(可用checkbox)。
  5. 依序修改儲存、更新的SQL語法。
  6. 讀出時,方法有二,比較簡單的想法是先讀出「status='置頂'」的文章,再讀出「status!='置頂'」即可。但缺點是要分兩次處理,另一個比較好的方法是利用order 欄位='指定值' desc 的方式來處理:
    select * from eznews order by status='置頂' desc , a.post_time desc";
  7. 同樣的方法,亦可製作所謂的醒目功能(亮色底色)。

三、 計數器

  1. 請編輯eznews.sql檔,加入一組欄位(同時記得真的去資料表新增一個欄位):
    `counter` smallint(5) unsigned NOT NULL,
  2. 當使用者進入某篇文章時,計數器就+1,可以寫個函數來做此事。
  3. 主要就是去更新資料表的counter欄位:
    update eznews set counter=counter+1 where sn='$sn'
    
  4. 特別注意!更新文章時,切勿更新counter欄位。
  5. 讀出時,可用Bootstrap的徽章樣式來套用到計數器上:
    <span class='badge badge-info'>{$news['counter']}</span>

四、 製作圖形計數器 (補充)

  1. 請建立一個新檔案,例如:counter.php,其內容如下:
    <?php
    $counter=isset($_REQUEST['counter'])?intval($_REQUEST['counter']):0;
    header("Content-type: image/png");
    $im = @imagecreatetruecolor(28, 18) or die("無法建立圖片!");
    $text_color = imagecolorallocate($im, 255, 255, 255);
    imagestring($im, 2, 5, 2, $counter, $text_color);
    imagepng($im);
    imagedestroy($im);
    ?>
  2. imagecreatetruecolor() 用來建立一個全彩的圖片格式,裡面分別是寬和高。
  3. imagecolorallocate() 用來設定顏色,分別為 R(紅)G(綠)B(藍),值從 0~255
  4. imagestring() 用來加上文字,第二個參數是字形型,有1~6種,第三、四個參數是x,y的位置,接著填入欲呈現數字(或英文),最後填入顏色。
  5. imagepng()是做成png圖檔
  6. imagedestroy()用來釋放圖檔佔用的記憶體。
  7. 最後,請在要呈現的地方,利用HTML圖片語法即可秀出該圖:
    <img src=”counter.php?counter=12345”>

五、 一次讀兩個以上的資料表

  1. 關聯資料表方便的地方就是:一次可以讀取兩個以上的資料表,簡易語法如下:
    select  a.* , b.* , c.*
    from `資料表1` as a
    join `資料表2` as b on a.`索引欄位`= b.`索引欄位`
    join `資料表3` as c on b.`索引欄位`= c.`索引欄位`
    where a.欄位='值' and ….
    
  2. 「left join」代表以左邊為主,順便到右邊撈撈看有無指定的資料。
  3. 「right join」代表以右邊為主,順便到左邊撈撈看有無指定的資料。
  4. 「join」代表兩邊都要同時有資料,否則該筆資料不會出現。
  5. 以本例而言,讀出新聞順便讀出新聞分類的寫法:
    select a.*,b.* from eznews as a
    left join eznews_cate as b on a.cate_sn=b.cate_sn
    order by a.post_time desc
  6. 此處用left join,這樣才不會因為沒有設定新聞分類而導致新聞出不來。

六、 其他常用的join的方式

  1. inner join:
    select  a.* , b.*
    from `資料表1` as a , `資料表2` as b
    where a.`索引欄位`= b.`索引欄位`
  2. natural join:自動搜尋兩資料表相同欄位,自動對應
    select  a.* , b.*
    from `資料表1` as a  natural join `資料表2` as b

 

 


:::

搜尋

QR Code 區塊

https%3A%2F%2Fwww.tad0616.net%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D34%26tbdsn%3D1085

書籍目錄

展開 | 闔起

線上使用者

47人線上 (8人在瀏覽線上書籍)

會員: 0

訪客: 47

更多…