每当您尝试调试 Joomla!代码打开调试模式 ( Global Configuration->System->Debug Settings
) 并将错误报告设置为Development
( Global Configuration->Server->Error Reporting
),然后您会立即看到您的问题。
$query
a 实际上是一个类型的对象,JDatabaseQuery
应该在$db->setQuery($query)
调用中按原样使用而不强制转换为 a (string)
。
在引用数据库、表或列名时,最好使用 Joomla 的机制来包装名称是正确的引号,例如
$query-select($db->quoteName('optValue'))
,这将确保 SQL 关键字不成问题。
同样对于值,使用 Joomla!提供$db->quote()
的方法。例如
$query->where($db->quoteName('fid') . '=' . $db->quote('38'));
在构建WHERE
具有多个值的查询时,AND
您可以简单地将每个项目添加为它自己的->where()
子句。
所以你在哪里之前我倾向于写成:
$query->where($db->quoteName('fid') . '=' . $db->quote('38'));
$query->where($db->quoteName('language') . '=' . $db->quote('it-IT'));
$query->where($db->quoteName('sKey') . '=' . $db->quote($value));
最后,正如您自己所说的那样,您的两项$queries
工作都已完成,但是当将它们放在您的代码中时,如图所示。
这样做的原因是,在您$query
为第一条语句配置(并运行它)之后,您继续将第二条语句添加到原始$query
对象中。因此,当您执行第二、第三等操作时setQuery($query)
,SQL 会变得越来越长,并且不太可能返回任何结果。
由于您没有$db->loadResult()
在最内层foreach
循环中测试每个是否成功,因此您永远不会看到错误。
至少您需要$db->getQuery(true)
在内部循环的开头添加一个新的,如下所示:
<?php
// Get default database object
$db = JFactory::getDBO();
// Get a new JDatabaseQuery object
$query = $db->getQuery(true);
// Build the query
$query->select($db->quoteName('optValue'));
$query->from($db->quoteName('#__sobipro_field_option'));
$query->where($db->quoteName('fid') .'=' . $db->quote('38'));
// Set the query for the DB oject to execute
$db->setQuery($query);
// Get the DB object to load the results as a list of objects
$results = $db->loadObjectList();
if ($results){
echo "<select>";
foreach($results as $result)
{
foreach($result as $value)
{
// Get a new query object
$query = $db->getQuery(true);
// Build the query
$query->select($db->quoteName('sValue'));
$query->from($db->quoteName('#__sobipro_language'));
$query->where($db->quoteName('fid') .'=' . $db->quote('38'));
$query->where($db->quoteName('language') .'=' . $db->quote('it-IT'));
$query->where($db->quoteName('sKey') .'=' . $db->quote($value));
$db->setQuery($query);
$name = $db->loadResult();
echo "<option value=\"$value\">$name</option>";
}
}
echo "</select>";
}
else
{
echo 'Error';
}
这可能会创建大量对象,因此,您应该考虑是否有一种方法可以将其全部重组为一个 SQL 查询,这将显着加快速度并减少服务器上的负载。