2017-11-19 4 views
1

申し訳ありません重複している場合は検索を試みましたが、回答が見つからないようです。私はちょうど間違った場所にコードの一部を持っているかもしれません。array_unique重複した値を削除しないph

$ _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 [lengths] => [num_rows] => 1 [type] => 0) – DisplayName

答えて

1

最初に:あなたのコードはSQL injectionに脆弱です。これを避けるにはprepared statementsを使用してください。

第2に、ループの各繰り返しでクエリを実行することはよくありません。そしてこの場合、それは避けることができます。 where句の等価比較の代わりに、in演算子を使用して、すべてのギアセットを一度に比較することができます。

これにより、別個の値を取得する問題も解決します。 1つのクエリのみを実行すると、を使用して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

関連する問題