У меня есть вопрос об использовании IF для обновления столбца SQL - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь использовать оператор IF для обновления столбца в моей базе данных.

if($data[chat_points] != '2001'){
    $mysqli->query("UPDATE boom_users SET user_level = 1 WHERE user_id = '{$data['user_id']}'");
}
if($data[chat_points] != '5000'){
    $mysqli->query("UPDATE boom_users SET user_level = 2 WHERE user_id = '{$data['user_id']}'");
}
if($data[chat_points] != '15001'){
    $mysqli->query("UPDATE boom_users SET user_level = 3 WHERE user_id = '{$data['user_id']}'");
}
if($data[chat_points] != '35001'){
    $mysqli->query("UPDATE boom_users SET user_level = 4 WHERE user_id = '{$data['user_id']}'");
}
if($data[chat_points] != '45001'){
    $mysqli->query("UPDATE boom_users SET user_level = 5 WHERE user_id = '{$data['user_id']}'");
}
if($data[chat_points] != '70001'){
    $mysqli->query("UPDATE boom_users SET user_level = 6 WHERE user_id = '{$data['user_id']}'");
}

С этим кодом он всегда обновляет 'user_level' до 6.

То, что я хочу здесь, - это когда пользователь получает 2001 очков чата ... обновление до уровня 1 и когда они наберут 5000 очков чата ... обновитесь до уровня 2 и т. д.

Может кто-нибудь объяснить, что я делаю не так?

Ответы [ 5 ]

0 голосов
/ 18 июня 2019

Мы должны получить текущий уровень пользователя. Всего один звонок

$sql = "SELECT user_level FROM boom_users WHERE user_id = '{$data['user_id']}'");    
//get the current user level
$level = $mysqli->query($sql)->fetch_object()->user_level;

//compare if user approached the 2001 limit but not exceed 5000 limit 
if($data[chat_points] >= '2001' && $data[chat_points] < '5000' && $level != 1){
    $mysqli->query("UPDATE boom_users SET user_level = 1 WHERE user_id = '{$data['user_id']}'");
}

В этом случае мы получаем, если утверждение истинно только в случае, если у пользователя более низкий уровень user_level, если у него выше, мы пропускаем. 1 вызов в БД раньше, и если утверждение верно, еще один вызов для обновления.

0 голосов
/ 18 июня 2019

Если я не правильно понял ваш вопрос , как насчет этого?

<?php
$levels = [2001=>1, 5001=>2, 15001=>3, 35001=>4, 45001=>5, 70001=>6];

if(!empty($data['chat_points']) && array_key_exists($data['chat_points'],$levels)){
    $mysqli->query("UPDATE boom_users SET user_level = {$levels[$data['chat_points']]} WHERE user_id = '{$data['user_id']}'");
}
?>
0 голосов
/ 18 июня 2019

Ваш код не имеет смысла. Это всегда будет 5 (когда точки == 70001) или 6 (все остальные точки).

Я ожидаю, что должно быть условие 'ниже чем', поэтому

if($data[chat_points] < '2001'){
    $mysqli->query("UPDATE boom_users SET user_level = 1 WHERE user_id = '{$data['user_id']}'");
}
elseif($data[chat_points] < '5001'){
    $mysqli->query("UPDATE boom_users SET user_level = 2 WHERE user_id = '{$data['user_id']}'");
}
elseif($data[chat_points] < '15001'){
    $mysqli->query("UPDATE boom_users SET user_level = 3 WHERE user_id = '{$data['user_id']}'");
}
elseif($data[chat_points] < '35001'){
    $mysqli->query("UPDATE boom_users SET user_level = 4 WHERE user_id = '{$data['user_id']}'");
}
elseif($data[chat_points] < '45001'){
    $mysqli->query("UPDATE boom_users SET user_level = 5 WHERE user_id = '{$data['user_id']}'");
}
elseif($data[chat_points] < '70001'){
    $mysqli->query("UPDATE boom_users SET user_level = 6 WHERE user_id = '{$data['user_id']}'");
}


Или лучше, короче, быстрее ...

$levels = [
    2001,
    5001,
    15001,
    35001,
    45001,
    70001
];

$level = 1;
foreach ($levels as $v) {
    if ($data['chat_points'] >= $v) $level++;
}

mysqli->query ("UPDATE boom_users SET user_level = " . (int)$level . " WHERE user_id = '{$data['user_id']}'");

if ($level <= count($levels)) {
    echo 'Needed to next level: ' . ($levels[$level - 1] - $data['chat_points']) . ' points';
} else {
    echo 'Max level';
}
0 голосов
/ 18 июня 2019

Вот что я хотел бы сделать:

//compare if user approached the 2001 limit but not exceed 5000 limit 
if($data[chat_points] >= '2001' && $data[chat_points] < '5000'){
    $mysqli->query("UPDATE boom_users SET user_level = 1 WHERE user_id = '{$data['user_id']}'");
}
0 голосов
/ 18 июня 2019

Ваш код сломан , потому что все операторы будут выполнены, и уровень всегда будет равен 6.

Один из способов исправить это, не внося слишком много изменений в код, - это использовать операторы if else {, чтобы не запускать одновременно только одну инструкцию.

if($data[chat_points] != '2001'){
    $mysqli->query("UPDATE boom_users SET user_level = 1 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '5000'){
    $mysqli->query("UPDATE boom_users SET user_level = 2 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '15001'){
    $mysqli->query("UPDATE boom_users SET user_level = 3 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '35001'){
    $mysqli->query("UPDATE boom_users SET user_level = 4 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '45001'){
    $mysqli->query("UPDATE boom_users SET user_level = 5 WHERE user_id = '{$data['user_id']}'");
} else if($data[chat_points] != '70001'){
    $mysqli->query("UPDATE boom_users SET user_level = 6 WHERE user_id = '{$data['user_id']}'");
}

Даже в этом случае он не будет иметь предполагаемой функциональности , потому что эти операторы выполняются только тогда, когда количество точек является точным значением. Способ сделать так, чтобы он работал постепенно, чтобы пользователь мог увеличивать свой уровень с течением времени, путем изменяя все != сравнения на ==.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...