7.
置頂、計數器與 join
一、 整理post.php
- 顏我們將發布表單的HTML語法放在post_tpl.html樣板檔中,如此,會造成post.php不好維護的問題,因此,我們將發布表單做成函數,並傳回完整表單語法。
- 可利用Heredoc定界符<<<的用法(左邊不可有任何空白)來做:
$form = <<<form
//表單HTML語法(這裡面要秀出$或"或'都不用加\)
form;
- 樣板中,原本的表單位置請用[var.main]及[var.error_msg]樣板標籤代替之。
- 預設流程中,請去呼叫發布表單的函數。該函數需可傳入一個流水號參數,以便讓程式判斷是新增還是修改。若是修改(有流水號),則讀出該筆資料預設值。
二、 置頂功能、醒目功能
- 所謂置頂就是會永遠秀在最上方的新聞。簡單想,就是優先讀出的新聞。
- 如何讓系統知道此新聞要優先讀出?很簡單,多設一個欄位(如:status)來註記即可。
- 請編輯eznews.sql檔,加入一組欄位(同時記得真的去資料表新增一個欄位):
`status` varchar(255) NOT NULL,
- 表單部份,請多一個「置頂」的勾選鈕(可用checkbox)。
- 依序修改儲存、更新的SQL語法。
- 讀出時,方法有二,比較簡單的想法是先讀出「status='置頂'」的文章,再讀出「status!='置頂'」即可。但缺點是要分兩次處理,另一個比較好的方法是利用order 欄位='指定值' desc 的方式來處理:
select * from eznews order by status='置頂' desc , a.post_time desc";
- 同樣的方法,亦可製作所謂的醒目功能(亮色底色)。
三、 計數器
- 請編輯eznews.sql檔,加入一組欄位(同時記得真的去資料表新增一個欄位):
`counter` smallint(5) unsigned NOT NULL,
- 當使用者進入某篇文章時,計數器就+1,可以寫個函數來做此事。
- 主要就是去更新資料表的counter欄位:
update eznews set counter=counter+1 where sn='$sn'
- 特別注意!更新文章時,切勿更新counter欄位。
- 讀出時,可用Bootstrap的徽章樣式來套用到計數器上:
<span class='badge badge-info'>{$news['counter']}</span>
四、 製作圖形計數器 (補充)
- 請建立一個新檔案,例如: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);
?>
- imagecreatetruecolor() 用來建立一個全彩的圖片格式,裡面分別是寬和高。
- imagecolorallocate() 用來設定顏色,分別為 R(紅)G(綠)B(藍),值從 0~255
- imagestring() 用來加上文字,第二個參數是字形型,有1~6種,第三、四個參數是x,y的位置,接著填入欲呈現數字(或英文),最後填入顏色。
- imagepng()是做成png圖檔
- imagedestroy()用來釋放圖檔佔用的記憶體。
- 最後,請在要呈現的地方,利用HTML圖片語法即可秀出該圖:
<img src=”counter.php?counter=12345”>
五、 一次讀兩個以上的資料表
- 關聯資料表方便的地方就是:一次可以讀取兩個以上的資料表,簡易語法如下:
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 ….
- 「left join」代表以左邊為主,順便到右邊撈撈看有無指定的資料。
- 「right join」代表以右邊為主,順便到左邊撈撈看有無指定的資料。
- 「join」代表兩邊都要同時有資料,否則該筆資料不會出現。
- 以本例而言,讀出新聞順便讀出新聞分類的寫法:
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
- 此處用left join,這樣才不會因為沒有設定新聞分類而導致新聞出不來。
六、 其他常用的join的方式
- inner join:
select a.* , b.*
from `資料表1` as a , `資料表2` as b
where a.`索引欄位`= b.`索引欄位`
- natural join:自動搜尋兩資料表相同欄位,自動對應
select a.* , b.*
from `資料表1` as a natural join `資料表2` as b