0

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 に引数が存在するかどうかに基づいて、mySQL クエリに引数を追加します。頭を包み込めないのは、配列を構築して内破することです。

URL に引数を入れるたびに、すべてのテーブル項目が読み込まれます。引数を渡そうとすると、null になります。ここで実際にこれを見ることができますzipURLなどに別の引数を追加すると、すべてが表示されNULLます。

4

3 に答える 3

0

これが前の質問とどのように違うのかわかりません。

$query->select('*"); $query->from($db->nameQuote('#__mls'));

 $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

配列を作成する必要はありません。データベースクエリAPIを持つことの要点です。

于 2012-12-06T23:43:13.140 に答える
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;

私は結局、必要/適用可能な場合を除いて、削除しましnameQuotequote。私が取り組んでいたスクリプト モデルは、いくつかのチュートリアルからのものでした。私が以前やっていたことはうまくいきましたが、何らかの理由で今はうまくいきません。最後のステップは、最初のAND条件付きにすることですが、それほど時間はかかりません。少なくともフレームワークは今そこにあります。助けてくれたすべての人に感謝します。

于 2012-12-07T15:06:01.673 に答える
0

問題はこれだと思います。" WHERE 1=1"これをこれに変更してみてください- " WHERE 1=1 ". 最後のクエリがこれに追加され、目的の結果が得られないためです。確認echo $queryのために、それが正しいクエリであるかどうかも確認してください。関数によって既にこれを追加しているため、もう1 つは'" . $db->quote($city) . "'".removeです。''

//アップデート:

whereメソッドを使用することをお勧めします

これが機能しない場合はお知らせください。

于 2012-12-06T20:08:20.073 に答える