本章讓我們使用sp框架來制作一個簡單的留言本程序,在實例中學習程序開發是非常有效的。同時,我們也可以體會一下實際網絡項目的開發流程。
?[guestbook4-5[1].rar](http://www.speedphp.com/forum.php?mod=attachment&aid=NzA5fDdkOGFmMDhjfDE0NDUyNDI3MjN8NjMwOXwzNzE4)?(1.92 KB, 下載次數: 1854)?
首先我們來看看,留言本的需求,也就是我們的程序將要實現什么功能:
* 訪問者可以查看留言首頁(也就是留言列表)。
* 訪問者可以查看單一條留言的詳細內容。
* 訪問者可以進行留言。
請注意,我們的“需求”都是以訪問者為中心的。但同時我們還可以以訪問者和管理員為中心,只是本章介紹的留言本還暫時沒有加入管理功能。
為了簡單起見,我們并沒有加入管理功能的需求。我們再來想想,在上面三個過程中所涉及的數據有哪些?對,僅是留言信息。那么我們大致考慮,留言信息會包括:留言標題,留言內容,留言者名字。另外,我們留言的信息還需要包括一個唯一的標志,以區分每一條留言。好了,那么我們就可以得出,留言本程序的數據表僅有一個“留言表”(起個英文名叫guestbook),它的大致結構是:
* 留言標題,字符串(也就是中英文)形式,大概不會多于50字。用title做數據表的字段名稱。
* 留言內容,字符串,也不會多于200字吧,用contents做字段名。
* 留言者名字,字符串,大概在20個字以內,用name做字段名。
* 唯一標志,一般用數字形式的ID。用id做字段名。
按以上的說明,我們可以得出以下的數據表結構。
~~~
CREATE TABLE `guestbook` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(50) ,
`contents` varchar(200) ,
`name` varchar(20) ,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
~~~
> 對于數據庫知識,我們提倡的是按需學習,也就是用到哪些就學哪些,畢竟“書上講得深奧,實際沒有用到”,那就是費力不討好。并且,在實際工作中,PHP程序員所需要的,也僅僅是一小部分的數據庫知識,萬一遇到更復雜的數據庫需求我們也有非常多的解決途徑,比如同事之間討論,SpeedPHP論壇求助,找GOOGLE大神等等。所以除非是很有必要(比如工作是程序員兼數據庫管理員DBA的人員),不然數據庫知識方面,我們也是淺嘗輒止即可。
> 初學PHP,我們建議可以了解一下以下的數據庫知識就足夠,不需要給自己太多的學習壓力。
> 在類似PhpMyAdmin的數據庫管理工具中,如何建表。
> CREATE,UPDATE,DELETE,SELECT四個語言的簡單用法。
> 懂得思考和想方法解決遇到的問題。
> 使用數據庫管理工具而不用純粹SQL語句和命令行并沒有什么荒廢知識的問題,畢竟那會更簡單快捷并且避免許多問題,這是提高開發效率的必然選擇。
在PhpMyAdmin中建好了guestbook表

然后,我們可以在index.php中對程序進行數據庫的配置:
~~~
<?php
// sp框架的目錄,SpeedPHP.php文件所在的目錄
define("SP_PATH", dirname(__FILE__) . "/SpeedPHP");
// 應用程序目錄,controller和model等文件夾所在的目錄,這里設置的是根目錄
define("APP_PATH", dirname(__FILE__));
// 這里開始是應用程序的配置
$spConfig = array(
"db" => array( // 數據庫設置
'host' => 'localhost', // 數據庫地址,一般都可以是localhost
'login' => 'root', // 數據庫用戶名
'password' => '123456', // 數據庫密碼
'database' => 'test' // 數據庫的庫名稱
)
);
require(SP_PATH . "/SpeedPHP.php");
spRun(); // SpeedPHP 3新特性
?>
~~~
> 請注意index.php的目錄位置,這是我們應用程序的入口文件,同時也是配置文件。
上面提到訪問者進行的三個動作:看留言本首頁,看留言內容,留言。好的,那么我們的main.php,就可以是下面的樣子了:
~~~
<?php
class main extends spController
{
function index() // 這里是首頁
{
}
function show() // 這里是查看留言內容
{
}
function write() // 這里是留言
{
}
}
?>
~~~
將main.php放到controller目錄里面后,我們建立一個guestbook.php放到model目錄里面,那是鏈接數據庫所要做的。guestbook.php的代碼很簡單:
~~~
<?php
class guestbook extends spModel
{
var $pk = "id"; // 每個留言唯一的標志,可以稱為主鍵
var $table = "guestbook"; // 數據表的名稱
}
?>
~~~
> 請注意,全部PHP文件都需要是UTF8編碼,用PHP編輯器另存為就可以做到。
上面準備的程序,就可以說系統架構。
準備好了這些程序后,我們可以寫代碼了,main.php的代碼如下:
~~~
<?php
class main extends spController
{
function index() // 這里是首頁
{
$posturl = spUrl("main", "write"); // 用spUrl制造寫留言的地址
echo "<p align=center><h2>我的留言本</h2></p>";
// 下面做一個表單來提交留言,請注意這些輸入框的name屬性,它們都對應了數據表guestbook的字段名!
echo "<p>請寫下您的留言:</p><form action={$posturl} method=POST><p>您的名字:<input type=text name=name></p><p>留言標題:<input type=text name=title></p><p>留言內容:<textarea name=contents></textarea></p><p><input type=submit value=提交></p></form>";
$guestbook = spClass("guestbook"); // 用spClass來初始化留言本數據表對象(模型類對象)
if ($result = $guestbook->findAll()) { // 用findAll將全部的留言查出來
foreach ($result as $value) { // 循環輸出留言信息
$contentsurl = spUrl("main", "show", array(
'id' => $value['id']
)); // 用spUrl制造查看留言內容頁面地址,請注意array('id'=>$value['id'])將傳遞ID到查看頁面,由spArgs來接收。
echo "<p>這里是第{$value['id']}條留言:<a href={$contentsurl} target=_blank>{$value['title']}</a> {$value['name']}</p>";
}
}
}
function show() // 這里是查看留言內容
{
$id = $this->spArgs("id"); // 用spArgs接收spUrl傳過來的ID
$guestbook = spClass("guestbook"); // 還是用spClass
$condition = array(
'id' => $id
); // 制造查找條件,這里是使用ID來查找屬于ID的那條留言記錄
$result = $guestbook->find($condition); // 這次是用find來查找,我們把$condition(條件)放了進去
// 下面輸出了該條留言內容
echo "<p>留言標題:{$result['title']}</p>";
echo "<p>留言者:{$result['name']}</p>";
echo "<p>留言內容:{$result['contents']}</p>";
}
function write() // 這里是留言
{
$guestbook = spClass("guestbook");
$guestbook->create($this->spArgs()); // 這里用$this->spArgs()取得了表單的全部內容,然后增加了一條留言記錄
echo "留言成功,<a href=/index.php>返回</a>";
}
}
?>
~~~
好了,我們可以先將上面代碼復制到我們的main.php里面,運行一下試試吧。

上面的main.php我們在注釋內也能基本了解程序的寫法,在接下來的第五章里面,我們著重以留言本程序來介紹sp框架的數據庫操作。同時,都是用echo來輸出頁面,看起來有些亂,所以第六章我們將改寫這個留言本程序,把它變成用Smarty來輸出的程序。