2017-05-08 7 views
0

投稿した投稿の量に基づいてユーザーにランク付けをしようとしています。私は "beginner、novice、itermediate、... master"というrankName行を含むデータベースを作成し、いくつかの数字を持つ最小行を作成しました。投稿の量($ qtyPosts)と最小行を比較しようとしました。オペレータでデータベースから特定の値を取得する

例:ユーザーが9個の投稿を持っている場合、ユーザーはRank Novice(最低5個の投稿)を取得します。 これは私が書いたコードです。

PHPコード

// calculate number of posts from user 
$rowsPosts = $user->getQuantityOfPosts($userID); 
$qtyPosts = 0; 
foreach ($rowsPosts as $q) { 
    $qtyPosts++; 
} 

//status 

$conn = db::getInstance(); 

$rank = ""; 

$statementRank = $conn->prepare("SELECT * FROM rank WHERE rank.minimum >=  $qtyPosts"); 
$statementRank->execute(); 

    while($row = $statementRank->fetch(PDO::FETCH_ASSOC)){ 
    $rank = $row['rankName']; 
    } 

HTMLコード

<h3>Status: <?php echo $rank; ?></h3> 

しかし、それは右のランクを投稿しません、代わりにそれが最新のもの、 "マスター" ポストします。誰でも構いませんか?

+0

私はここでロジックを理解していない、0の$ qtyPostsはあなたのSQLですべてのランクを返すだろうか? – Devon

+0

'$ rank = $ row ['rankName'];'、 '$ rank'は毎回上書きされます。最後の値だけが保持されます! – Thamilan

答えて

0

私はあなたがテーブルに同様maximum列を持っているし、あなたの現在のポストによると、あなたは$qtyPosts> minimun数ですべてのランクを取得しますので

SELECT * FROM rank WHERE rank.minimum >= $qtyPosts AND rank.maximum < $qtyPosts 

にクエリを変更する必要がありますね。

+0

それは働いてくれてありがとう。 '$ rankPosts AND rank.maximum> = $ qtyPosts ORDER BY rank.minimum LIMIT 1"); '$ rankPosts ORDER BY rank.minimum LIMIT 1'); '$ステートメントランク= $ conn-> –

2

があなたのWHERE句考えてみましょう:ユーザーが最低ランクである場合

WHERE rank.minimum >= $qtyPosts 

を、そしてすべてランクは>=ユーザーの投稿数となります。

同じロジックを維持できますが、注文と制限を追加するだけです。このようなもの:

WHERE rank.minimum >= $qtyPosts ORDER BY rank.minimum LIMIT 1 

これは、ランクを最低から最高までソートし、最初のものを選択するだけです。

+1

変数を一度しか設定したくない場合は、whileループを使用しないでください。 – Devon

+1

@AmeBerckmansまた、 'foreach'ループは必要ありません。単純な' $ qtyPosts = count($ rowsPosts); 'はうまくいくでしょう。 –

+0

私はあなたの「どこ」アイデアを試しましたが、間違ったランクを示しています。ランクの「初心者」には最低5つの投稿があり、「中級」には15の投稿があります。たとえば、ユーザーには9つの投稿がありますが、「中間」ランクを示しています。 –

関連する問題