Привет, у меня есть таблица в sql, называемая премиум, теперь, когда «пользователь» с премией (в таблице есть 1 номер, это премиум, а 0 — нет), то в коде перед вами у меня есть авангард, который каждый час при нажатии должен получить что-то взамен в этом случае это таблица с именем userMana Теперь я хочу премиальное имя Получит больше (то есть заплаченные деньги), тогда это правильно?
Первую часть я попробовал, а после этого использовал нижнюю часть
if (isset($_GET['daily'])) {
if ($user->checkHours($user->hourEvent)) {
$time = date("Y-m-d H:i:s", time());
$mysqli->prepare("UPDATE `users` SET `hourEvent` = ?, `userMana` = `userMana` + 10, `userCitizens` = `userCitizens` + 1 WHERE userId = ?")->execute([$time, $user->userId]);
header("Location: /אזור-משחק/בסיס");
} else if ($user->premium > 0) {
if ($user->checkHours($user->hourEvent)) {
$time = date("Y-m-d H:i:s", time());
$mysqli->prepare("UPDATE `users` SET `hourEvent` = ?, `userMana` = `userMana` + 101, `userCitizens` = `userCitizens` + 1 WHERE userId = ?")->execute([$time, $user->userId]);
header("Location: /אזור-משחק/בסיס");
}
}
}
################################ Separator ###########################
if (isset($_GET['daily'])) {
if ($user->checkHours($user->hourEvent)) {
$time = date("Y-m-d H:i:s", time());
$mysqli->prepare("UPDATE `users` SET `hourEvent` = ?, `userMana` = `userMana` + 10, `userCitizens` = `userCitizens` + 1 WHERE userId = ?")->execute([$time, $user->userId]);
header("Location: /אזור-משחק/בסיס");
}
if ($user->premium > 0 && $user->checkHours($user->hourEvent)) {
$time = date("Y-m-d H:i:s", time());
$mysqli->prepare("UPDATE `users` SET `hourEvent` = ?, `userMana` = `userMana` + 11, `userCitizens` = `userCitizens` + 1 WHERE userId = ?")->execute([$time, $user->userId]);
header("Location: /אזור-משחק/בסיס");
}
}
Первый не будет работать должным образом.
Условие else if
будет проверено только тогда, когда $user->checkHours($user->hourEvent)
вернет false
. Но вложенный блок if
выполняется только тогда, когда это же выражение возвращает true
. Если результат этого не изменится между этими двумя тестами, второй никогда не будет успешным. Таким образом, премиум-пользователи никогда не получат бонус.
Вторая версия будет давать бонусы два премиум-пользователям. Сначала они получат тот же бонус 10
, что и все остальные, а затем получат дополнительный бонус 11
, потому что они являются премиум-пользователями. Думаю, будет понятнее написать так:
$normal_bonus = 10;
$premium_bonus = 21;
if (isset($_GET['daily']) && $user->checkHours($user->hourEvent)) {
$bonus = $user->premium ? $premium_bonus : $normal_bonus;
$mysqli->prepare("UPDATE `users` SET `hourEvent` = ?, `userMana` = `userMana` + ?, `userCitizens` = `userCitizens` + 1 WHERE userId = ?")->execute([$time, $bonus, $user->userId]);
header("Location: /אזור-משחק/בסיס");
}
Это удаляет много повторяющегося кода между случаями и выполняет только один запрос для добавления в userMana
.
Привет, если я хочу сделать это с другим параметром, это почти то же самое, верно? вместо : $normal_bonus
Делаю $normal_bonus1
Потом ставит вопросительный знак (?) К тому же изменению в SQL Потом пишет: $bonus1
вместо $bonus
Верно? Или это больше, чем это.
Это точно. Вы можете использовать любое количество переменных и параметров.
Вы используете MySQLi или PDO? Передача массива значений параметров в
execute()
работает только в PDO, а не в MySQLi.