joomla在一个函数中使用多个数据库查询

时间:2013-03-15 19:55:47

标签: php joomla joomla2.5

在某些功能中,我可能需要执行以下几个查询:

    $user = & JFactory::getUser();
    $db = & JFactory::getDBO();
    $query  = $db->getQuery(true);

    $query->select('id');
    $query->from($db->quoteName('#__users'));
    $query->where('username='.$db->quote($response->username));
    $db->setQuery($query);
    $user_id = $db->loadResult();

    if ($user_id == "") 
    {
           //do something
    }


    $query1  = $db->getQuery(true);
    $query1->select('app_id');
    $query1->from($db->quoteName('#__app_ids'));
    $query1->where('app_descr='.$db->quote($this->app_descr).' AND app_valid=TRUE');
    $db->setQuery($query1);
    $app_id = $db->loadResult();

我发现如果我不将query更改为query1我无法让此功能用于后续查询。在Joomla之外我没有必要这样做,因为我关闭mysql连接使用相同的变量,只要它的顺序正确,一切都很好。

两个问题:

  1. 这是对的吗?或者有更好的方法吗?
  2. 我是否需要检查loadResult的mysql失败?我该怎么做呢看看Joomla核心,我常常看不到任何东西,但有时会有各种各样的东西来处理这个问题。

2 个答案:

答案 0 :(得分:4)

1)它应该使用相同的变量名,因为您获取了一个新的查询对象,因为您的方法参数设置为true。在获取查询对象

后立即尝试调用$query->clear();
$query  = $db->getQuery(true);
$query->clear();
$query->select('app_id');

2)在Joomla 3中它应该是

try
{
    $db->setQuery($query);
    $user_id = $db->loadResult();
}
catch (RuntimeException $e)
{
    $e->getMessage();
}

在Joomla 2.5中

if ($db->getErrorNum()) {
    JError::raiseWarning(500, $db->getErrorMsg());
} 

另外,更改

$user = & JFactory::getUser();
$db = & JFactory::getDBO();

$user = JFactory::getUser();
$db = JFactory::getDBO();

无论如何,在PHP 5中通过引用返回对象,并且它将从php 5.3 +

开始发出警告

答案 1 :(得分:0)

好吧,在Joomla 上,JFactory :: getDBO()总是返回相同的连接实例(在今天的atual版本中),所以每次设置SQL时,你都会重写以前的SQL。在简历中,这段代码需要多个连接,这种方式不支持,你需要编写自己的JDatabaseDriver版本,也许你自己的全局静态数组版本来控制你自己的mysqli连接池。 PHP关于池连接很差,不像JAVA或.NET,要快速编码你需要考虑逻辑并且每次尝试只使用一个连接,每次打开一个查询,总是认为 JFactory :: getDBO()不是线程安全的,请注意这一点。你永远不能在没有提交roll回滚的情况下在一个php中启动一个事务,它会导致执行其他页面时出现问题。