在某些功能中,我可能需要执行以下几个查询:
$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连接使用相同的变量,只要它的顺序正确,一切都很好。
两个问题:
loadResult
的mysql失败?我该怎么做呢看看Joomla核心,我常常看不到任何东西,但有时会有各种各样的东西来处理这个问题。答案 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中启动一个事务,它会导致执行其他页面时出现问题。