【问题标题】:PHP Daily bonusPHP每日奖金
【发布时间】:2013-05-23 19:48:58
【问题描述】:

我需要编写每日奖励系统。 用户必须能够每天获得一次奖金。 我编写了类似的代码:

function checkDailyBonus($user, $type) {
    global $ado;
    $last_day = strtotime(date("Y:m:d 00:00:00"));

    $query = $ado->exec("SELECT * FROM claimed_bonuses WHERE `user` = '$user' and `type` = '$type' ORDER BY `id` DESC");
    $row = mysql_fetch_assoc($query);
    $date = strtotime($row['date']);
    if ($ado->count($query) < 1) {
        return 1;
    } else {
        if ($last_day < $date) {
            return 0;
        } else {
            return 1;
        }
    }
}

但是它返回了错误的结果:即使今天高于最后一个索赔奖金脚本返回 0,但它应该返回 1。最后索赔日期为 2013-05-19 23:05:41。提前感谢您的帮助。

【问题讨论】:

  • 看起来你在乞求 SQL 注入。
  • 您是如何访问数据库的?您的 exec 函数是否返回了可以传递给 mysql_fetch_assoc() 的内容?
  • @John,如果 $type$user 是用户输入,那将是正确的,但这里没有任何迹象。
  • 我会在查询中设置一个限制 1 以获得性能,或者只是选择 date &gt; '&lt;?= date("Y-m-d")' 的位置并检查计数
  • 您是否进行了一些调试以查看问题所在?另外,我建议您修复缩进 - 它确实让生活变得很多更轻松。

标签: php sql date


【解决方案1】:

嗯,为什么不呢。

SELECT ..
FROM claimed_bonuses
WHERE DATE(lastbonus) < CURDATE()

当您可以让 MySQL 直接在查询中更简单地执行此操作时,所有这些 strtotime 调用和过滤整个用户表在 PHP 中是毫无意义的......

【讨论】:

  • 我不知道如何检查用户今天是否已领取奖金。如果是脚本应该返回 0,如果不是 1,如果它的第二天它也应该返回 1
【解决方案2】:

在不知道您的数据库结构的情况下,我无法为您编写此代码,但我建议您在查询中执行此操作,例如:

当天:

SELECT * FROM claimed_bonuses
WHERE `user` = '$user' and `type` = '$type'
AND date_format(`date`, '%Y%b%e') = date_format(now(), '%Y%b%e')

然后检查它是否返回一行。

【讨论】:

  • 呃,为什么所有的字符串格式,当你可以直接比较日期? date(dateifled) = date(otherdatefield)?
  • 我需要检查用户是否在当天领取了奖金,如果没有则返回 1,如果是则返回 0
  • 在这种情况下,因为我从代码 sn-p 中获取了它,因为其他原因我需要这样做,它是更大的东西的一部分,我删除了与我有关的其余部分循环通过东西。我想这并不重要。我同意在他的情况下没有理由在 SQL 之外执行此操作。
  • Michal,做$didntHaveBonusToday = (int)(mysql_num_rows($query) == 0); 或类似的东西
猜你喜欢
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多