【问题标题】:Something wrong with my IF statement我的 IF 语句有问题
【发布时间】:2015-09-15 03:26:57
【问题描述】:

我为我的网页游戏创建了一个简单的代码,没有错误,但部分代码不起作用。不起作用的部分是最后两个 if 语句,它不会给用户一个反物质,但它会打印出正确的消息。为什么它不能正确更新数据库?

代码:

    ///////////////////////////////BLACKBOX////////////////
function buyblackbox(){
global $USER, $PLANET, $LNG, $UNI, $CONF,$resource,$pricelist;
$blackbox = HTTP::_GP('blackbox', 0);
$price = 10000 * $blackbox;
$loli   = mt_rand(1,2);
if ($price < 0) {
$this->printMessage("Hack attempt.", true, array('game.php?page=premium', 2));
}
if($USER['antimatter'] < $price){
$this->printMessage("You do not have enough antimatter", true, array('game.php?page=premium', 2));
die();
}
elseif($blackbox < 0){
$this->printMessage("Hack attempt.", true, array('game.php?page=premium', 2));
die();
}else{
    $USER['antimatter'] -= $price;
$GLOBALS['DATABASE']->query("UPDATE ".USERS." SET `darkbox` = '".$loli."', `antimatter` = `antimatter` - '".$price."' WHERE `id` = ".$USER['id'].";");

if($USER['darkbox'] == 1)
{
$GLOBALS['DATABASE']->query("UPDATE ".USERS." SET `darkmatter` = `darkmatter` - '".$price."' WHERE `id` = ".$USER['id'].";");
$this->printMessage('vins nem sit has succesfully be bought', true, array('game.php?page=premium', 2));
}
if($USER['darkbox'] == 2)
{
$GLOBALS['DATABASE']->query("UPDATE ".USERS." SET `darkmatter` = `darkmatter` + '".$price."' WHERE `id` = ".$USER['id'].";");
$this->printMessage('BlackBox has succesfully be bought', true, array('game.php?page=premium', 2));
}
}
die();
}
/////////////////////////////////END BLACKBOX///////////////////////

【问题讨论】:

    标签: php mysql arrays database if-statement


    【解决方案1】:

    我认为您需要更改数据库查询,以便剩余反物质的计算在代码中完成,而不是作为 SQL 查询的一部分...

    $GLOBALS['DATABASE']->query("UPDATE ".USERS." SET `darkmatter` = ". ($USER['antimatter'] - $price) ." WHERE `id` = ".$USER['id']);
    

    请注意,您需要引用 $USER['antimatter'] 变量...我在原始答案中错过了这一点。


    基本上,您的原始代码会创建一个如下所示的 SQL 查询:

    UPDATE [Users] SET `darkmatter` = `darkmatter` - [Price] WHERE `id` = [UserId]
    

    它应该是这样的:

    UPDATE [Users] SET `darkmatter` = [Cost - Price] WHERE `id` = [UserId]
    

    [方括号]中的位是“在代码中”处理的,例如像$Price这样的变量,像$USER['antimatter'] - $price这样的表达式。

    说实话,您可能应该阅读 SQL 注入攻击 ...https://en.wikipedia.org/wiki/SQL_injection


    正如 Drew 所提到的,您还将您的号码视为一个字符串......我已经更新了我的答案以反映这一点(并且还删除了分号!)

    【讨论】:

      【解决方案2】:

      也许我理解错了,或者你只是弄错了我的想法,事情是当我将下面的代码应用到我的网站时,它不会做任何事情

      $GLOBALS['DATABASE']->query("UPDATE ".USERS." SET `darkmatter` = ". ($USER['antimatter'] - $price) ." WHERE `id` = ".$USER['id']);
      

      $GLOBALS['DATABASE']->query("UPDATE ".USERS." SET `darkmatter` = `darkmatter` - '".$price."' WHERE `id` = ".$USER['id'].";");
      

      我制作的这段代码只是为了测试它而不是最终代码,我想看看它是否有效,但它不会改变数据库中的任何内容,它只是打印出消息,仅此而已,暗物质没有任何变化。只有下面的 GLOBAL 有效

      $GLOBALS['DATABASE']->query("UPDATE ".USERS." SET `darkbox` = '".$loli."', `antimatter` = `antimatter` - '".$price."' WHERE `id` = ".$USER['id'].";");
      

      我不明白我做错了什么?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-11
        • 2014-01-23
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多