每天在MySQL列中自减一个值

每天在MySQL列中自减一个值,mysql,error-handling,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 `us

我是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']."')");
    }
}
所以,基本上我一直在尝试做的就是在我的流量交换网站上,用正常数量的硬币奖励那些没有溢价的用户,用20个硬币奖励那些有溢价的用户。我不知道为什么,但是上面的代码奖励每个人20个硬币

另一个问题是,上面的保费表示个人账户中剩余的保费天数,但这似乎并没有每天减少。有办法解决吗

定义:

  • surf
    包含
    id
    user
    title
    cpc
    等。这是我的流量交换上的surf页面从中提取要显示的数据的表
    id
    是站点id,
    cpc
    =每次点击的成本等
  • surved
    包含
    siteid
    userid
    以防止用户在24小时前再次浏览同一站点。Cron每天从该表中删除数据
  • users
    包含
    id
    username
    coins
    premium
    等用户信息表

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

$pr = mysql_query("SELECT premium FROM users");
然而,这将为所有用户提供“premium”列,这不是很有用。请尝试将其改为:

$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'];
$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));
第三,您似乎有一个名为
$db
的数据库类,但您正在将
mysql\uuz
函数混合到代码中。使用
$db
类中提供的方法可能更好,但由于我不知道您在这里使用的是什么类,因此很难给出建议


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

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

正如我在评论中所指出的,这种问题已经成熟,可以调试了。您知道代码没有按照您希望的方式运行,但是您不确定它在哪里失败。因此,诀窍是缩小范围,直到找到一个具有意外或错误值的变量

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

尝试添加调试语句,如下所示:

$sid = $db->EscapeString($_GET['data']);
echo "Site ID: $sid";
exit();
$site = $db->FetchArray(
    $db->Query("SELECT id,cpc FROM `surf` WHERE `id`='".$sid."'")
);
然后,检查
$sid
是否为您期望的值。如果是,很好,继续下一段代码。如果不正确,请查看其不正确的原因。接下来我要尝试的是这样的事情:

$pr = mysql_query("SELECT premium FROM users WHERE id={$data['id']}");
$prData = mysql_fetch_assoc($pr);
$premium = $prData['premium'];
$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查询是否符合预期。

哇。。。这是一个很大的查询。与其在一个人的帐户中存储剩余天数,不如存储一个结束日期——如果你想要剩余天数,你可以计算它。这样,你就不需要每天减少所有用户的数量——简单多了!另外,与其使用
SELECT
一次获取一个用户ID,不如在整个用户表中运行
UPDATE
,以获得所需的更新,并受用户类型的限制。(如果我们能看到你的“冲浪”、“冲浪”和“用户”表的定义,编辑到你的问题中,那会有很大帮助。)我不明白!我的意思是,有没有办法,我可以使用cron使值每天减少?我不懂计算?问题是它并没有减少,也就是说,如果一个人订购一周的保险费,它会保留数年。@user1928108你应该接受哈弗的建议。将到期日存储在“Premium”上。如果今天的日期超过了到期日期,用户将处于正常状态。这仍然会将20枚硬币记入每个用户(无论是否为高级用户)的贷方。如果可以的话,我准备让你访问我的cPanel!或者,如果合适的话,我可以给你脚本的下载链接!哪一个更好,就告诉我。再次感谢你的帮助。还没有好消息。我可以为您提供PHP脚本以便您可以查看它吗?您最好在这里学习如何提问,这样其他人也可以提供帮助。如果有更多的脚本需要人们查看以帮助您,请将其编辑到原始问题中。然而,在所有这些之前,您是否进行了一些调试?对于代码的每个部分,尝试输入
print\r($myVar);退出()以查看值是否如您所期望的那样。我添加了一些关于如何调试的简单示例。试试看,让我们知道你进展如何!先生,我稍后再试试。。我感谢所有的帮助。谢谢。