使用Joomla,在尝试基于URL参数构建mySQL查询时遇到问题。我的代码看起来像这样:
$db =& JFactory::getDBO();
$hpprice = JRequest::getVar('hprice');
$lprice = JRequest::getVar('lprice');
$city = JRequest::getVar('city');
$zip = JRequest::getVar('zip');
$bdrms = JRequest::getVar('bdrms');
$bths = JRequest::getVar('bths');
$query = "SELECT * FROM " . $db->nameQuote('#__mls') . " WHERE 1=1";
$clauses = array();
if ($zip != null) {
$clauses[] = $db->nameQuote('MSTZIP') . " = " . $db->quote($zip);
}
if ($city != null) {
$clauses[] = $db->nameQuote('MSTCITY') . " = '" . $db->quote($city) . "'";
}
if ($bdrms != null){
$clauses[] = $db->nameQuote('MSTBDRMS')." >= ".$db->quote($bdrms);
}
if ($bths != null){
$clauses[] = $db->nameQuote('MSTBATHS') . " >= " . $db->quote($bths);
}
if ($lprice != null){
$clauses[] = $db->nameQuote('MSTLISTPRC') . " BETWEEN " . $db->quote($lprice) . " AND " . $db->quote($hprice);
}
$query .= implode(" AND ", $clauses);
$db->setQuery($query);
$table = $db->loadRowList();
return $table;
因此,正如您所看到的,根据URL中是否存在arugments,为mySQL查询添加参数。我无法解决的问题是构建阵列并将其爆炸。
每当我在URL中放入一个参数时,所有表项都会填充。当我尝试传递一个参数时,它会出现空值。您可以在行动here中看到这一点。如果您向网址添加其他参数zip
,则所有内容都会显示NULL
。
答案 0 :(得分:0)
我认为问题是" WHERE 1=1"
。尝试将此更改为此" WHERE 1=1 "
。
因为最终查询将被附加到此,您将无法获得所需的结果。对于确认echo $query
,请查看它是否是正确的查询。还有一件事是'" . $db->quote($city) . "'"
。删除''
因为你已经通过函数添加了它。
//更新:
最好使用where方法
如果这不起作用,请告诉我。
答案 1 :(得分:0)
不确定这与前一个问题有何不同。
$查询 - >选择('*“); $查询 - >从($ DB-> nameQuote( '#__毫升'));
$query->where('1 = 1', AND);
if ($zip != null)
{
$query->where (.$db->nameQuote('MSTZIP')." = ".$db->quote($zip));
}
if ($city != null)
{
$query->where($db->nameQuote('MSTCITY')." = '".$db->quote($city));
}
Etc
您无需构建任何数组;这就是拥有databasequery api的重点。
答案 2 :(得分:0)
最终剧本最终看起来像这样:
$db =& JFactory::getDBO();
$hprice = JRequest::getVar('hprice');
$lprice = JRequest::getVar('lprice');
$city = JRequest::getVar('city');
$zip = JRequest::getVar('zip');
$bdrms = JRequest::getVar('bdrms');
$bths = JRequest::getVar('bths');
$query = "SELECT * FROM " . $db->nameQuote('#__mls') . " WHERE 1=1 AND ";
$clauses = array();
if ($zip != null) {
$clauses[] = "MSTZIP = " . $zip;
}
if ($city != null) {
$clauses[] = "MSTCITY = " . $db->quote($city);
}
if ($bdrms != null){
$clauses[] = "MSTBDRMS >= " . $bdrms;
}
if ($bths != null){
$clauses[] = "MSTBATHS >= " . $bths;
}
if ($lprice != null){
$clauses[] = "MSTLISTPRC BETWEEN " . $lprice . " AND " . $hprice;
}
$query .= implode(" AND ", $clauses) . ";";
$db->setQuery($query);
$table = $db->loadRowList();
return $table;
除非需要/适用,否则我最终会删除nameQuote
和quote
。我正在处理的脚本模型来自一些教程。它适用于我以前做过的事情,但现在不是出于某种原因。最后一步是使初始AND
有条件,但这不应该花费太多。至少现在有框架。感谢所有帮助过的人。