2016-09-16 7 views
-1

こんにちは私はデータベースから5つのランダムな行を取得しようとし、それらを表示しています。私は現在これをしていますが、結果は重複しています。php mysqlのランダムな行が重複しない

制限を5に変更して配列に格納する必要がありますが、どうすればよいですか?それとも良い方法がありますか?

function GetPlayer($link){ 
    if (isset($_SESSION['username'])) { 
    $x = 0; 
    while($x <= 5) { 
     $sql = "SELECT * FROM userstats ORDER BY RAND() LIMIT 1; "; 
     $result = mysqli_query($link,$sql); 
     $row = mysqli_fetch_assoc($result); 
     if($row['username'] !== $_SESSION['username']){//add so it dosent put duplicates 
      echo ("<tr>"); 
      echo ("<th>".$row['username']." </th>"); 
      echo ("<th>Level: ".$row['Level']." </th>"); 
      echo ("<th>Player Stats:".$row['Attack']."/".$row['Defence']." </th>"); 
      echo ("<th>Win Chance: "); 
      echo CalculateWinChance($link,$row['Defence']); 
      echo ("<th><input type ='submit' name = 'Attack_Btn' value ='Attack'></th>"); 
      echo ("</tr>"); 
      $x++; 
     } 
    } 
    } 
} 
+2

使用。 –

+0

'ORDER BY RAND()LIMIT 5;'が最良の方法です。 – CatalinB

+0

私はここで別の質問をすることができます。送信ボタンを各行ごとに一意にするにはどうすればよいですか?だから私は変数を渡すためにそれを使用することができます – GregHBushnell

答えて

1

は、なぜあなたは5つの結果(LIMIT 5)ANDループこれを要求しようとdont't:

あなたのクエリは次のようにすべきですか?重複は返されません。 4つのクエリの副作用は少なくなります。

$sql = "SELECT * FROM userstats ORDER BY RAND() LIMIT 5; "; 
while($row = mysqli_fetch_assoc($result)){ 
... 
} 
+1

私が探していたものをありがとう。私は、$ row = mysqli_fetch_assoc($ result)を別のものに変更する必要があるという印象を受けました。しかし、今私はそれがうまく動作することを知っている私は他のもののためにもそれを使用することができます – GregHBushnell

0

ループ内でクエリを5回呼び出す代わりに、1回のクエリが必要です。それが最適なアプローチです。

GROUP BY句を使用して一意の行を選択できます。

SELECT * 
FROM userstats 
GROUP BY username 
ORDER BY RAND() 
LIMIT 5 
0

クエリでの入力をサニタイズおよび/またはprepared statementを使いたいでしょうが、これは何をしたいのあなたはかなり近づく必要があります:BY DISTINCTおよび/またはGROUP

$sql = 'SELECT * FROM userstats WHERE username != ? GROUP BY username ORDER BY RAND() LIMIT 5'; 
$stmt = $mysqli->prepare($sql); 
$stmt->bind_param('s', $_SESSION['username']); 
関連する問題