Joomla在foreach循环中的Mysql查询

问题描述:

我想用php和mysql在Joomla 2.5中构建一个简单的选择列表,但是我遇到了一个问题:它没有加载选项名称...有没有任何错误?Joomla在foreach循环中的Mysql查询

<?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

你是否从查询中收到任何错误?我肯定会考虑重新构建你的查询,因为你得到的foreach结果,你正在运行另一个查询。 – Lodder

+0

不明白你的意思。 我不承担任何错误,这两个查询单独工作正常,但结合检索与空白选项的选择列表... – user2132234

每当你试图调试Joomla!代码打开调试模式(Global Configuration->System->Debug Settings)并将错误报告最多转换为DevelopmentGlobal Configuration->Server->Error Reporting),那么您会直接看到您的问题。

  1. $queryJDatabaseQuery类型的实际的对象和应作为在$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查询多个值AND编在一起,你可以简单地添加的每个项目,因为它是自己的->where()条款。

所以,你在那里之前,我会倾向于为写:就像你自己说你都工作$queries的最后

$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)); 

,但是当你的代码放在一起作为表明,他们别。

这样做的原因是,配置$query你的第一个声明(并运行)后,你继续添加到第二个发言的$query对象。所以,当你做第二,第三等setQuery($query) SQL越来越长,不太可能返回任何结果。

由于您不在最内层的foreach循环中测试每个$db->loadResult()的成功,所以您从不会看到错误。

至少,你需要在你的内部循环的开头添加一个新的$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查询,这将使其显着更快并减少服务器上的负载。

+0

哦,是啊! 它就像一个魅力! 当你建议我重新构建这个脚本时,我同意你的意见,但现在我会使用它。我刚开始使用php和mysql,所以这是我现在可以写的最好的解决方案。 非常感谢! – user2132234