文章利用了一個簡單的實例來實現php從數據庫中讀取數據詳細講解,有需要的朋友可以看看,這裡同時還簡單的講到了安全問題。
先看段代碼
代碼如下 復制代碼<?php
session_start();
$con=mysql_connect('localhost','root','root') or die('鏈接數據庫失敗!');
mysql_query('set names utf8');
mysql_select_db('GuestBook');
$pagesize = 10;//每一頁顯示多少留言記錄
if(isset($_GET['page'])&&$_GET['page']!='') $page=$_GET['page'];
else $page=0;
$sql = "SELECT a . * , b.name, b.email, b.qq, c.revert_time, c.revert
FROM post a
LEFT JOIN revert c ON ( a.id = c.post_id ) , guest b
WHERE a.guest_id = b.id
ORDER BY a.id DESC";
$numRecord = mysql_num_rows(mysql_query($sql));
$totalpage = ceil($numRecord/$pagesize);
$recordSql = $sql. " LIMIT ".$page*$pagesize.",".$pagesize;
$result = mysql_query($recordSql);
?>
下面來看看
第一行:我們暫時先不說,留到以後再說,暫時還用不到;
第二行——第五行:大家一定很眼熟吧,是的這裡和post.php插入留言信息的時候的過程是一樣的,也就不多說了。
7、8、9和19行我們暫時不說,這裡是涉及到分頁的,我們將會留到下一章詳細的說明這個問題,因為分頁的過程在web編程過程中幾乎是一個必須要使用的功能。
在11-15行我們定義了一個數據庫查詢語句,在這條語句中我們用了left join …on..語句,關於這個語句的詳細用法請參看Mysql手冊聯合查詢部分。。
看第16行,
代碼如下 復制代碼$numRecord = mysql_num_rows(mysql_query($sql));
這個語句中我們用mysql_query($sql)把我們定義的sql語句發給數據庫來執行,這個語句執行以後會返回一個記錄資源號,我們用外層的mysql_num_rows來取得有多少個匹配的記錄——也就是返回的記錄總數。
第17行我們用到了ceil函數,這個函數的功能是,進一法取整,也就是說兩個數進行除法操作之後只要余數大於零整數部分就加一然後捨去小數部分,所以ceil(1/2)的結果是1,而不是我們通常所見到的0.5。這個對於我們來說很有用——也留到下一章分頁的時候再說吧。
第19行,涉及到分頁部分。但是這一行值得說的是,在PHP中字符串的相加,也就是字符串的連接。兩個字符串相加的操作符是點,看例子:
代碼如下 復制代碼$strFirst=”中國”;
$strTwo=”偉大的國度”;
$strSum = $strFirst.$strTwo;
echo $strSum;
輸出的結果正如我們所料到的一樣:中國偉大的國度。
第20行:我們發送一個帶分頁功能的sql語句到數據庫執行,並把執行結果賦值給$result;
接著我們看,本頁函數的第:128-154行,這個程序的片段功能是循環輸出在數據庫中查詢到的記錄。這是我們本章的重點:
看PHP的內置函數mysql_fetch_object()從結果集中取得一行作為對象,關於PHP的對象我們在高級編程欄目中將會詳細的說明,我們這裡只需要知道這種循環查詢記錄的方式,需要用 $對象->字段名 來訪問就行了,執行起來的時候就是每一次指針下移一次,當遇到沒有更多的記錄的時候就返回一個false所以我們可以用while循環來讀取$result的這個記錄集。最終形成了while($rs=mysql_fetch_object($result))這個語句,循環調用mysql_fetch_object函數並且把每次返回的對象賦值給$rs變量,現在哦我們看這個循環的內部,我們可以用$rs->name來取得留言人姓名,用$rs->post_time來訪問留言時間。
在顯示post_time的時候我們做了一些處理,使用到了date()函數,記得我們存儲留言的時候用到了time()函數,這個函數返回的是一個時間戳,就是從1970年的第一秒起到現在已經經過的秒數(格林尼治時間)。而date函數就是把這個秒數翻譯為我們所需要的時間格式,返回怎樣的字符串需要們在date()函數的第一個參數中制定,該函數的第二個參數如果沒有給出,也就是需要翻譯成時間格式的秒數沒有給出的話,他就會以當前時間來翻譯。
Date(“Y年m月d日 H:i:s”),輸出結果就是2009年4月26日 11:16:20。
我們在index.php的132行有這樣的寫法:
代碼如下 復制代碼 <?php echo date(”Y-m-d H:i:s”,$rs->post_time+8*3600)?>我們具體說說這個,我想大家一定會對8*3600這個地方感到奇怪,其實原因很簡單。咱們用time()函數存儲時間的時候用的是格林尼治時間,這個時間和我們的時間相差剛好八個小時,每個小時3600秒,我們處在東方比西方的時間快所以要加上的。記住我們用的是北京時間——處在東八時區哦,這個是常識!關於這一點還有一個做法,這將會在專門闡述PHP的日期函數的文章裡詳細說明。
144和146行都用了兩個函數htmlspcialchars和nl2br,其中htmlspcialchars這個函數是為了避免用戶輸入的腳本代碼(html和javascript)被執行而必須的,這個函數很重要。如果沒有這個函數用戶輸入的js代碼和html代碼都會被作為頁面程序的一部分被執行,這一點我們在《關於PHP代碼安全性建議》一文中已經說過,不在贅述。
nl2br這個函數的作用是講數據中的n換行轉換成html的換行<br/>以便於頁面表現。在我們輸入留言信息的時候,用的<textarea></textarea>這個表單,保存信息的時候,換行使用n來表示的所以我們這裡需要轉換,以保留用戶輸入信息在顯示的時候我輸入時段落一致。