簡單的php新聞發布系統教程(第一版)第一講:用 phpmyadmin 建立數據庫首先建立一個數據庫,名為 yayu 。在這個數據庫下建立一個數據表,名為 news 。下面進入一個重點,那就是在表 news 下建立各個字段。
那麼,什麼叫字段呢?通俗點,就是一類事物的總稱。比如說,所有的新聞發表時間用一個名詞來代表(從偶的經驗來看,用 phpmyadmin 建立 字段可以用中文,但從習慣來說還是用英文,沒辦法,計算機美國最牛嘛)。偶們用“ time ”來表示。在字段 time 下可以有很多“發表時間”,那 麼如何來區分這些時間呢,這個可以查詢其它字段下的內容,比如偶們建立新聞的標題的字段為“ title ”, title 字段下的內容按照常理說來是 沒有一樣的。所以可以通過一個標題來查詢這個發表時間。其實我們可以讓每個 title 或 time 下的內容都對應一個編號,那就是字段——
“ id ”:字段“ id ”是一個人們默認的首選字段,其它字段下的內容可以重復出現,但這個字段卻是從 1 開始增大的阿拉伯數字。在設置這 個字段時,要設置主鍵、索引、唯一以及 auto-increment 。這個 auto-increment 就是自動增加的意思。當任一字段增加內容 時,這個字段就自動增加 1 ,也就是說,任一字段都對應一個唯一的 id ,比如 1 、 2 、 0 27 ……
下面談談新聞部分字段的建立。
1. id :意義為每個新聞的編號,它是唯一的,類型為 tingint ,這個 tingint 類型無須指定長度,系統默為 4 ;在“額外”中選擇 auto-increment ,並選擇主鍵。
2. author :意義為作者 (新聞發布人),設置類型為 varchar ,設置這個字段長度時,如果考慮作者均為中國人,則 8 個字節為上限( 4 個漢字),但如果考慮到作者 可能為外國人, 8 個字節顯然太少了,對其它字段也存在同樣的問題,在這裡偶們把長度設置為 8 吧。
3. title :意義為新聞標題,類型為 varchar ,長度為 60 吧,屬性為 primany key 。
4. content :意義為新聞的內容,類型為 text 。這個類型無須設置長度了。
5. source :意義為新聞的來源,類型為 varchar ,長為 60 。
6. date :意義為發表時間,類型為 datetime ,長度無須設置,屬性為 primany key 。
下面補充以下字段類型的相關內容:
1 . date :時間和日期類型。時間和日期類型還包括以下:
⊕ datetime : 0000-00-00 00:00:00
⊕ date: 0000-00-00
⊕ timestamp: 00000000000000 ( 14 個 0 ,長度取決於顯示尺寸)
⊕ time: 00:00:00
⊕ year: 0000
2 . conten t 字段代表新聞內容,由於其容量可能會很大,因此采用 text 類型(最多支持 65535 字節)
3 . title 字段設置為 primany key ,如果不會有一條以的新聞具有相同的發表時間, date 字段也可以作為? primany key ,這樣今後對新聞的排序和檢索會更加方便。
4 . text 類型的字段雖然也屬於一種字符類型,但其大小不能指定,如果設置長度,則系統會提示 SQL 語句出錯。
現在, news 數據表就建立好了。
由於新聞不是所有人都能增加的,只能有管理員來做,所以現在我們再來建立數據表 users 來存放管理員們。
1 : id :類型為 tinyint ,額外設置為 auto-increment、主鍵。
2 : name :意義為管理員名稱,類型為 varchar ,長為 8 ,屬性為 primany key 。
3 : password :意義為密碼, 類型為 varchar ,長為 32 。
4 : mail :一樣為郵件地址, 類型為 varchar ,長為 30 。
現在,兩個數據庫就設置好了,下面偶們進入新聞程序的開發中。
芽雨原創php新聞系統教程(第一版) 第二講:新聞程序的基礎
一.連接數據庫的基礎
偶們添加、取出、修改、刪除新聞都必須首先做一件事,那就是連接主機,選擇數據庫,向數據庫發出請求。否則一切都是紙上談兵。下面介紹三個重要的 MySQL 語句,分別是: mysql_pconnect( ) (連接主機), mysql_select_db( ) (選擇數據 庫), mysql_query() (向數據庫發出請求)。
1 . mysql_pconnect( )
它的作用是連接主機。
語法為: mysql_pconnect( “ 要登陸的主機 ”,” 登陸時的用戶名 ”,” 密碼 ”);
如 mysql_pconnect( “localhost”,”root”,””);
其中的“ localhost ”、“ root ”都是 phpmyadmin 默認下的主機名和用戶名,並且密碼為空。
同功能的函數還有 mysql_connect( ) 。語法是一樣的,區別在於前者開啟一個長期連接,且無法使用 mysql_close() 函數關閉,而後者使用完後要用 mysql_close() 及時的關閉。對於一個網站來說,使用前者比後者好。這樣可以減輕 MySQL 服務器處理連 接和關閉連接的負擔。
這個函數成功連接後,會返回一個連接 ID 。因此,這個函數一般這樣寫:
$link= mysql_pconnect( );
說到這,補充一個函數 mysql_close() ,
語法為: mysql_close(“ 要關閉的連接 ID”);
比如: mysql_close($link);
注:所有 ( ) 內都為字符串,有 $ 符號時就無須 ”” 了。
2 . mysql_select_db( )
它的作用是選擇一個數據庫為當前數據庫。以後的操作就都在這個數據庫中進行了。這個函數如果執行成功,返回一個 true ,否則返回 false 。
語法為: mysql_select_db( “ 數據庫名稱 ”,” 連接的 ID”);
第二個參數可以省略,它會自動尋找並連接最後一個使用的連接 ID 。
在本程序中,這個語句偶們寫成: mysql_select_db( “yayu”,$link);
3 . mysql_query()
它的作用是向服務器發出一個提出請求的字符串。
語法為: mysql_query(“ 提出問題的字符串 ”, 連接 ID);
其中第一個參數是一個完整的 MySQL 語句,第二個參數可以省略,偶一般是把它省略的。
在使用這個函數前應該先用 mysql_select_db( ) 指定要使用的數據庫。
當提問的字符串是 update 、 insert 或 delete 時,函數返回的結果是 true 或 false ,表明查詢是否成功,如果提問字符串是 select 語句則返回一個結果 ID ,如果 select 發生錯誤,則返回 false 。
了解了上面三個重要的函數後,偶們就可以對數據庫發號施令了。那偶們用什麼來發號施令呢?下面偶們再來看四個 MySQL 語句吧!
二.向數據庫發出請求語句基礎知識
它們分別是: insert (向數據庫插入數據)、 delete (刪除數據表中的數據)、 select (檢索數據)、 update (更新數據)。
1 insert ():向數據庫插入數據 。
語法A: insert into 數據表名(字段1,字段2,……) values(“ 字段1 d 的內容 ”,” 字段的2內容 ” …… )
語法B: insert into 數據表名 set 字段1 =” 字段1的內容 ”, 字段 2=” 字段 2 的內容 ”, ……
對A中,字段名可以省略,但後面的 values 部分的內容必須要和 phpmyadmin 中定義的字段順序一樣。
下面請看例子:
A: insert into news(title,date,author,source,content) values($title,$date,$author,$source,$content)
注:上面的“ $ ……“代表了要添加字段的內容,定義時: $ …… = 內容 ;
B: insert into news set title=$title,author=$author
注:如果內容是數字,則 ”” 可以省略。
2 delete ():刪除數據表中的數據
語法: delete from 數據表名 where 指定地點 limit 數字
如果沒有“ where 指定地點”則表中所有數據都沒了。“ limit 數字”可以告訴服務器可以刪除的最大行數。
例子: delete from news where id=$id limit 1
3. select () : 檢索數據
語法: select 字段名1 , 字段2 , …… from 數據表名 where 地點
如果想列出所有記錄中所有列的數據,可以使用“ * “代表字段名。
例子:A: select id,author from news where id=$id
B: select * from news where id=$id
4 update ():更新數據
語法和 insert 幾乎是完全一樣的。
如: update news set author=$author,title=$title where id=$id
值得注意的是,使用 update 語句時,要注意使用 where 字句,否則可能會導致大量的數據丟失。比如:
update news set author=” 芽雨 ”
這個操作會使表中所有的作者都變成“芽雨”了。
再舉一個正面的例子,記錄管理員的表 users 中,如果有一個字段為 age ,用來存儲用戶的年齡,一年後,他們要增加一歲,可以使用以下的語句:
update users set age=age+1
太好了,偶們現在已經掌握程序大部分的基礎了,還有小部分偶們以後在例子中掌握吧。
現在偶們面臨的問題是如何寫出算法了。
芽雨原創php新聞系統教程(第一版) 第三講:新聞程序的算法(一) ------ 添加新聞
一。添加新聞
添加新聞既是向數據庫添加新的數據。
整個算法是這樣的:管理員在表單中填寫新聞的內容,包括: title,author,source,content ,另外兩個字段 ( id,time )的內容有服務器完成,當然也要自己寫程序,只是不由自己手動而已。提交表單後,用 MySQL 語句將它們添加到數據庫中。
下面簡單介紹一下表單中 <input> 標簽和 <textarea></textarea> 標簽。
<input> 標簽為單行文本框。偶們常用的屬性有: name, type 。 name 屬性指定了變量的名稱,既這個名稱代表 了這個 <input> 中的內容。 type 屬性指定了 <input> 中內容的性質。如果 type=text ,則為 一般性的文字。如果 type=password ,則這個“ <input> ”中的內容在浏覽器一律以黑點顯示,這樣可以在輸入內容時不 會在無意中被他人見到而造成數據安全問題。
<textarea></textarea> 標簽為多行文本框,常用屬性為 name 。
在本程序中此段程序如下所示:
<input name="author" type="text" size="40" maxlength="20">
在“ name="author" ”中的 "author" 就代表了“ <input> ”中的內容。同樣的,這個 "author" 也可以是 "title" 或者其他,值得注意的是,這個 "author" 和字段 author 是不一樣的。偶在這個地方提到 兩個非常相似的概念:字段 author 和變量 $author (上面的 ”author” 實際上就是 $ author ,因為它代表了 “ <input> ”中的內容)。雖然它們幾乎是同名的,但可絕對不是一回事。 Author 是數據表 news 裡的一個字段名, PHP 用它來有限定的訪問 MySQL 中的數據,在程序中是不能用其它的字符替換的;而 $author 是本程序中用戶自己設定的變量符號,其值由 “ <input> ”中對應元素的 name 屬性得到。既然它只是變量符號,偶們就可以使用任意字段,只要保證與表單中對應元素的 name 屬性一致就可。之所以選擇用與字段名相同的字符,是因為這樣偶們就不必再費力去多記一個變量名而已。
偶們再來看 <textarea></textarea> 標簽中的內容:
<textarea name="content" cols="80" rows="15" wrap="HYSICAL">
這個 <textarea></textarea> 中的內容是用來得到 content 字段內容的,因為此字段中的內容太多,所以只能用這個標簽了。
當偶們填好這些內容後,只要提交就可以了,那麼這一過程又是如何實現的呢? 下面偶們再來看以下的程序:
<input name="submit" type="submit" value=" 提交新聞 ">
<input type="reset" name=" reset" value=" 重寫新聞 ">
這裡的 type="submit"/ type="reset" 分別代表提交和重寫新聞。 value 屬性的內容在此按鈕上顯示出來。 name=" reset"/ name="submit" 中的含義和上面所說的是一樣的。
HTML 中的表單( form )元素是專門負責也用戶進行交互式操作的。當點擊類型為 submit 的按鈕時,表單中所有的元素都將以變量的形式提交給 action 所指的文件來處理。變量名由該元素的 name 屬性來確定。在本程序中這個代碼如下:
<form action=addnews.php method=post>
在這個地方偶們把處理數據的程序還是放在同一頁面( action=addnews.php ),在 method 屬性中偶們令 method=post ,這裡的 post 是值傳遞的方式。那現在偶們就在 action 指定的頁面來討論以下的程序:
$author=$_POST["author"];
這裡的 $author 是偶們自己定義的變量名, author 是在 <input> 標簽中 name 屬性中定義的名字。 POST 為 <form> 中 method 定義的值傳遞方式。通過這種值傳遞方式得到的數據,偶們一律用 $_POST[" "] 收取。
完整的這類程序如下所示:
if(@$_POST["submit"])
{
$author=$_POST["author"];
$department=$_POST["department"];
$title=$_POST["title"];
$content=parsecontent($_POST["content"]);
$date=date("y-m-d H:i");
mysql_query("INSERT INTO news(title,date,author,department,content) VALUES('$title','$date','$author','$department','$content')");
}
其中的 date( ) 函數用法請查看其他書籍。上面一共是 5 個字段,還有一個字段 id 因為偶們在“額外”中選擇了 auto-increment ,所以上面的數據插入到數據庫時, id 就自動加 1 了。
當然在這個程序前,必須先連接好數據庫,下面的所有與數據庫連接的程序也是一樣的,必須先連接還數據庫。
芽雨原創php新聞系統教程(第一版) 第三講:新聞程序的算法(二) ------- 顯示
二.顯示新聞
添加新聞後,就可以讓別人來看新聞了。
這裡的算法是這樣的:先在新聞首頁上顯示新聞的標題及其他附加內容(如發表時間),這可以用循環輸出的辦法輸出所有的新聞的標題。要查看具體新聞的內容時,點擊新聞標題的超級鏈接進入一個新的頁面查看這條新聞。
在開始這程序之前,鏈接好數據庫。
當新聞很多時,偶們就要給新聞分頁了,偶們設置好每頁顯示 10 條新聞。
具體的分頁程序如下:
$respage = mysql_query("SELECT COUNT(*) FROM news;"); //$num 是數據庫中總紀錄數
while($row = mysql_fetch_row($respage))
{
$num = $row[0];
}
$recordnum =10;
$pages = ceil($num/$recordnum); // $recordnum 是每頁顯示多少條記錄, $pages 是一共有多少頁
if (@$_GET["page"]) // 獲取 url 中的參數 page
{
//$current 是當前頁 ,$pre 是前一頁的, $next 是後一頁, $pre 和 $next 為後面前一頁和後一頁的連接參數 page 的值
// 如果 url 中的參數為 1 ,把當前頁置為 1 前一頁, $pre 也為一, $next 為 2
if($_GET["page"]==1)
{
$current = 1;
$pre = 1;
$next = 2;
}else{
// 如果 url 中的參數不為一(不是第一頁),就把當前頁取值為 url 中獲得的參數, $pre 為當前頁減 1 , $next 為加 1
$current = $_GET["page"];
$pre = $current-1;
$next = $current+1;
}
}else {
// 如果 url 中沒有參數 page ,當前頁置為 1 , $pre=1,$next=2
$current = 1;
$pre = '1';
$next = 2;
}
$now = ($current-1)*$recordnum;
$echopage = "<table width=450 cellpadding=0 cellspacing=0><tr>";
$echopage .= "<td><font>".$pages." 頁 </font></td>";
$echopage .= "<td><font><a href=".$_SERVER["HP_SELF"]."?page=1> 第一頁 </a><font></td><td><font><a href=".$_SERVER["HP_SELF"]."?page=".$pages."> 最後一頁 </a></font></td>";
$echopage .= "<td><font><a href=".$_SERVER["HP_SELF"]."?page=$pre> 前一頁 </a> <a href=".$_SERVER["PHP_SELF"]."?page=$next> 後一頁 </a></font></td>";
$echopage .= "<td><font> 到第 <select name='topage' size='1' onchange='window.location="".$_SERVER["PHP_SELF"]."?page="+this.value'>n";
for($i=1;$i<=$pages;$i++){
if($i==$current)
$echopage .= "<option value='$i' selected>$i</option>n";
else
$echopage .= "<option value='$i'>$i</option>n";
}
$echopage .= "</select> 頁 </font></td>";
$echopage .= "</tr></table>";
對這段程序偶就不做詳細的講解了。因為很麻煩,再說這和新聞程序的算法不是一回事,呵呵。在用的時候,偶們在輸出的新聞標題後面這樣寫就可以了:
echo "<td align='center'>".$echopage."</td>";
放在後面是因為 $echopage. 裡面包含了選擇去第幾頁的程序。
偶們再來看以下程序:
1 : $sql="SELECT * FROM news order by id desc LIMIT $now,$recordnum";
這裡的“ order by id desc ”意為驅除的記錄是按編號由大到小的順序輸出的,換句話說就是新聞的輸出總是新發表的在前面。 “ LIMIT $now,$recordnum ”限制了新聞輸出的數目, id 的大小在 $now,$recordnum 之間,具體 $now,$recordnum 的數值請看上面的分頁程序的講解(粗黑體字部分)。
2 : $res=mysql_query($sql);
這條語句意思是向服務器發送請求,並將返回的結果保存在 $res 中。
3 : $rows=fetch_assoc($res);
這條語句意思是將查詢結果 $res 的內容拆到一個數組 rows 中。如果 $res 中沒有數據,函數返回 false 值。 fetch_assoc( ) 函數的作用和 mysql_fetch_row() 是一樣的。
4 : while($rows)
{
echo "<tr>";
echo "<td align='left' valign='middle'><img src='../sucai/biaozhi.JPG' width='15' height='15'><a href='index.php?id=".$rows["id"]."' target=_blank><font>".$rows["title"]."[".$rows["date"]."]</font></a></td>";
echo "</tr>";
}
while($rows) 便是按 id 的由大到小的順序輸出新聞的。 $rows["title"] , $rows["author"] 就是數組形式的內容了。
下面來談談如何查看每一條新聞的內容。
偶們來看看上面第 4 個程序中的:
<a href='index.php?id=".$rows["id"]."' target=_blank><font>".$rows["title"]."[".$rows["date"]."]</font></a>
其中的“ href='index.php?id=".$rows["id"]."' ”就是第 $rows["id"] 條新聞的具體地址了。從上面也可以看出顯示具體新聞的程序也在 index.php 中了。當偶們點擊這個超級鏈接時,此程序將參數傳遞給 PHP 文件中的同名變量。需要注意的是,你只能向動態頁面傳遞參數,而不能傳遞給 .htm 結尾的靜態頁面。
那這裡所說的參數是指什麼呢?上面的“ index.php?id=".$rows["id"]." ”的“?”就是變量的開始,“ id ”則是變量名,“ ".$rows["id"]." ”就是變量的值了。如果還想向 PHP 文件傳遞更多的參數,可以用“ & ”隔開。例如:
index.php?id=".$rows["id"]."& title=".$rows["title"]."
在本程序中,偶們得到的變量名為“ id ”,現在偶們來分析這段程序吧!
1 :首先偶們要保證這個 id 在數據庫是有數據的,所以偶們用以下語句來判斷:
if(isset($_GET["id"])){ }
這裡的 $_GET["id"] 就是從浏覽器地址欄中接受數據的方式。 isset( ) 是判斷有無數據的函數。
2 :如果有數據,偶們就把以下的程序寫入上面的“ { } ”中。
$sql= "select * from news where id=".$_GET["id"]."";
$res= mysql_query($sql);
$rows=fetch_assoc($res);
while($rows)
{
echo "<table width=750 cellpading=1 cellspacing=1 border=0 >";
echo "<tr>";
echo "<td colspan='3' valign='middle' align='center'><font size='+1' color=red><b>".$rows["title"]."</b></font></td>";
echo "</tr><br>";
echo "<tr>";
echo "<td width='100%' valign='middle' align='center'><font color=red size='2'>".$rows["date"]." ".$rows["department"]." ".$rows["author"]."</font></td>";
echo "<tr>";
echo "<tr>";
echo "<td colspan='3'><hr></td>";
echo "</tr>";
echo "<tr>";
echo "<td colspan='3' valign='middle'><font> ".$rows["content"]."</font></td></tr>";
echo "<tr>";
echo "</table>";
}
相信通過前面的講解,您一定可以看懂上面的程序了。
芽雨原創php新聞系統教程(第一版) 第五講:新聞程序的算法(一) --- 修改、刪
三.修改、刪除新聞
和查看新聞的程序一樣,偶們要先列出所有的新聞標題,然後在選擇具體的新聞進行修改、刪除操作。
在這裡列出新聞標題時,比 index.php 的程序多了一條語句,那就是輸出:
<a href='editnews.php?id=".$rows["id"]."' target=_self> 修改 </a>
通過點擊這個超級鏈接,偶們進入具體的修改、刪除新聞的程序。
具體的程序如下:
if(@$_GET["id"])
{
$id = $_GET["id"];
$sql="SELECT * FROM news WHERE id=$id";
$res = mysql_query($sql);
$row=fetch_assoc($res);
$edit = "<form method=post action=takeedit.php>";
$edit .= "<table width=800 cellpadding=0 cellspacing=0 border=1>";
$edit .= "<tr& gt;<td width=150><font> 第 $id 條新聞 </font></td>& lt;td><font> 標題 : <input type=text name=title value=".$row["title"]." size=80></font></td></tr>";
$edit .= "<tr><td valign=top width=150 border=0><font> 作者 <input type=text name=author value=".$row["author"]."><br> 日期 :<br>".$row["date"]."</font></td><td><font size=-2><textarea cols=90 rows=10 name=content >".$row["content"]."</textarea></font></td></tr></table>";
$edit .= "<input type=hidden name=id value=$id>";
$edit .= "<input type=submit name=edit value= 修改 >";
$edit .= "<input type=submit name=delete value= 刪除 >";
$edit .= "</form>";
echo $edit;
}
上面“ if(@$_GET["id"]) ”中的“ @ ”意思是說禁止函數返回出錯提示。這樣當程序出現異常時,不至於讓普通用戶看見那莫名其妙的出錯信息。
值得一說的是,偶們把可以修改的內容放在屬性 value 中,既“ value=".$row["title"]." ”等。
在 <form> 標簽中把 action 屬性設為“ action=takeedit.php ”,當偶們提交表單後,由 takeedit.php 對數據庫進行操作。
這其中的語句都是偶們在前面提到的,偶就不信你看不懂!!!程序如下:
if(@$_POST["edit"])
{
$author = $_POST["author"];
$title = $_POST["title"];
$content = $_POST["content"];
$source =$_POST["source "];
$date = date("y-m-d H:i");
mysql_query("UPDATE news SET author='$author',title='$title',content='$content', source =' source',date='$date' WHERE id=$id");
}
if(@$_POST["delete"])
{
mysql_query("DELETE FROM news WHERE id=$id LIMIT 1");
}
芽雨原創php新聞系統教程(第一版) 第六講:用戶管理
在這一部分,偶們來看看如何限制管理新聞程序只讓管理員來操作。這包括讓管理員注冊(這個操作最好用 phpmyadmin 進行,畢竟不能隨便讓人當管理員嘛)、登陸、保存管理員的信息以便讓系統識別他並讓他對新聞進行操作、注銷。
在這一講中偶用給程序做注解來介紹相關的知識。
下面請看注冊的程序 :
這個程序分為兩部分,前面是 MYSQL 部分,後面的是 HTML 部分(提交表單)。兩部分連接起來的方式是在提交表單是在 <input> 標簽設置 action="register.php" 。把 MYSQL 放在前面是為了避免有的 PHP 函數不允許前面有 HTML 輸出的緣故。
<?
if(@$_POST["submit"])
{
if (empty ($name) || empty ($password)|| empty ($repassword))
//(empty () 函數是用來判斷裡面的字符是否為空的。
{
echo " 填寫有錯誤,請 <a href='register.php'> 重新填寫 </a>";
}
if($password!=$repassword)
{
echo " 兩次密碼輸入不同,請 <a href='register.php'> 重新填寫 </a>";
}
// 經上面的判斷就可以去數據庫進行操作了,這樣做的目的是為了減輕服務器的負擔。
$link=mysql_connect("localhost","root","");
mysql_select_db("yayu",$link);
$sql="SELECT id FROM users WHERE name='$name'";
$result=mysql_fetch_row(mysql_query($sql));
// mysql_fetch_row() 函數把得到的所有數據存到一個數組中去,這個數組是以數字為
// 引的。在這裡,當返回有數據時, $result 相當於邏輯量 1 了。
// 檢測用戶提交的用戶名是否被注冊
if($result)
{
echo " 已經有相同的用戶名存在,請 <a href='register.php'> 重新填寫 </a>";
}else{
// 如果一切正常,將數據加到數據庫中
$sql="insert into users(name,password) values('$name','$password')";
// 檢測用戶注冊是否成功
if(mysql_query($sql,$link))
{
echo " 注冊成功,請立即 <a href='admin.php'> 登陸 </a>";
}
else
{
echo " 注冊失敗,請 <a href='register.php'> 重試 </a>";
}
}
}else{
?>
<center>
<h1 align="center"> 注冊 </h1>
<form action="register.php" method="OST">// 值傳遞的方式為 POST
<p> 代號 :
<input name="name" type="text" value="" size="15">
<br>
<br>
密碼 :
<input type="password" name="password" size="15" maxlength="50">
</p>
<p> 重新輸入密碼:
<input type="password" name="repassword" size="15" maxlength="50">
<br>
<br>
<input type="submit" name="submit" value=" 注冊 ">
<input type="reset" value=" 重寫 ">
</p></form>
</center>
</body>
</html>
<?
}
?>
再來看登陸和注銷的程序
<?
if(@$_POST["submit"])
{
if(empty ($_POST["username"]))
die (" 請填寫用戶名 ");
// 這裡用了 die() 函數,作用是名字為空時向用戶提出提示信息。
else
$username = $_POST["username"];
// 記錄用戶名。
if(empty ($_POST["password"]))
die (" 請填寫密碼 ");
else
$password = $_POST["password"];
$link=mysql_connect("localhost","root","");
$selectdb = mysql_select_db("yayu",$link);
$sql="select id,password,name from users where name='$username'";
$result=mysql_query($sql)or die (mysql_error ());
while($pa = mysql_fetch_assoc($result))
{ // mysql_fetch_assoc() 函數是把返回的數據以數組的方式保存,數組的下標與字段名 // 相對應
$pwd = $pa[password];
$userid = $pa[id];
// 檢測用戶名是否正確
if(!$result)
{
echo " 錯誤的用戶名 ";
echo "<br><a href='login1.php'> 重新登陸 </a>";
mysql_close($link);
exit;
}
// 檢測密碼是否正確
if($pwd != $password )
{
echo " 親愛的 ".$username."<br>";
echo " 您輸入了錯誤的密碼 ";
echo "<br> 請您 <a href='admin.php'> 重新登陸 </a>";
mysql_close($link);
exit;
}
// 如果一切正常,則設置 Cookie
setcookie("username",$_POST["username"]);
header("Location:admin.php");
}
if(@$_GET["action"]=="logout")
{
setcookie("username","");
header("Location:index.php");
}
}
?>
在上面的程序中,有一個很重要的東西,那就是 Cookie 。
Cookie 是 Web 服務器存儲在客戶端的小型數據包,當用戶再次連接放置 Cookie 的 Web 服務器時, Web 服務器可以再次讀出它防止在 Cookie 的數據,再通過 Cookie ,服務器可以將特定的信息放在訪問者的機器上。
偶們從程序中可以看見一個 Cookie 函數 setcookie() ,它用來存儲用戶的名字,語法為: setcookie(" 自定義的用戶名 "," 用戶的名字 ");
在偶寫的程序中“自定義的用戶名”用的是“ username ”,當“用戶的名字”為空時,
就相當於注銷了。
當偶們的一些客戶端操作需要管理員執行時,偶們就要用到 Cookie 了。偶們使用 if(@$_COOKIE["username"]) (這個得到數據的方式是不是和 POST 的很像呀)
來做判斷。如果 username 有值,那它就做為邏輯量中的 1 了。