[1032]PHP入門
一、 整理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,這樣才不會因為沒有設定新聞分類而導致新聞出不來。
- 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