2012-08-31 3 views
0

으로 바꿉니다. 기본 사전 시작 db 쿼리를 수정해야합니다.PHP의 공백을 %

public function ajaxProcessCheckProductName() 
{ 
    if ($this->tabAccess['view'] === '1') 
    { 
     $search = Tools::getValue('q'); /* in this variable, i wish subsitute the space with % */ 
     $searchmod = str_replace(" ", "%", $search); 
     $id_lang = Tools::getValue('id_lang'); 
     $limit = Tools::getValue('limit'); 
     $result = Db::getInstance()->executeS(' 
      SELECT DISTINCT pl.`name`, p.`id_product`, pl.`id_shop` 
      FROM `'._DB_PREFIX_.'product` p 
      LEFT JOIN `'._DB_PREFIX_.'product_lang` pl 
       ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = '.(int)$id_lang.') 
      WHERE pl.`name` LIKE "%'.pSQL($searchmod).'%" 
      GROUP BY pl.`id_product` 
      LIMIT '.(int)$limit); 
     die(Tools::jsonEncode($result)); 
    } 
} 

내가 %와 kawasaki racing filter 같은 변수에 공간을 대체 할, 그래서이 완료 와일드 카드 DB에 쿼리를 할 수있는 ...

예 : 나는 다음을 시도했습니다 사용자를 검색 kawasaki racing filter, kawasaki%racing%filter으로 바꾸려면 %kawasaki%racing%filter% ...

접근 방식이 올바른 것으로 보입니까? 그것은 지금 작동하지 않습니다 :(

누군가가 나를 도울 수 있습니까? 사전에 감사!

+0

SQL의 와일드 카드는 매우주의해야합니다. 그들은 당신의 질의를 나 빠지게 할 것이다. DB가 크다면 사용이 느려질 것입니다. 절대적으로 필요한 경우가 아니면 사용하지 마십시오. – Spudley

답변

0

을 확인하여 도구를 확인 :: getValue는, html로 문자열을 반환하지 않습니다 예.  를 귀하의 경우. 시도 var_dumpin 도구 : getValue 및 실제 출력을 참조하십시오.

+0

안녕하세요 @underpaid_pedro! 문제는 내가 변수를 인쇄 할 수 없다 ..하지만 난 그냥 쿼리를 수정하려고 :'$ searchmod = str_replace (" ", '%', $ search);'하지만 작동하지 않습니다 :( – ienabellamy

1

%kawasaki%racing%filter%에 대한 데이터베이스를 검색하면 그 단어를 모두 포함하는 항목을 검색합니다 주문.

내 직감은 당신이 그 thr을 포함하는 항목을 찾을 것으로 기대하고 있습니다. ee 단어는 문자열의 어느 위치에서나 사용할 수 있지만 쿼리를 입력하는 순서와 동일한 순서로 나타나야한다는 의미입니다.

문자열을 별도의 단어로 분리하고 각 단어를 독립적으로 검색하는 것이 좋습니다.

예를 들어

... WHERE field LIKE '%kawasaki%' 
     AND field LIKE '%racing%' 
     AND field LIKE '%filter%' 

이 세 단어를 포함하는 기록을 검색하지만, 임의의 순서로한다. 세 단어가 아닌 그 단어 중 하나를 찾으려면 ANDOR으로 대체하십시오. 또한

:

  • 필요한 경우 입력 문자열을 탈출하는 것을 잊지 마십시오. (즉, SQL 삽입 공격을 방지하고 입력에 따옴표 문자가 포함되어 있으면 쿼리가 중단되는 것을 방지하기 위해)

  • 가능한 경우 쿼리에 와일드 카드를 사용하지 않는 것이 좋습니다. 특히 문자열의 시작 부분에. 이는 쿼리를 매우 느리게 만들 수 있기 때문입니다 (DB는 모든 단일 레코드를 읽어야하고 모든 레코드에 대해 해당 필드의 전체 내용을 구문 분석해야합니다. 단일 테이블에서 수행 할 수있는 가장 느린 쿼리입니다. 같은 시간에 JOIN을 실행하고 있다면 더 나쁠 것입니다.) 당신은 텍스트 검색을 많이 할 필요가 있다면 다른 옵션이 할 (당신이 사용중인 DB 시스템을 지정하지 않은 다른 DB를)

은 어떤 경우에는, 와일드 카드 검색은 유용하지만, MySQL을 .

가장 간단한 옵션은 키워드를 별도의 테이블에 저장하는 것입니다. 태그로 생각할 수 있습니다. 그런 다음 정확한 단어를 직접 쿼리 할 수 ​​있습니다.

이상이 필요하면 MySQL의 'Full Text Search' feature을 살펴볼 수 있습니다.이 경우 와일드 카드 검색을 직접적으로 대체 할 수 있습니다.

하지만 때로는 느려질 수 있으므로 실제로 빠르게하려면 Sphinx을 확인하십시오. 조금 더 많은 일을했지만 올바르게 처리하면 검색 속도가 빨라집니다.

+0

감사합니다. Spudley! 명확한 설명, 정말 고마워. – ienabellamy

관련 문제