2017-05-08 69 views
0

我試圖根據他們發佈的帖子數量爲用戶提供排名。我創建了一個包含一個rankName行的數據庫,其中包含「beginner,新手,itermediate,... to master」以及包含一些數字的最小行。我試圖比較帖子數量($ qtyPosts)與最小行數。從操作員的數據庫中獲取特定值

例如:當一個用戶有9個職位,他得到的排名新手(至少有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列以及在表中查詢更改爲

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

因爲根據你的職位,你會得到所有的行列$qtyPosts>最低限度的數量。

+0

好吧,得到它的工作謝謝。 '$ statementRank = $ conn-> prepare(「SELECT rankName FROM rank WHERE rank.minimum <= $ qtyPosts AND rank.maximum> = $ qtyPosts ORDER BY rank.minimum LIMIT 1」);'' –

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個職位,但他顯示「中級」職位。 –