回显完整的Joomla查询语句(包括限制等)?

9

我想知道是否有一种方法可以打印出带有limit和limitstart等完整查询。我可以输出$query这一行,但是我想看看为什么限制不起作用,而且我似乎无法显示它发送到数据库的实际查询。以下是代码:

$params =& JComponentHelper::getParams('com_news');
$limit = $params->get('x_items', 5);
$limitstart = JRequest::getVar('limitstart', 0);

$query = "SELECT * FROM #__news WHERE published = 1 AND catid = ".$Itemid." ORDER BY date DESC";
$db->setQuery($query, $limitstart, $limit);
$rows = $db->loadObjectList();
$db->getQuery($query, $limitstart, $limit); 只显示了 "SELECT * FROM jos_news WHERE published = 1 AND catid = 8 ORDER BY date DESC",该查询没有在末尾包含 LIMIT 参数。请您提供帮助,感谢!
5个回答

20

JDatabaseQuery对象具有__toString()函数,可输出查询语句,因此您可以执行以下操作:

echo $db->getQuery();

或者如果您想将它传递给一个函数,您可以先将其显式转换为字符串:

var_dump((string)$db->getQuery());

1
这应该是被接受的答案。非常有效,而且正是它被开发的原因(我想象中的)。 - user651390

4
var_dump($db);die;

在调用loadObjectList()之后执行此操作。在$db变量内必须有一个_sql属性,该属性是最后执行的查询。

0

同意之前的答案,但是...如果你正在开发自己的组件,因为我经常想要确定执行了什么,这里有一个简单的解决方案:

在你的模型中放置:

$db = JFactory::getDBO(); echo $db->getQuery();

在你想知道查询的位置...不要把它放在(例如)你的视图中,因为它可能已经通过执行加载了一些其他下拉列表...

例如:

对于列表视图,在模型的公共函数getItems()中的foreach ($items...之前放置它。 在表单/项目视图中,在受保护的函数loadFormData() /公共函数getItem($pk = null)的return $data / return $item之前放置它。

希望这可以帮助到你...


0
在新的 Joomla 版本中,您需要在查询对象上使用 echo __toString()。
echo $query->__toString();

我在这个Joomla答案上找到了这些信息。

希望能对你有所帮助。


0

Joomla提供了$query->dump()。为了方便起见,我喜欢将其包装在enqueueMessage()中,以便呈现的字符串位于网页顶部。

JFactory::getApplication()->enqueueMessage(
    $query->dump(),
    'notice'
);

重要提示:您不应该向公众展示原始的SQL字符串或原始的查询错误字符串。

请查看我在Joomla Stack Exchange上的一些实现


$query->dump()被弃用且没有替代方案。 - hans2103

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接