浅谈 Joomla! 的数据库访问

浅谈 Joomla! 的数据库访问       
作者:yangqi    
周五, 2008年 10月 10日 20:36 
Joomla!中数据库操作主要分为两类,第一种是基于 JTable 的,第二种则是基于 JFactory::getDBO() 的。两者各有优缺点,看个人的喜好了。如果你不太懂SQL语句,那么JTable可能更加适合你,因为它的执行不需要你提供任何SQL语句(以下会介绍)。

下面开始正式操作了哦,首先在你的 Joomla! 根目录下的 components 文件夹下创建一个名为 com_db 的文件夹(这就是我们要创建的简单组件了),在其中创建名为 db.php 的文件,输入代码 <?echo "<h3>Hi,this is a testing component for database </h3>"?>

由于我在本地调试,所以 在浏览器中输入 http://localhost/joomla/index.php?option=com_db 可以看见输出文字,说明第一步已经搞定了。

在数据库中创建表 jos_db ,如果你安装了 phpMyAdmin 等工具,将更加方便.SQL语句如下

CREATE TABLE `jos_db` (

`id` INT( 2 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 20 ) NOT NULL ,
`comment` VARCHAR( 20 ) NOT NULL

)

接着随便在其中插入几条记录以方便操作。

下面开始数据库操作。

一 基于getDbo

先从简单的查询讲起。

a)查询

$db=& JFactory::getDBO();


$query='SELECT * FROM #__db';
$db->setQuery($query);
$result=$db->loadObjectList();
foreach($result as $row)
{
echo ' id is '.$row->id.' name is ' . $row->name .' comment is '.$row->comment.'<br />';
}

你必须先通过 $db=& JFactory::getDBO(); 获得数据库操作对象,然后设置查询语句,接着通过 loadObjectList() 载入结果集。

当你的查询结果只有一个时,你也可以使用 loadResult()函数。

之所以使用#__的原因是,Joomla!会自动将其替换为你所设定的数据库前缀。

b)插入和删除

插入可以通过两种方法来,一种比较简单的做法如,你先将要插入的数据库对象复制,比如你要插入一条新的记录,赋值如下

$rowx->name="insert";
$rowx->comment="test insert";

这里由于设置了 id 为自动增长,所以你可以不给它值。

然后调用函数 $db->insertObject('#__db',&$rowx,'');插入。

另一种方法的原理和删除类似,都是调用了 Execute($querys) 这个方法。先来讲插入的。

我们给个插入的sql语句

$querys="INSERT INTO `joomla`.`#__db` (
`id` ,`name` ,`comment`)
VALUES (
NULL , 'execute', 'test execute'
); ";

然后调用函数,$db->Execute($querys); 即可。

同样的,删除记录你也可以执行相应的删除语句。此处略。

二 基于 JTable

下面将会讲述如何利用JTable来实现数据库操作,要使用 JTable 你必须在刚才创建的com_db目录下,新建一个名为 tables 的文件夹,在里面创建名为 jt.php的文件(文件名可以随意)。然后在里面插入如下代码。

<?php
defined('_JEXEC') or die();
class TableJt extends JTable{
var $id;
var $name ;
var $comment;


function __construct(&$db)
{
parent::__construct( '#__db', 'id', $db );
}
}
?>


其中类名必须以 Table+文件名组成,否则等下会提示找不到文件,还要创建tables目录。在类里你必须常见数据库表中相同的字段变量。 如果有的字段默认值不为空,比如name默认为"a"的话,那么你的$name也应该给它赋值为 a 。构造函数中第一个参数代表所属的表名称。第二个则是下一步查询所需的关键字,比如等下你希望查询 id=1的记录,那么你最好将它设置为 id ,如果你要查询 name="yangqi"的记录,则将它设为 name。

好了,我们可以正常使用Jtable了,在刚才的db.php中继续增加代码。

先要包含该JTable类的文件 JTable::addIncludePath(JPATH_COMPONENT.DS.'tables');

然后获得一个实例 $row=& JTable::getINstance('jt','Table');

a)查询

查询一个 id 为 3的记录

$id=3;
$row->load($id);
echo $row->name;
echo $row->id;
echo $row->comment;

b)插入和删除

要插入一条记录,你先得给它赋值,比如我们赋值如:

$row->name="jtable";
$row->comment="using jtable";

然后调用store()函数 $row->store();



删除是搜索的反方法,通过 $row->delete($id); 实现。



Joomla!中的数据库操作大致如此,相信这些已经能够解决大部分的问题。

若有什么错误的地方欢迎批评指正!你可以在这里下载 com_db 的源代码包

杨期 转载请注明出处。http://www.joomla.cn

[精通Joomla开发]核心数据库之六JTable使用     
作者: Administrator    
2009-03-16 
Joomla提供给我们功能强大的JTable抽象类,使用这个类我们可以进行一些数据库的基本功能操作。对于每个我们想要使用JTable类来操作的表,我们都需要创建一个JTable的子类。

当创建JTable子类的时候,我们需要遵循一些具体的约定或者规则。这些规则方便我们很容易的将我们自己的扩展集成到Joomla或者Joomla框架中。


假如我们创建一个组件,我们需要在该组件的后台管理目录(administrator/components/该组件目录)下的tables目录里创建一个JTable子类.类名就是数据库表实体名加上Table,而类文件的名称就是数据库表实体名。(如果还不清楚翻开他的核心组件比如com_contact自己仔细看)

我们将使用我们之前教程中定义的表结构来演示我们是如何通过JTable类来连接数据库表的。在我们继续之前你得熟悉一下http://www.joomlar.cn/website/content/view/178/1/文章中介绍的数据库表结构

类名是TableFoobar,定位在JPATH_COMPONENT_ADMINISTRATOR.DS.'tables'.DS.'foobar.php'文件中,DS这里是一个全局变量替换了符号“/”,我们首先要做的就是在我们的类文件中定义公共属性或者说是公有变量,这些公共属性与数据库字段(field)直接相关,必须使用相同的名字。我们使用这些公有变量作为一个缓冲区(buffer)来存储个别数据。(理解起来有点困难,可以这样理解数据库的数据会直接拿来填充这些公有变量,我们操作也是操作这些公有变量,如何影响到数据库是靠JTable一些内部的机制)

第二件事情就是我们要定义一个构造函数,为了使用JTable::getInstance()方法,我们需要在我们的子类中使用一个单例引用的数据库对象来覆写基类的构造函数

第三件事情就是我们要覆写check()方法,该方法提供了对属性缓冲区的验证检查并返回一个布尔值结果,如果check()失败,我们就要调用setError()来设置一段消息来提示为什么验证检查失败了。



/**
* #__myextenstion_foobars table handler
*
*/
class TableFoobar extends JTable
{
/** @var int Primary key */
var $id = null;
/** @var string Content */
var $content = null;
/** @var int Checked-out owner */
var $checked_out = null;
/** @var string Checked-out time */
var $checked_out_time = null;
/** @var string Parameters */
var $params = null;
/** @var int Order position */
var $ordering = null;
/** @var int Number of views */
var $hits = null;
/**
* Constructor
*
* @param database Database object
*/
function __construct( &$db )
{
parent::__construct('#__myextension_foobars', 'id', $db);
}
/**
* Validation
*
* @return boolean True if buffer is valid
*/
function check()
{
if(!$this->content)
{
$this->setError(JText::_('Your Foobar must contain some
content'));
return false;
}
return true;

}

}



上面就是一个完整的JTable类文件,接下去我们要做什么,很明显我们要实例化这个对象,使用静态化方法JTable::getInstance(),完整代码如下:

JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'tables');
$table = JTable::getInstance('foobar', 'Table');




我们没有直接去包含一个文件,而是包含了整个tables目录,但JTable要去实例化TableFoobar对象的时候,如果类没有定义它就会从包含路径的所有文件中寻找名为foobar.php的文件

本节讲述JTable文件的构成使用,下节介绍CRUD自动化操作当然是基于JTable的。

你可能感兴趣的:(数据结构,sql,框架,PHP,浏览器)