我正在尝试使用 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
)并将错误报告调到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'));
-
在构建具有多个值
AND
在一起的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查询,这将使它显着加快并减少服务器上的负载。