首页 > PHP框架 > FleaPHP > 正文

FleaPHP 开发指南 6. 访问数据库
2010-01-06 22:01:15   来源:   评论:0 点击:

这一章我们就来看看 FleaPHP 的数据库访问功能。体验一下 FleaPHP 出色的自动化 CRUD 能力。



连接数据库

在 htdocs 目录中创建子目录 testDB,并在子目录下创建文件 test1.php 文件,内容如下:

<?php

require('../FLEA/FLEA.php');
FLEA::init();

// 准备数据库连接信息
$dsn = array(
    'driver'        => 'mysql',
    'host'          => 'localhost',
    'login'         => 'root',
    'password'      => '',
    'database'      => 'test',
);

// 获取数据库访问对象
$dbo =& FLEA::getDBO($dsn);

// 连接到数据库
if ($dbo->connect()) {
    echo 'Connect to database successed.';
}

?>

请注意这里我们没有调用 run() 函数。因此我们需要调用 FLEA::init() 函数来初始化 FleaPHP 运行环境。并且 FLEA::init() 函数应该在用 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`)
);

现在我们修改 test1.php 的内容为以下内容:

<?php

require('../FLEA/FLEA.php');

// 准备数据库连接信息
$dsn = array(
    'driver'        => 'mysql',
    'host'          => 'localhost',
    'login'         => 'root',
    'password'      => '',
    'database'      => 'test',
);
// 指定数据库连接设置,TableDataGateway 会自动取出 dbDSN 设置来连接数据库
set_app_inf('dbDSN', $dsn);

// 初始化 FleaPHP 运行环境
FLEA::init();

// 由于 FLEA_Db_TableDataGateway 并不是自动载入的,因此需要明确载入
FLEA::loadClass('FLEA_Db_TableDataGateway');

// 从 FLEA_Db_TableDataGateway 派生 Posts 类
class Posts extends FLEA_Db_TableDataGateway
{
    // 指定数据表名称
    var $tableName = 'posts';
    // 指定主键字段名
    var $primaryKey = 'post_id';
}

// 构造 Posts 实例
$modelPosts =& new Posts();
// 创建一条新记录,并返回新记录的主键值
$row = array(
    'title' => 'First post',
    'body'  => 'First post body',
);
$newPostId = $modelPosts->create($row);
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 提供的表数据入口提供的基本操作。在后续章节里面,我们会看到表数据入口的其他强大功能。

相关热词搜索:

上一篇:FleaPHP 开发指南5. 应用程序设置
下一篇:FleaPHP 开发指南 7. 数据表关联

分享到: 收藏
频道总排行
频道本月排行