如果达到阈值则更新 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();
?>
但是如果满足第一个 if
,PHP 将不允许 elseif's
保留 运行。在 PHP 中有更好的方法吗?
只需在 if
中添加另一个条件即可:
if ($ro['xp'] > 2000 && $ro['xp'] <= "5000")
只需更改您使用的顺序即可。第一次检查 XP 是否 > 5000,然后是 2000。
您实际上带回了比实际需要更多的数据(您只使用了 select 的 xp
列)。所以你的声明:
$sl = "SELECT * FROM users WHERE id='$id'";
实际上可以简化为:
$sl = "SELECT xp, rank FROM users WHERE id = '$id' AND xp > 2000";
(一般来说,使用 SELECT *
不是最佳做法。)
存在 AND
子句是因为您不需要更新 xp
为 2000 或更少的用户——因此无需检索它们!
为什么我得到 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
P.S。还可以选择一次更新所有用户,而不是逐个用户更新:
UPDATE users
SET rank = CASE WHEN xp > 5000 THEN '3' ELSE '2' END
WHERE xp > 2000;
在这种情况下,如果您有单独的 table 等级和 XP 值,这可能是个好主意:
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;
我正在制作一个排名系统,检查用户的 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();
?>
但是如果满足第一个 if
,PHP 将不允许 elseif's
保留 运行。在 PHP 中有更好的方法吗?
只需在 if
中添加另一个条件即可:
if ($ro['xp'] > 2000 && $ro['xp'] <= "5000")
只需更改您使用的顺序即可。第一次检查 XP 是否 > 5000,然后是 2000。
您实际上带回了比实际需要更多的数据(您只使用了 select 的 xp
列)。所以你的声明:
$sl = "SELECT * FROM users WHERE id='$id'";
实际上可以简化为:
$sl = "SELECT xp, rank FROM users WHERE id = '$id' AND xp > 2000";
(一般来说,使用 SELECT *
不是最佳做法。)
存在 AND
子句是因为您不需要更新 xp
为 2000 或更少的用户——因此无需检索它们!
为什么我得到 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
P.S。还可以选择一次更新所有用户,而不是逐个用户更新:
UPDATE users
SET rank = CASE WHEN xp > 5000 THEN '3' ELSE '2' END
WHERE xp > 2000;
在这种情况下,如果您有单独的 table 等级和 XP 值,这可能是个好主意:
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;