这一章我们就来看看 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 是一个提供自动化 crud 操作的类。开发者必须从该类派生自己的类。每一个 flea_db_tabledatagateway 派生类对应一个数据表。例如上面代码中的 posts 类就对应数据表 posts。flea_db_tabledatagateway 派生类在 fleaphp 应用程序中称为表数据入口。
每一个表数据入口都需要定义一个必须的成员变量:
如果数据表有多个主键字段,那么还要用 $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 提供的表数据入口提供的基本操作。在后续章节里面,我们会看到表数据入口的其他强大功能。
新闻热点
疑难解答