在foreach循环中的Joomla Mysql查询

时间:2013-10-12 17:52:10

标签: php mysql sql joomla

我正在尝试使用php和mysql在Joomla 2.5中构建一个简单的选择列表,但是我遇到了一个问题:它没有加载选项名称......有没有错误?

<?php
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('optValue');
$query->from('#__sobipro_field_option');
$query->where("fid='38'");
$db->setQuery((string)$query);
$results = $db->loadObjectList();
if ($results){
echo "<select>";
 foreach($results as $result){
    foreach($result as $value) {
    $query->select('sValue');
    $query->from('#__sobipro_language');
    $query->where("fid='38' and language='it-IT' and sKey='".$value."'");
    $db->setQuery((string)$query);
    $name = $db->loadResult();
    echo "<option value=\"$value\">".$name."</option>";
    }
    }

    echo "</select>";
}
else {
echo 'Error';
}
?>

1 个答案:

答案 0 :(得分:4)

每当你试图调试Joomla时!代码启用调试模式(Global Configuration->System->Debug Settings)并将错误报告更改为DevelopmentGlobal Configuration->Server->Error Reporting),然后您就会立即看到问题。

  1. $query实际上是JDatabaseQuery类型的对象,应该在$db->setQuery($query)调用中按原样使用,而不会转换为(string)

  2. 当引用数据库,表或列名称时,最好使用Joomla的机制来包装名称是正确的引号,例如
    $query-select($db->quoteName('optValue'))
    除此之外,这将确保SQL关键字不是问题。

  3. 同样对于值,请使用Joomla!提供了$db->quote()方法。例如
    $query->where($db->quoteName('fid') . '=' . $db->quote('38'));

  4. 在构建包含多个值WHERE的{​​{1}}查询时,您只需添加每个项目作为其自己的AND子句。

  5. 所以,我倾向于写作:

    ->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时,SQL会变得越来越长,并且不太可能返回任何结果。

    由于您没有在最内层setQuery($query)循环中测试每个$db->loadResult()的成功,因此您永远不会看到错误。

    至少你需要在内循环的开头添加一个新的foreach,如下所示:

    $db->getQuery(true)

    这可能会创建很多对象,因此,您应该考虑是否有办法将其重组为一个SQL查询,这将使其显着加快并减少服务器上的负载。