3

在某些功能中,我可能需要像这样进行一些查询:

    $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. 我需要检查mysql失败loadResult吗?我该怎么办。经常查看 Joomla 核心,我什么也看不到,但有时需要混合处理这个问题。
4

2 回答 2

5

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+ 起它会抛出一个警告

于 2013-03-15T20:47:54.877 回答
0

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

于 2016-07-28T19:02:15.330 回答