2015-01-25 5 views
1

인터넷을 샅샅이 뒤졌지만 내 문제와 같은 것을 찾을 수 없습니다. 여러 테이블에서 데이터를 가져올 수있는 라이브 검색 기능을 구축하려고합니다. 그것은 하나 개의 테이블로 작동하지만, 나는PHP - 여러 MySQL 테이블을 사용하는 라이브 검색

가 여기 내 PHP 코드의 밴드, 사용자, (앨범 등)에서 당길 수 있도록하려면 :

require ("includes/config/config.php"); 

$search_term = sanitize(htmlentities($_POST['search_term'])); 

if (!empty($search_term)){ 

    $search = "(SELECT `band_id`, `band_name` FROM `bands` WHERE `band_name` LIKE '%$search_term%' LIMIT 0, 5) 
       UNION ALL 
       (SELECT `user_id`, `username` FROM `users` WHERE `username` LIKE '%$search_term%' LIMIT 0, 5)"; 
    $query = mysqli_query($conn, $search); 
    $result = mysqli_num_rows($query); 

    while ($row = mysqli_fetch_assoc($query)){ 
     #$user_id = $row['user_id']; 
     #$username = $row['username']; 
     $band_id = $row['band_id']; 
     $band_name = $row['band_name']; 
     $check = mysqli_num_rows($query); 



     if ($check != 0){ 
      echo "<a style='text-decoration: none; color: black;' href='index.php?band=$band_id'><li class='searchResults'>" . ucfirst($band_name) . "</li></a>"; 
     } else { 
      echo "<li class='searchResults'>No Results Found</li>"; 
     } 
    } 
} 

jQuery를 :

$("#searchbar").keyup(function(){ 
    var searchTerm = $(this).val(); 

    $.post('search.php', { search_term: searchTerm}, function(data){ 

     $(".searchResults").html(data); 
     $("#searchUl").css("display", "block"); 
    }); 
}); 

다시 말하지만, 다른 모든 것은 잘 실행되지만 여러 가지 테이블을 쿼리하는 방법을 모르므로 href를 다르게 출력 할 수 있습니다 (예 : index.php? band = $ band_id for band and index.php? user = $ user_id 사용자 용.

답변

1

probl 당신은 UNION ALL을 통해 레코드가 밴드이든 사용자이든 정보를 잃어 버리는 것입니다. 이렇게하면 서로 다른 형식의 레코드가 같은 집합에 저장되고 열 band_id, user_idband_name, username이 병합됩니다.

당신은 다른 방법으로이 문제를 해결할 수 :

  1. 두 개의 별도의 쿼리를 작성합니다. 그런 다음 밴드 쿼리에서 모든 결과를 가져 와서 배열에 넣고 사용자 쿼리의 모든 결과를 다른 배열에 넣습니다. 그런 다음 두 배열 결과를 에코합니다.

  2. MySQL이 각 행의 유형을 알려줍니다. 이 같은 쿼리를 변경하여이 작업을 수행 할 수 있습니다 :

    (
        SELECT `band_id` , `band_name` , "band" AS `type` 
        FROM `bands` 
        WHERE `band_name` LIKE '%$search_term%' 
        LIMIT 0 , 5 
    ) 
    UNION ALL ( 
        SELECT `user_id` , `username` , "user" AS `type` 
        FROM `users` 
        WHERE `username` LIKE '%$search_term%' 
        LIMIT 0 , 5 
    ) 
    

    귀하의 질의 결과 지금 "band" 또는 "user" 중 하나를 포함 type라는 추가 열이있을 것이다. 해당 열의 값에 따라 다른 링크를 반향시킬 수 있습니다.

    예를 들어, 다음과 같은 코드를 확장 할 수 : 두 경우 모두에서 당신은 쿼리의 첫 번째 부분에서 열 이름을 걸릴 것 가입하기 때문에 $row["band_id"]을 읽을 필요가 있다고

    if($row["type"] === "band") { 
        echo "somelink?band_id=" . $row["band_id"]; 
    } else { 
        echo "somelink?user_id=" . $row["band_id"]; 
    } 
    

    참고. 모든 사용자 ID는 band_id 열에 있습니다.

+0

"if 문"또는 "에코"에서 두 번째 옵션을 어떻게 사용합니까? –

+0

첫 번째 옵션으로 끝났지 만, 두 개의 서로 다른 while 루프를 통해 끝내야 만 사용자 앞에 모든 밴드 결과가 표시됩니다. 분명히 좋은 수정은 아니지만, 제대로 작동하는 것이 좋습니다. 언젠가는 완성 될 것입니다. 도와 주셔서 감사합니다. –

+0

@MitchMullvain 두 번째 솔루션을 사용하는 경우'$ row [ 'type']'형식으로 액세스 할 수 있습니다. – Chris