2012-02-13 3 views
-3

나는 초보자입니다. 고급 검색을위한 코드를 찾으려고 몇 주 동안 Stackoverflow를 검색했습니다.
마지막으로 내 자신을 생성했습니다. 그것은 꽤 효과적입니다. 나는 그것을 그것을 사용하고 싶어 할지도 모르는 다른 사람들을 위해 여기에 열거하고있다.
질문은 다음과 같습니다고급 검색 mysql perl

더 item_category 내가 *에 기본적으로 선택되지 않습니다 그러나 작동하지 않습니다
  • . item_category가 검색에 필요한 유일한 변수입니까?

  • 위생 처리 또는 해킹 주입에 대해 우려해야합니까?

  • 정확한 일치가 작동하지 않는 것 같습니다. 그것은 '무료'에 대한 100 단어를 검색 할 수 있으며 일치하는 항목을 찾을 수 없습니다. 어떤 아이디어?

  • 안정성 및 속도 문제에 대한 제안 사항이 있으십니까?

    $ ANDOR는 = PARAM ('Andor의')는 #은을 생성 AND OR 를 검색하는 경우 ($ ANDOR 당량 "") {$ ANDOR = "AND"}

    경우 ($ 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');

    경우 ($ 키워드) { 경우 ("정확한"PARAM ('searchmatch') EQ) { $ 문. = "$ ANDOR ITEM_NAME의 = \"$를 키워드 \ "또는 ITEM_DESC = \"$ 키워드 \ " 또는 item_desc2 = \"$ 키워드 \ ""; #

    다른

    } {$ 문 =. "$ ANDOR"; my @keywords = split (/ /, $ 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) { $ statement. = "$ 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 " '$의 price_low'AND *"BETWEEN $ ANDOR의 ITEM_PRICE ")) { $ 문 =."; } ELSIF (($ price_high) & & ($ price_low EQ "")) { $ 문 =. " '0'BETWEEN $ ANDOR의 ITEM_PRICE와 '$의 price_high'"; } else { $ statement. = "";

    }

    내 $ STH = $ dbh-> ((전분기 대비 $ 문) 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. 예; 매개 변수 바인딩을 사용하십시오. 예 :

    $sth->execute(@binds); 
    
  3. 가 생성 된 전체 쿼리를 검사 :

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

    그런 다음 DBI가 제대로 소독하고 PARAMS을 포함해야합니다. 나는 당신이 생각하는 것을하지 않는 AND/OR 선행 규칙을 본다면 의심 스럽습니다. 당신은 괄호를 사려 깊게 사용할 수 있습니다.

  4. 이 작업을 수행하지 마십시오. CPAN을 통해 백엔드 작업을 수행하고 적절한 매개 변수를 사용하여 호출하십시오. 다른 사람이 작성한 도구를 사용한 후에는이 문제를 처리하지 않는 모든 사례에 대한 좋은 아이디어를 얻을 수 있으며 해당 사례를 다시 방문하기로 결정한 경우 누락 된 부분을 추가하는 방법에 대해 생각할 수 있습니다. 다시 검색하는 아이디어.

이 시점에서 필자는 간단한 DB 쿼리 엔진/작은 ORM을 약 4 번 작성했으며, 그 중 3 개는 perl로 작성했습니다. 매번 새로운 것을 배울 때마다, 더 중요한 것은 매번 모든 경우를 찾아내는 다른 사람의 솔루션을 사용해야한다는 이유를 기억할 때마다.

+0

Re (3)을 사용하면 올바르게 판단 할 수 있습니다. 'AND'는 'OR'보다 우선 순위가 높기 때문에 '정확한'검색 절에는 괄호가 필요합니다. – ikegami

+0

감사합니다. 수정 된 코드는 훌륭하게 작동합니다. 그냥 게시하는 방법을 알아낼 수 없습니다 ... –