首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >foreach循环中的Joomla Mysql查询

foreach循环中的Joomla Mysql查询
EN

Stack Overflow用户
提问于 2013-10-12 17:52:10
回答 1查看 3.7K关注 0票数 1

我试图用php和mysql在Joomla2.5中构建一个简单的选择列表,但是我遇到了一个问题:它没有加载选项名.有什么错误吗?

代码语言:javascript
复制
<?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';
}
?>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-13 02:38:20

每当你想调试Joomla的时候!代码打开调试模式(Global Configuration->System->Debug Settings)并将错误报告转到Development (Global 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查询时,可以简单地将每个项添加为它自己的->where()子句。

所以在我之前你的位置我倾向于写成:

代码语言:javascript
复制
  $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),如下所示:

代码语言:javascript
复制
<?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查询--这将使其大大加快,并减少服务器上的负载。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19337358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档