我个人认为在Seagull框架下进行项目开发,访问操作数据库几乎不能用一个章节来讲述,是因为太复杂吗?不,恰恰相反,是因为实在是太简单了,以至于似乎都不值得一提。但是我们有必要为初学者考虑一下,所以下面我们通过比较我们在不使用框架和使用Seagull框架进行项目开发时进行数据操作的难易程度,所花费的时间和编码的数量来认识和加深初学者对seagull的认识,以及seagull框架在数据库操作方面的优秀表现和灵活性。
PHP下直接访问数据库(以MySQL数据库为例)
不借助任何第三方类库,PHP也允许我们直接通过几个函数就可以实现对MySQL数据库的操作。下面的这几个函数对应了PHP下最原始的实现数据库操作的几个步骤:
1. mysql_connect() 连接数据库服务器
2. mysql_db_select() 选择数据库服务器上要操作的数据库
3. mysql_query() 执行要进行的操作对应的SQL语句
4.
mysql_close() 一切操作结束之后关闭连接
简单的数据库操作实例:
<?php
$host = 'localhost';//数据库服务器的域名或IP
$user = 'mysql_user';//数据库用户名
$passwd = 'mysql_password';//密码
$link = mysql_connect($host, $user, $passwd);
if (!$link) {
die('连接失败: ' . mysql_error());
}
// 选择一个要操作的数据库,比如foo数据库
$db_selected = mysql_select_db('foo', $link);
if (!$db_selected) {
die ('选择数据库foo出错 : ' . mysql_error());
}
//要进行什么操作,在此定义SQL语句
$sql = ‘SELECT * FROM user ’;//假定数据库foo中有一个用户表user
$result = mysql_query($sql);
//取出执行sql语句后的结果集
while ($row = mysql_fetch_assoc($result)) {
echo $row['firstname'];
echo $row['lastname'];
echo $row['address'];
echo $row['age'];
}
//关闭数据库连接
mysql_close($link);
?>
如果你是有一定经验的PHP程序员,你肯定会想这样做会太麻烦,而且实际的项目开发过程当中我们也不可能总是这样来实现数据库的操作,而且也不符合面向对象编程的规范。那么在Seagull下面是如何实现对数据库的操作呢?
Seagull框架下实现数据库操作
那么在Seagull框架下,对数据库的操作又是如何处理的呢。事实上,在Seagull框架下进行项目的开发,很少情况下需要程序员去从头开始按照那些步骤来创建一个数据库的连接,在任意一个manager环境下(我们之前的教程中我们已经知道在Seagull框架下开发的主要工作是编写manager),只要是执行了parent::SGL_Manager()方法之后,那么$this->dbh这个属性就已经被初始化成指向一个PEAR::DB对象实例的句柄以供使用,PEAR::DB包含有对数据库的连接,还有一套数据库操作API。也就是说在任何一个manager的任何一个action方法内,任何时候你都可以通过$this->dbh来操作数据库。看下面的例子:
/**
* Manages loading of modules.
*
* @package default
* @author Demian Turner <demian@phpkitchen.com>
*/
class ModuleMgr extends SGL_Manager
{
function ModuleMgr()
{
SGL::logMessage(null, PEAR_LOG_DEBUG);
parent::SGL_Manager();
...
...
...
function _cmd_list(&$input, &$output)
{
SGL::logMessage(null, PEAR_LOG_DEBUG);
$output->template = 'moduleList.html';
$query = "SELECT * FROM {$this->conf['table']['module']} ORDER BY name";
$aModules = $this->dbh->getAll($query);
// if there are modules, determine whether installed
if (count($aModules)) {
foreach ($aModules as $k => $oModule) {
$aModules[$k]->isInstalled = $this->_isInstalled($oModule->name);
}
}
if ($input->displayDeRegisteredModules) {
$aAllModules = SGL_Util::getAllModuleDirs($onlyRegistered = false);
$aRegisteredModules = SGL_Util::getAllModuleDirs();
$aDiff = array_diff($aAllModules, $aRegisteredModules);
$aDeRegisteredModules = array();
foreach ($aDiff as $modulename) {
$module = new stdClass();
$module->name = $module->title = $modulename;
$module->isInstalled = false;
$module->description = 'Details available when installed ...';
$aDeRegisteredModules[] = $module;
}
$aModules = array_merge($aModules, $aDeRegisteredModules);
}
$output->aModules = $aModules;
$output->addOnLoadEvent("switchRowColorOnHover()");
}
…
…
…
那到底是什么回事?如果你自己有看过Seagull框架的代码,相信你早已经知道答案。不过其实也很简单:Seagull框架自己有一个DB类[SGL_CORE_DIR],是专门用来处理数据相关的操作的,而事实上它只不过是PEAR::DB类的一个封装。正因为如此,我们之前也有提到过Seagull对PEAR库的无缝集成支持,藉由PEAR::DB的强大功能,Seagull框架下你可以轻松实现在不同数据库平台下的数据操作和移植,比如MySQL, PostgreSQL, Oracle等。你不必为每个数据库平台写一套数据库处理类,当然你可能也想自己抽象出一个类似PEAR::DB的数据库操作类,是的,你可以这样做,不过这样做有什么意义呢?没有,你能说你写的的肯定要比PEAR::DB好吗?我觉得不可能,至少很难,而且PEAR::DB是整个PEAR社区共同的智慧啊。那我们下一节就来学习一下PEAR::DB类和Seagull所定义的DB封装类。
本文对比了在Seagull框架下与传统PHP方式操作数据库的差异,Seagull简化了数据库操作流程,通过内置的PEAR::DB实现了跨数据库平台的支持。

1882

被折叠的 条评论
为什么被折叠?



