2012-07-18 2 views
0

사용자가 하나 이상의 단어를 입력하도록하는 양식이 있습니다. 이 단어는 MySQL 데이터베이스의 여러 열과 일치해야합니다.PHP가 폭발하고 MySQL 쿼리가 여러 열을 검색합니다.

일부 코드를 작성하기 시작했지만 막혔습니다.

<?php 
    $term = $_SESSION['session_searchstring']; //Let's say that session is John Doe 
    $searchterm = explode(' ',$term); 

    $searchFieldName = "name"; 
    $searchCondition = "$searchFieldName LIKE '%" . implode("%' OR $searchFieldName LIKE '%", $searchterm) . "%'"; 

    $sql = "SELECT * FROM students WHERE $searchCondition;"; 

    echo $sql; //Echo to test what mysql_query would look like 

?> 

위의 코드가 출력은 :

SELECT * FROM students WHERE name LIKE '%John%' OR name LIKE '%Doe%'; 

문제 나 여러 열 ($searchFieldName)에서 검색 할 것입니다. 나는 예를

customer_firstname 
customer_lastname 

위해 가지고 내가 어떻게 계속 두 열 ..의 내용에 대한 내 검색 문장과 일치 싶어?

+0

그 시점에서, 당신은 조건을 'foreach'하고 그런 식으로 조건을 구축하고자합니다. – keithhatfield

+0

@dleiftah 예를 들어 주시겠습니까? – David

답변

1

는 아마도

$term = $_SESSION['session_searchstring']; //Let's say that session is John Doe 
    $searchterm = explode(' ',$term); 

    $searchColumns = array("customer_firstname","customer_lastname"); 

    for($i = 0; $i < count($searchColumns); $i++) 
    { 
     $searchFieldName = $searchColumns[$i]; 
     $searchCondition .= "($searchFieldName LIKE '%" . implode("%' OR $searchFieldName LIKE '%", $searchterm) . "%')"; 
     if($i+1 < count($searchColumns)) $searchCondition .= " OR "; 
    } 

    $sql = "SELECT * FROM students WHERE $searchCondition;"; 

    echo $sql; //Echo to test what mysql_query would look like 

내가 모든 검색 문구/용어는 적어도 하나의 열을 일치하는 데 필요한 내 경우에는

SELECT * FROM students WHERE (customer_firstname LIKE '%John%' OR customer_firstname LIKE '%Doe%') OR (customer_lastname LIKE '%John%' OR customer_lastname LIKE '%Doe%');

+0

잘 보입니다! 그러나'Undefined variable : searchCondition'을 얻습니다. – David

+0

'$ searchCondition = '';'$ searchColumns' 행 다음에 추가하십시오. – Kermit

+0

고맙습니다. – David

1

테이블이 MyIsam 유형이거나 MyIsam으로 변환 할 수있는 경우 MySQL Fulltext Search을 사용하십시오. 하지 않을 경우, 어쨌든, 당신은 단지 검색을위한 서로에

SELECT * FROM students WHERE name LIKE '%John%' OR name LIKE '%Doe%' OR lastname LIKE "%John%" OR lastname LIKE "%Doe%" 

또는 조합하여 열 같은 긴 쿼리를 구축 할 수 있습니다 (하지만이 둘은 선호하지 않음). Sphinx과 같은 전문어 검색 엔진을 사용하는 것도 좋은 방법입니다.

0

를 생성, 어떤 검색 구문/용어는 더 일치 할 수 없었다 . 내가 Laravel을 사용하고하고 rawWhere-방법으로 그것을 넣을 수 있기 때문에

public function getRawWhereFilterForColumns($filter, $search_columns) 
{ 
    $search_terms = explode(' ', $filter); 
    $search_condition = ""; 

    for ($i = 0; $i < count($search_terms); $i++) { 
    $term = $search_terms[$i]; 

    for ($j = 0; $j < count($search_columns); $j++) { 
     if ($j == 0) $search_condition .= "("; 
     $search_field_name = $search_columns[$j]; 
     $search_condition .= "$search_field_name LIKE '%" . $term . "%'"; 
     if ($j + 1 < count($search_columns)) $search_condition .= " OR "; 
     if ($j + 1 == count($search_columns)) $search_condition .= ")"; 
    } 
    if ($i + 1 < count($search_terms)) $search_condition .= " AND "; 
    } 
    return $search_condition; 
} 

나는 단지 어디 절의 내용을 필요 :

나는 다음과 같은 방법으로 Kermit에서 예를 조정 끝났다.

사용 :

$sql = "SELECT * FROM students WHERE $search_condition;"; 

또는 :

(column1 LIKE '%John%' OR column2 LIKE '%John%') 
AND (column1 LIKE '%Doe%' OR column2 LIKE '%Doe%') 

을 생산 그리고 마지막으로 당신이 원하는 형태 당신, 예를 들어,이 $의 search_condition과를 사용

$search_condition = $this->getRawWhereFilterForColumns 
    ("John Doe", array("column1", "column2")); 

내 라 라벨의 경우 :

$modelInstances = Model::whereRaw 
    ($search_condition)->paginate(self::ITEMS_PER_PAGE); 

는 아마도 이것은 다른 사람이 거의 2 년 원래의 게시물 후에 경우에도, 나처럼이 스레드를 방문하거나 David 또는 누구를위한 개선 된 솔루션입니다.

관련 문제