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';
}
?>
每当你试图调试Joomla!代码打开调试模式(Global Configuration->System->Debug Settings
)并将错误报告最多转换为Development
(Global Configuration->Server->Error Reporting
),那么您会直接看到您的问题。
$query
是JDatabaseQuery
类型的实际的对象和应作为在$db->setQuery($query)
呼叫,而不强制转换为(string)
。当引用数据库,表或列名时,使用Joomla的机制来包装名称是一个好主意,
$query-select($db->quoteName('optValue'))
其中,这将确保SQL关键字不成问题。同样值的,使用Joomla!提供
$db->quote()
方法。例如$query->where($db->quoteName('fid') . '=' . $db->quote('38'));
当建立一个
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查询,这将使其显着更快并减少服务器上的负载。
哦,是啊! 它就像一个魅力! 当你建议我重新构建这个脚本时,我同意你的意见,但现在我会使用它。我刚开始使用php和mysql,所以这是我现在可以写的最好的解决方案。 非常感谢! – user2132234
你是否从查询中收到任何错误?我肯定会考虑重新构建你的查询,因为你得到的foreach结果,你正在运行另一个查询。 – Lodder
不明白你的意思。 我不承担任何错误,这两个查询单独工作正常,但结合检索与空白选项的选择列表... – user2132234