自我每天减少MySQL列中的值

时间:2013-03-03 07:49:04

标签: mysql error-handling

我是PHP的新手,但我一直在尽我所能去了解这里出了什么问题:

$sid = $db->EscapeString($_GET['data']);
    $site = $db->FetchArray($db->Query("SELECT id,cpc FROM `surf` WHERE `id`='".$sid."'"));
    $check = $db->GetNumRows($db->Query("SELECT * FROM `surfed` WHERE `user`='".$data['id']."' AND `site`='".$sid."'"));
    $pr = mysql_query("SELECT premium  FROM users");
        if($site['id'] != "" && $check == 0 && $pr['premium'] = "0"){
        $db->Query("UPDATE `users` SET `coins`=`coins`+'".$site['cpc']."' WHERE `id`='".$data['id']."'");
        $db->Query("UPDATE `surf` SET `visits`=`visits`+'1', `points`=`points`-'".$site['cpc']."' WHERE `id`='".$site['id']."'");
        $db->Query("INSERT INTO `surfed` (user, site) VALUES('".$data['id']."', '".$site['id']."')");
    }
        elseif($site['id'] != "" && $check == 0 && $pr['premium'] != "0"){
        $db->Query("UPDATE `users` SET `coins`=`coins`+ 20 WHERE `id`='".$data['id']."'");
        $db->Query("UPDATE `surf` SET `visits`=`visits`+'1', `points`=`points`-'".$site['cpc']."' WHERE `id`='".$site['id']."'");
        $db->Query("INSERT INTO `surfed` (user, site) VALUES('".$data['id']."', '".$site['id']."')");
    }
}

所以,基本上我一直试图做的是奖励没有Premium的用户使用正常数量的硬币和使用Premium的用户在我的Traffic Exchange网站上获得20个硬币。我不知道为什么,但上面的代码奖励每个人20个硬币。

另一个问题是上面的Premium代表一个人帐户中剩余的Premium天数,但这似乎并不是每天都在减少。有什么办法解决吗?

说明:

  • surf包含idusertitlecpc等。这是我的流量交换中的浏览页面提取数据的表格要显示。 id是siteID,cpc =每次点击费用等。
  • surfed包含siteiduserid,以防止用户在24小时之前再次浏览同一网站。 Cron每天都会删除此表中的数据。
  • users包含idusernamecoinspremium等用户信息表。

1 个答案:

答案 0 :(得分:0)

我发现的第一个问题是你是在试图确定特定用户是否是“高级”用户。为此,您有以下代码:

$pr = mysql_query("SELECT premium FROM users");

但是,这将为所有用户提供“高级”列,这不是很有用。请尝试将其更改为:

$pr = mysql_query("SELECT premium FROM users WHERE id={$data['id']}");

这假设您的用户ID在$data['id'](我认为是现有代码的情况),并且可以认为此数组条目已被转义。

其次,您尝试使用$pr的值作为结果数组,而实际上这是一个结果句柄。要使用它,您需要执行以下操作:

$pr = mysql_query("SELECT premium FROM users WHERE id={$data['id']}");
$prData = mysql_fetch_assoc($pr);
$premium = $prData['premium'];

第三,您似乎有一个名为$db的数据库类,但您正在将mysql_函数混合到代码中。使用$db类提供的方法可能更好,但由于我不知道你在这里使用的是什么类,所以很难建议。


除此之外:如果您提供尽可能多的信息,它将帮助您作为初学者。你需要假设人们对你的用例一无所知 - 所以解释一切,包括尽可能多的信息,同时保持合理简洁。什么是“冲浪页面”?你的“交通交流”是什么?什么课程是$db?对于数据库问题,通常会提供完整的表定义。

此外,如果您获得问题的答案,请尝试将其应用于您的案例,并根据需要要求澄清。在大多数情况下,这里的人会愿意教你,但不愿意为你工作。在任何情况下,向Internet上的人员提供服务器凭据都是不好的安全做法,除非您确信他们不会损坏您的文件或窃取您的用户数据库:)。对此非常小心!

正如我在评论中指出的那样,这类问题已经适合调试。您知道代码没有按照您的意愿执行,但您不确定 它是否失败。因此,技巧是缩小范围,直到找到具有意外或错误值的变量。

例如,请看这段代码(为了清楚起见,我已将其包装起来 - 您可以在PHP中执行此操作):

$sid = $db->EscapeString($_GET['data']);
$site = $db->FetchArray(
    $db->Query("SELECT id,cpc FROM `surf` WHERE `id`='".$sid."'")
);

尝试添加一个调试语句:

$sid = $db->EscapeString($_GET['data']);
echo "Site ID: $sid";
exit();
$site = $db->FetchArray(
    $db->Query("SELECT id,cpc FROM `surf` WHERE `id`='".$sid."'")
);

然后,检查$sid是您期望的值。如果它很好,那么继续下一段代码。如果没有,请参阅为什么不正确。接下来我会尝试这样的事情:

$sid = $db->EscapeString($_GET['data']);
$sql = "SELECT id,cpc FROM `surf` WHERE `id`='" . $sid . "'";
echo "Surf query: $sql";
exit();
$site = $db->FetchArray($db->Query($sql));

在这里,您可以按预期检查SQL查询。