2017-11-19 6 views
1

죄송합니다. 중복 인 경우, 검색을 시도했지만 답변을 찾지 못하는 것 같습니다. 코드 위치가 틀릴 수도 있습니다.array_unique 중복 값을 제거하지 않음 PHP

$ _GET을 통해 보낸 다양한 선택 상자에서 입력 한 중복 값을 계산했습니다. 이 중복을 사용하면 (설정된 금액이 무엇이든) mysql 쿼리를 통해 실행됩니다. 이것은 모두 정상적으로 작동합니다.

문제는 mysql 쿼리에서 반환되는 중복을 제거해야한다는 것입니다. 여기에 내 코드입니다 : 당신이 볼 수 있듯이

if ($countGearSelected >= 2) {  
     $gearSets = array_keys(array_filter(array_count_values($_GET['gearPiece']), function($v) { 
      return $v > 1; 
     })); 

     foreach ($gearSets as $gearSetKey => $gearSetValue) { 

      $result = mysqli_query($con,"SELECT twoPieceBonus FROM sets WHERE setName='".$gearSetValue."';"); 
      while($row = mysqli_fetch_array($result)){ 

       $twoPieceBonus .= urldecode($row['twoPieceBonus']).'</br></br>'; 

      } 
      $twoPieceBonus = implode(',',array_unique(explode(',', $twoPieceBonus))); 
      $twoSelected = substr($twoPieceBonus, 0, -10); 

     } 


    }else{ 
     $twoSelected = ''; 
    } 

, 내가 SE에 대한 다양한 게시물에 array_unique 옵션을 시도하지만이 동작하지 않는 것. 나는 그것을 잘못 사용했을지도 모른다라고 생각한다?

DISTINCT를 사용하는 것은 mysql 쿼리에서 작동하지 않습니다. 쿼리되는 "세트"중 일부가 동일한 결과를 나타냅니다 (의미가있는 경우).

모든 도움을 주시면 대단히 감사하겠습니다.

+0

당신이 우리에게'$의 result'의 값의 형식을 줄 수 있습니까? –

+0

$ 결과 값을 인쇄 할 수 있습니까? – stalinrajindian

+0

mysqli_result 개체 ([current_field] => 0 [field_count] => 1 [길이] => [num_rows] => 1 [type] => 0) – DisplayName

답변

1

첫 번째 코드는 SQL injection에 취약합니다.이를 피하려면 prepared statements을 사용하십시오.

둘째 루프의 각 반복에서 쿼리를 실행하는 것이 좋지 않은 아이디어입니다. 그리고이 경우에는 피할 수 있습니다. where 절의 동등 비교 대신 in 연산자를 사용하여 한 번에 모든 기어 세트를 비교할 수 있습니다.

이렇게하면 고유 값을 가져 오는 문제도 해결됩니다. 하나의 쿼리 만 실행하면 수는입니다. 이제 distinct을 사용하십시오.

다음은 코드의 모양입니다. 나는 이것을 테스트 할 수 있습니다,하지만 난 실수 (있는 경우)를 쉽게 해결할 수 있습니다 기대 :

$twoSelected = ''; 
if ($countGearSelected >= 2) {  
    $gearSets = array_keys(array_filter(
     array_count_values($_GET['gearPiece']), function($v) { 
      return $v > 1; 
     } 
    )); 

    // Create comma separated list of question marks 
    $placeHolders = implode(",", array_fill(0, count($gearSets), "?")); 
    // Prepare SQL statement with it 
    $stmt = mysqli_prepare($con, 
      "SELECT DISTINCT twoPieceBonus 
      FROM sets 
      WHERE setName IN ($placeHolders);"); 

    // All gearSet values are strings: 
    $types = str_repeat("s", count($gearSets)); 
    // Turn the gearSets into references 
    $gearSetRefs = []; 
    foreach ($gearSets as $i => $_) { 
     $gearSetRefs[] = &$gearSets[$i]; 
    } 
    // Bind arguments 
    mysqli_stmt_bind_param($stmt, $types, ...$gearSetRefs); // the splat operator 
    // Now we are all set to (safely) execute the query 
    mysqli_stmt_execute($stmt); 
    $result = mysqli_stmt_get_result($stmt); 
    // Let the result of the URL decoding still be an array 
    $twoPieceBonus = []; 
    while ($row = mysqli_fetch_array($result)) { 
     $twoPieceBonus[] = urldecode($row['twoPieceBonus']); 
    } 
    mysqli_stmt_close ($stmt); 
    // ... and then use implode to insert those HTML breaks 
    $twoSelected = implode("</br></br>", $twoPieceBonus); 
} 
+0

조언을 주셔서 감사합니다. 바로 박쥐에서 작동하는 것 같습니다!유일한 문제는 (아마 꽤 길어질 수있는 다른 질문에 대한 것입니다.) 6 가지 선택 사항 (기어 세트의 경우) 중에서 하나를 선택하면 2 개, 다른 하나는 4 개를 선택하면 fourPieceBonus가 출력됩니다. 둘 다 (이 쿼리는 3 조각과 4 조각 보너스를 위해 다시 반복됩니다.) – DisplayName

+0

이 코드를 다른 루프 안에 넣으면 결과를 간단한 변수 (예 :'$ twoSelected')에 저장하지 않고 배열에 추가해야합니다 따라서 외부 루프가 끝나면 여전히 개별 결과에 액세스 할 수 있습니다. 그러나 네, 아마도 당신이 나에게 말하려고하는 것을 지나치게 단순화하고 있습니다. 그래서 모든 세부 사항을 제공하는 새로운 질문을하십시오. – trincot

+0

할거야. 도와 줘서 고마워. 나는 지금 또 다른 질문을 게시 할 것이다. 대단히 감사 드려요 :) – DisplayName