dpesnyak
@dpesnyak

Почему не выполняется условие WHERE?

if ($promo == 'NEWUSER'){
	if($bd->Query("SELECT COUNT(*) FROM users_nykfageubf WHERE p = '$p' AND promo_new=1")){
		$bd->Query("UPDATE users_nykfageubf SET promo_new = 0 WHERE p = '$p'");
		$bd->Query("UPDATE users_nykfageubf SET balance=balance+10 WHERE p = '$p");
	} else {
		echo '<div class="alert-msg"><a href="#" class="close-alert"><i class="fa fa-times"></i></a><p>Вы уже использовали промокод.</p></div>';
       }
}


Присутствует такой фрагмент кода. Реализуется использование промокода. По замыслу, у пользователя $p проверяется, использовал ли он промокод promo_new (1 - нет, 0 - да). Если нет, то баланс увеличивается на 10 и promo_new = 0; Проблема лишь в том, что в не зависимости от того, какое значение стоит в promo_new, пользователь неограниченное кол-во раз может использовать промокод и получить +10 на баланс. Не понимаю почему, ведь присутствует WHERE и всё чётко указано.
  • Вопрос задан
  • 107 просмотров
Пригласить эксперта
Ответы на вопрос 2
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Потому что

$bd->Query("SELECT COUNT(*) FROM users_nykfageubf WHERE p = '$p' AND promo_new=1"))


всегда возвращает true - запрос выполнен успешно, а не количество найденных строк

Кстати два запроса следует объединить в один:
$bd->Query("UPDATE users_nykfageubf SET balance=balance+10, promo_new = 0 WHERE p = '$p' AND promo_new=1");

а в качестве провереи использовать более быстрый запрос:
$stmt = $bd->Query("SELECT 1 FROM users_nykfageubf WHERE p = '$p' AND promo_new=1 LIMIT 1");
if ($stmt->rowCount() > 0) {
    ...........
}
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
По хорошему, все три запроса надо объединить в один, переписать с плейсхолдерами и проверять mysqli::$affected_rows или PDOStatement::rowCount после запроса. Так можно избежать состояния гонки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы