訪問|開發指南|資料|資料庫
這一章我們就來看看 FleaPHP 的資料庫訪問功能。體驗一下 FleaPHP 出色的自動化 CRUD 能力。
串連資料庫
在 htdocs 目錄中建立子目錄 testDB,並在子目錄下建立檔案 test1.php 檔案,內容如下:
<?phprequire('../FLEA/FLEA.php');__FLEA_PREPARE();// 準備資料庫連接資訊$dsn = array( 'driver' => 'mysql', 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'test',);// 擷取資料庫訪問對象$dbo =& get_dbo($dsn);// 串連到資料庫if ($dbo->connect()) { echo 'Connect to database successed.';}?>
請注意這裡我們沒有調用 run() 函數。因此我們需要調用 __FLEA_PREPARE() 函數來初始化 FleaPHP 運行環境。並且 __FLEA_PREPARE() 函數應該在用 register_app_inf() 或 set_app_inf() 修改應用程式設定後調用。
現在啟動 APM Express,通過瀏覽器執行 http://localhost/testDB/test1.php,如果一切正常,應該看到 Connect to database successed 資訊。
如果出現如下的錯誤資訊,說明 MySQL 資料庫的 root 使用者密碼不正確。請修改上面代碼中的 password 資訊。
Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root'@'localhost'
建立記錄
接下來,我們用 phpMyAdmin 在 test 資料庫中執行下面的 SQL 陳述式。這會建立在 test 資料庫中建立一個名為 posts 的表。
CREATE TABLE `posts` ( `post_id` int(11) NOT NULL auto_increment, `title` varchar(255) NOT NULL, `body` text NOT NULL, `created` int(11) default NULL, `updated` int(11) default NULL, PRIMARY KEY (`post_id`)) DEFAULT CHARSET=gb2312;
現在我們修改 test1.php 的內容為以下內容:
<?phprequire('../FLEA/FLEA.php');// 準備資料庫連接資訊$dsn = array( 'driver' => 'mysql', 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'test',);// 指定資料庫連接設定,TableDataGateway 會自動取出 dbDSN 設定來串連資料庫set_app_inf('dbDSN', $dsn);// 初始化 FleaPHP 運行環境__FLEA_PREPARE();// 由於 FLEA_Db_TableDataGateway 並不是自動載入的,因此需要明確載入load_class('FLEA_Db_TableDataGateway');// 從 FLEA_Db_TableDataGateway 派生 Posts 類class Posts extends FLEA_Db_TableDataGateway{ // 指定資料表名稱 var $tableName = 'posts'; // 指定主鍵欄位名 var $primaryKey = 'post_id';}// 構造 Posts 執行個體$modelPosts =& new Posts();// 建立一條新記錄,並返回新記錄的主索引值$newPostId = $modelPosts->create(array( 'title' => 'First post', 'body' => 'First post body',));echo $newPostId;?>
在瀏覽器重新運行 test1.php,會看到輸出結果 1。如果多重新整理幾次,可以看到這個數字不斷增長。現在轉到 phpMyAdmin,瀏覽 posts 表,會發現這個表已經插入了資料。
注意上圖中劃紅圈的 created 欄位。雖然我們上面的代碼在用 $modelPosts->create() 插入記錄時並沒有提供該欄位的值,但該欄位的值被自動填滿了。
當資料表中具有名為 created、created_at 或 created_on 的欄位,並且欄位類型為整數或日期,則在向這個資料表插入記錄時。FleaPHP 會自動用目前時間填充該欄位。同樣的,updated、updated_at 或 updated_on 欄位會在更新記錄時用目前時間填充。
關於 FLEA_Db_TableDataGateway
FLEA_Db_TableDataGateway 是一個提供自動化 CRUD 操作的類。開發人員必須從該類派生自己的類。每一個 FLEA_Db_TableDataGateway 衍生類別對應一個資料表。例如上面代碼中的 Posts 類就對應資料表 posts。FLEA_Db_TableDataGateway 衍生類別在 FleaPHP 應用程式中稱為表資料入口。
每一個表資料入口都需要定義一個必須的成員變數:
- $tableName 指定該表資料入口對應的資料表
如果資料表有多個主鍵欄位,那麼還要用 $primaryKey 指定要使用的主鍵欄位。當沒有用 $primaryKey 指定時,FLEA_Db_TableDataGateway 會自動根據資料表定義來確定主鍵欄位名。
完成上面的定義後,一個表資料入口類就準備好了。只要執行個體化這個類,就能對該類對應的資料表進行各種操作了。
讀取和更新記錄
現在我們繼續修改前面的代碼,增加如下內容:
/** * .... 接續上面的程式碼片段 */echo "<hr />\n";// 讀取剛剛建立的新記錄$post = $modelPosts->find($newPostId);// 輸出記錄內容dump($post);// 修改記錄內容$post['title'] = 'New title';// 儲存修改後的記錄到資料庫$modelPosts->update($post);// 重新查詢被修改後的記錄$updatedPost = $modelPosts->find($newPostId);// 輸出修改後的記錄內容dump($updatedPost);
現在通過瀏覽器執行 test1.php,就可以看到兩個稍有不同的輸出。
第一段輸出是用 $modelPosts->find() 取出的記錄內容。而第二段資料是用 $modelPosts->update() 更新後再取出的記錄內容。
對比兩段輸出,可以看到第二段輸出的 title 欄位和 updated 欄位都被修改了。
刪除記錄
刪除記錄有兩種主要的方式,一是用表資料入口的 remove() 方法,以一條記錄做參數。另一種方法是用 removeByPkv() 方法,以記錄的主索引值做參數。
// 取出所有 title 欄位值為 'First post' 的記錄$posts = $modelPosts->findAll(array('title' => 'First post'));// 刪除這些記錄foreach ($posts as $post) { $modelPosts->remove($post); // 或者使用 // $modelPosts->removeByPkv($post[$modelPosts->primaryKey]);}
這個章節裡面,我們粗略的看了一下 FleaPHP 提供的表資料入口提供的基本操作。在後續章節裡面,我們會看到表資料入口的其他強大功能。