如果达到阈值,请更新 Sql


Update Sql if threshold is met

我正在制作一个排名系统,该系统检查用户的XP是否达到某个级别,然后用他们的新排名更新数据库。这是我目前的代码。

 <?php
 session_start();
$servername = "localhost";
$username = "USERNAME";
$password = "PASSWORD";
$dbname = "DB";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
$id=$_SESSION['user']['id'];
$sl = "SELECT * FROM users WHERE id='$id'";
$reult = $conn->query($sl);
    while($ro = $reult->fetch_assoc()) {
if($ro['xp']>2000){
$sql = "UPDATE users SET rank='2' WHERE id='$id'";
if ($conn->query($sql) === TRUE) {
    echo"Success";
} 
} //ENDS THE IF
elseif($ro['xp']>"5000"){
$sel = "UPDATE users SET rank='3' WHERE id='$id'";
if ($conn->query($sel) === TRUE) {
    echo"Success";
}
}//ENDS ELSEIF

    }//WHILE LOOP ENDS
$conn->close();
    ?> 

但是PHP不允许elseif's在满足第一个if的情况下继续运行。在 PHP 中这样做是更好的方法吗?

只需在if中添加另一个条件:

if ($ro['xp'] > 2000 && $ro['xp'] <= "5000")

只需更改您使用的顺序即可。 第一次检查XP是否>5000,然后是2000。

您实际上带回的数据比实际需要的要多(您只使用您选择的xp列)。所以你的陈述:

$sl = "SELECT * FROM users WHERE id='$id'";

实际上可以简化为以下内容:

$sl = "SELECT xp, rank FROM users WHERE id = '$id' AND xp > 2000";

(通常,使用 SELECT * 不是最佳做法。

AND子句之所以存在,是因为您不需要更新 2000 或更低xp的用户 - 因此无需检索它们!

为什么我会rank?好吧,我也建议你重组你的if

while ($ro = $reult->fetch_assoc()) {
    $newrank = 2; // This is the default since any user retrieved will have xp > 2000
    if ($ro['xp'] > 5000) { // N.B. you have "5000" in quotes here - remove them!
        $newrank = 3;
    }
    if ($newrank != $ro['rank']) {
        // Update the user - no need to update if existing rank same as new!
        $sql = "UPDATE users SET rank='$newrank' WHERE id='$id'";
        if ($conn->query($sql) === TRUE) {
            echo"Success";
        } 
    }
} // end while

附言还可以选择一次更新所有用户,而不是逐个用户进行更新:

UPDATE users
   SET rank = CASE WHEN xp > 5000 THEN '3' ELSE '2' END
 WHERE xp > 2000;

本着这种精神,如果你有一个单独的等级和经验值表,这可能是一个好主意:

RANKS
--------------------
rank  min_xp  max_xp
1     0       2000
2     2001    5000
3     5001    etc.

然后,您可以执行以下操作:

UPDATE users u JOIN ranks r
    ON u.xp >= r.min_xp
   AND u.xp <= r.max_xp
   SET u.rank = r.rank;