0

我是 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 的用户每人 20 个硬币。我不知道为什么,但上面的代码奖励每个人 20 个硬币。

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

定义:

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

1 回答 1

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 查询是否符合您的预期。

于 2013-03-03T08:20:16.973 回答