從前面的留言本例子,我們可以看到使用sp框架進行開發,在查找和新建數據庫記錄的時候是不需要使用SQL語句的,而且非常的簡單易用。下面我們就來詳細地介紹一下在sp框架中簡便的數據表操作。使用數據庫,首先是需要應用程序配置,留言本中使用了以下的配置:
~~~
"db" => array( // 數據庫設置
'host' => 'localhost', // 數據庫地址,一般都可以是localhost
'login' => 'root', // 數據庫用戶名
'password' => '123456', // 數據庫密碼
'database' => 'test', // 數據庫的庫名稱
),
~~~
> 如果您是使用虛擬主機,上面的數據庫設置請咨詢您的主機服務商。如果您是使用SpeedAMP進行開發的話,默認的配置就是上面所寫的。
配置好了我們的應用程序后,就可以對每一個數據表,都在model目錄下新建一個數據模型類文件。如留言本中的guestbook文件一樣。數據模型類文件可以很簡單:
~~~
<?php
class guestbook extends spModel
{
var $pk = "id"; // 數據表的主鍵
var $table = "guestbook"; // 數據表的名稱
}
?>
~~~
這里要注意的是文件名需要和類名相同,然后設置主鍵和表名即可。
接下來我們就可以在我們的controller程序里面直接使用find/findAll,create之類的函數來替代mysql函數和SQL語句了。這里我們介紹幾個常用的函數:
findAll
按條件查找記錄,返回數組
findAll($conditions)的$conditions是條件,可以為空,也可以是數組或者字符串。比如留言本中:
~~~
$guestbook = spClass("guestbook");
if( $result = $guestbook->findAll() ){
~~~
$conditions留空代表著查出表中的全部記錄。
$conditions為字符串,那么字符串代表的就是查詢條件,如$conditions = " name = 'jake' ";那么將查找“留言者名稱是jake”的全部記錄。如$conditions = " name = 'jake'??AND title = '我是標題"; 將查找“留言者名稱是jake,同時留言標題是‘我是標題’”的全部留言。
$conditions為數組,那么每項分別是一個條件,比如:
$conditions = array("name" => 'jake' , "title" => '我是標題");和$conditions = " name = 'jake'??AND title = '我是標題";是一樣的。
改寫后的main.php就是:
~~~
<?php
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來初始化留言本數據表對象(模型類對象)
$conditions = array(
"name" => 'jake',
"title" => '我是標題'
);
if ($result = $guestbook->findAll($conditions)) { // 用findAll將“留言者名稱是jake,同時留言標題是‘我是標題’”的留言查出來
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>";
}
}
}
?>
~~~
發幾條留言,其中有的是符合條件而有的不是,那么我們就可以看出結果來了。

find
查找符合條件的第一條記錄
和findAll不同,find僅是查找并返回第一條符合條件的記錄。在留言本中:
~~~
<?php
function show() // 這里是查看留言內容
{
$id = $this->spArgs("id"); // 用spArgs接收spUrl傳過來的ID
$guestbook = spClass("guestbook"); // 還是用spClass
$conditions = array(
'id' => $id
); // 制造查找條件,這里是使用ID來查找屬于ID的那條留言記錄
$result = $guestbook->find($conditions); // 這次是用find來查找,我們把$condition(條件)放了進去
// 下面輸出了該條留言內容
echo "<p>留言標題:{$result['title']}</p>";
echo "<p>留言者:{$result['name']}</p>";
echo "<p>留言內容:{$result['contents']}</p>";
}
function write()
{
} // 這里是留言
?>
~~~
使用了find($condition)來查找ID符合條件的記錄,然后顯示出來。我們可以看到,find獲得的結果數組,也與findAll不同。find的結果是一個由字段名組成的數組,而findAll是每個數組項都像一個find的結果。
create
新增一條記錄
create用起來很容易,只要我們把一個有著“字段名對應數值”的數組放到create里面,那么就可以在數據表中新建一條記錄了。在留言本中,我們是直接將表單提交的數據,也就是spArgs獲取到的數據放到create里面的:
~~~
<?php
function write() // 這里是留言
{
$guestbook = spClass("guestbook");
$guestbook->create($this->spArgs()); // 這里用$this->spArgs()取得了表單的全部內容,然后增加了一條留言記錄
echo "留言成功,<a href=/index.php>返回</a>";
}
?>
~~~
我們可以更詳細點寫以上的代碼:
~~~
<?php
function write() // 這里是留言
{
$guestbook = spClass("guestbook");
$newrow = array(
'name' => $this->spArgs('name'),
'title' => $this->spArgs('title'),
'contents' => $this->spArgs('contents')
);
$guestbook->create($newrow);
echo "留言成功,<a href=/index.php>返回</a>";
}
?>
~~~
這個和前面的效果是一樣的。我們就可以清晰地看到,create($newrow)的$newrow里面是字段名和值的對應了。為什么沒有id這個字段呢?是因為id本身是自增量,所以不需要出現在這里,它是會自動賦值的。
> 這里我們介紹一下spArgs,在表單中提交的數據,(還有,等)里面的name = "what",那么我們在程序中就可以用$this->spArgs("what");來獲得。像留言本中的“留言標題:”我們在程序中就是$this->spArgs('title')來取得標題的輸入值。請理解這一一對應的方式。
> 我們也可以看到,用數組的形式來進行數據庫的操作,的確要比寫SQL語句方便易記,而且不容易出錯。并且也不需要寫mysql_*的函數。
update
修改符合條件的記錄
update使用的方法有些像是findAll和create的結合體,因為update需要和findAll一樣的條件($conditions),也需要像create的$newrow,只是update只是需要修改的才放到$updaterow 里面而已。
我們在留言本中加上一個test_update(),好用來測試update:
~~~
<?php
function test_update() // 測試update用頁面
{
$guestbook = spClass("guestbook");
$conditions = array(
"id" => 2
); // 查找id是2的記錄
$newrow = array(
'name' => '喜羊羊' // 然后將這條記錄的name改成“喜羊羊”
);
$guestbook->update($conditions, $newrow); // 更新記錄
echo "已修改id為2的記錄!";
}
?>
~~~
好了,訪問http://localhost/index.php?c=main&a=test_update,然后看看數據庫記錄。我們的id為2的記錄中的name(留言者名稱)改成了“喜羊羊”。


* 請注意,update里面的$updaterow是需要修改什么才將什么放進去,和create不同。
delete
刪除符合條件的記錄
delete的使用方法和findAll是同樣需要$conditions的,也就是delete將刪除符合條件的全部記錄。
比如我們要刪除那條已經改成name是“喜羊羊”的記錄。
~~~
<?php
function test_delete() // 測試delete用頁面
{
$guestbook = spClass("guestbook");
$conditions = array(
'name' => '喜羊羊'
);
$guestbook->delete($conditions); // 刪除記錄
echo "已刪除名稱是喜羊羊的記錄!";
}
?>
~~~
我們訪問一下test_delete,然后再看看數據庫記錄,剛才那條喜羊羊的記錄已經沒有了。


我們可以看到delete使用的同樣是和findAll一樣的$conditions。同時我們用delete要注意,delete是會刪除全部符合條件的記錄。
> 當然,如果直接用$guestbook->delete(); 是會報錯而不是刪除全部記錄。
上面我們已經看到了find/findAll,create,update和delete這些操作了。這就是的數據庫CRUD操作(CREATE新建,READ查找讀取,UPDATE修改,DELETE刪除)。了解了這些操作,日常的大部分數據庫開發都是可以完成的。因為實踐證明,幾乎大部分的PHP程序只是用到基本的CRUD。
下章我們把留言本繼續改寫,把它變成使用Smarty模板的程序,我們將會看采用了模板的留言本,在PHP代碼上面將更簡潔;而且簡潔的同時,我們的留言本也變成了可以換皮膚的程序了。