簡體   English   中英

在foreach循環中的Joomla Mysql查詢

[英]Joomla Mysql query in foreach loop

我正在嘗試使用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';
}
?>

每當你試圖調試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. 在構建具有多個值AND ed的WHERE查詢時,您只需添加每個項目,因為它自己的->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會越來越長,並且不太可能返回任何結果。

由於您沒有在最內層的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查詢,這將使其顯着更快並減少服務器上的負載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM