2012-02-13 12 views
-3

私は初心者です。私は数週間先進的な検索のためのコードを検索しようとStackoverflowを検索しました。
最後に自分自身を作成し​​ました。それはかなりうまくいっています。私はそれを使用したいかもしれない他の人のためにここに挙げています。
質問は以下のとおりです。高度な検索mysql perl

何item_category私は *をデフォルトに選択されていないが、それは働いていない
  • 。 item_categoryは検索に必要な唯一の変数ですか?

  • サニタイズやハックの注入について心配する必要はありますか?

  • 完全一致は機能していないようです。それは100語を 'FREE'で検索している可能性があり、一致するものは見つかりません。何か案は?

  • 信頼性とスピードの問題に関するご意見はありますか?

    $ ANDORは= PARAM( 'アンドールは');#は、作成しOR を検索する場合($ ANDOR EQ ""){$ ANDOR = "AND";}

    IF($ item_category){ $ item_category = "$ item_category"; } else {$ item_category = "*"; } $ statement。= "item_category LIKE '$ item_category'";

    if($ item_state){ $ statement。= "$ ANDOR item_state LIKE '$ item_state'"; } if($ item_city){ $ statement。= "$ ANDOR item_city LIKE '$ item_city'"; } if($ db_id){ $ statement。= "$ ANDOR db_id = '$ db_id'"; }

    $ keywords = param( 'keywords');

    ($キーワード)であれば { 場合(パラメータ( 'searchmatch')EQ "正確な") { $声明。= "$アンドールITEM_NAME = \" $キーワード\ "OR item_desc = \" $キーワード\ " OR item_desc2 = \ "$キーワード\" ";#他

    } {$声明=。" $アンドール"。 私の@keywords =分割(/ /、$キーワード);

    foreach my $keyword(@keywords) 
    { 
    $statement .= " item_name LIKE '%$keyword%' 
    OR item_desc LIKE '%$keyword%' 
    OR item_desc2 LIKE '%$keyword%' "; 
    } 
    

    }}

    $ date_begin = PARAM( 'date_begin')。 if($ date_begin){ $ステートメント。= "$ ANDOR modification_time> '$ date_begin'"; }

    if($ user){ $ statement。= "$ ANDOR user LIKE '$ user'"; }

    $ price_low = param( 'price_low'); $ price_high = param( 'price_high'); if(($ price_low)& &($ price_high)){ $ステートメント。= "'$ price_low'と '$ price_high'の間の$ ANDOR item_price"; } elsif(($ price_low)& &($ price_high eq "")){ $ statement。= "$ ANDOR item_price BETWEEN '$ price_low' AND *"; } elsif($ price_high)& &($ price_low eq "")){ $ statement。= "$ ANDOR item_price BETWEEN '0' AND '$ price_high'"; } else { $ statement。= "";

    }

    私の$ sthは= $ dbh->((QQを$声明)WHEREテーブルSELECT * FROM)を調製 または$ DBI :: errstrは死にます。 $ sth-> execute(); while((my(@rows))= $ sth-> fetchrow_array) { $ total_row_count = $ sth-> rows; $ database_rows = join( "\ |"、@rows); push(@ database_rows、$ database_rows);

    }

答えて

5
  1. '' は、where句の有効な条件ではありません。 ""の代わりに "1"を入れることもできますが、where節のその部分は除外することをお勧めします。

  2. はい;パラメタバインディングを使用します。例えば

    if ($item_state) { 
        $statement .= " $ANDOR item_state LIKE ? "; 
        push(@binds, $item_state); 
    } 
    

    は、次にDBIを持っているように正しくサニタイズし、あなたのparamsを含める:

    $sth->execute(@binds); 
    
  3. は、生成された完全なクエリを調べます。私はあなたが思うことをしないAND/OR優先ルールを見れば、括弧を賢明に使うことができます。

  4. これを行わないでください。あなたのためにバックエンドの仕事をしているものをCPANで探し、適切なパラメータでそれを呼び出すだけです。他の誰かがこれについて書いたツールを使用した後、あなたはこれで扱われていないすべての事例の良いアイデアを得られます。そして、あなたが再訪することを決めた場合、もう一度検索をする考え。

この時点では、私は単純なDBクエリエンジン/小さなORMを約4回書いています。そのうち3つはperlで書かれています。私は何か新しいことを学ぶたびに、もっと重要なことを覚えているたびに、なぜ、すべてのエッジケースを見つけ出した誰かからの解決策を使用しただけですべきなのです。

+0

Re(3)、あなたは正しく疑いがあります。 'AND'は' OR'より優先順位が高いので、 'exact'検索句には括弧が必要です。 – ikegami

+0

ありがとうございます。変更されたコードは素晴らしい作品です。それを投稿する方法を理解できません... –

関連する問題