【问题标题】:Database type int use value for calculation with数据库类型 int 用于计算的值
【发布时间】:2018-06-10 02:45:12
【问题描述】:

我正在 CodeIgniter 平台上工作(学习)。除了mysql语法之外,代码与普通PHP没有太大区别

问题

一位用户的余额为 100 美元。然后他报名参加了一场比赛。比赛的报名费为 50 美元。因此:

  1. 从 DB 获取余额
  2. 从从 DB 检索到的值中减去 5$0
  3. 使用新值更新数据库。

以上内容应该相当简单,但我得到了奇怪的结果。

Games_model

public function get_balance($userID)
    {
        $sql = "SELECT balance FROM users WHERE userID = '$userID'";
        $stmnt = $this->db->query($sql);
        if($stmnt->num_rows() > 0){
           $balance =  $stmnt->result();
           return $balance;
    }
return false;
    }

    public function update_balance($userID){
        //get balance
        $balance = $this->get_balance($userID);
        //charge for pool entry
        $newBalance = (int)$balance - (int)50;
        var_dump($newBalance);
        echo '<h1>'.$newBalance.'</h1>';
        $this->db->set('balance', (int)$newBalance);
        $this->db->where("userID", $userID); //table column field, second argument
        $this->db->update('users');

    }

游戏控制器

//Charge for picks #TODO add a check if user has enough funds to enter!!!!!
            echo $this->games_model->update_balance($this->session->userID);
            //Transferring data to Model uploaded
           echo $this->games_model->record_picks($data['picks']);

            $this->load->view('templates/header', $data);
            $this->load->view('games/record_picks', $data);
            //$this->load->view('templates/upcoming_fixtures_tbl', $data['games']);
            $this->load->view('templates/footer', $data);
        }

我做了什么

db 中 balance 的类型是 int() 类型,但是获取该值并减去 50 会得到错误的结果。然后我将balance字段更改为varchar()并尝试减去50。仍然是错误的结果。

最后我尝试了类型转换,正如您在上面的代码中看到的那样,但它仍然会产生错误的结果。

我得到的结果

在此示例中,我得到用户的balance,即 150。然后我尝试从中减去 50。我得到的结果是....-49 这真的很奇怪。

非常感谢任何帮助。

更新:

我已经调试了get_balance() 方法,可以确认检索到正确的余额。 问题发生在update_balance() 方法中。

更新 2:

当我尝试echo $balance = $this->get_balance($userID);在update_balance() 方法中,我得到了一个数组到字符串的转换。所以我怀疑这就是问题所在。

严重性:通知消息:数组到字符串转换文件名: models/Games_model.php 行号:130

更新 3

方法get_balance()的var_dump()

数组(大小=1)0 => 对象(stdClass)[41] public 'balance' => string '-49' (length=3)

【问题讨论】:

  • 当你回显update_balance() 中的变量时,你得到了预期的结果吗?还是更新查询没有按预期工作?
  • 我可以确认更新查询正在工作,因为它将balance 更新为49。让我echoupdate_balance 里面的一些 vars 回来报告
  • @Mike 请参阅更新 2
  • 您应该使用整数类型(smallint、int、bigint)或浮点数。您不应该使用 varchar 来存储数字!
  • 我知道我只是将它作为调试尝试

标签: php codeigniter mysqli codeigniter-3


【解决方案1】:

希望对您有所帮助:

注意:设置您的字段类型int,而不是在表格中对balance 列进行类型转换

改为返回单行。你的get_balance 应该是这样的:

public function get_balance($userID)
{
  $this->db->select('balance');
  $this->db->from('users');
  $this->db->where('userID',$userID);
  $query = $this->db->get();
  if ($query->num_rows() > 0)
  {
     return $query->row()->balance;
  }

  return false;
}

您的update_balance 方法应该是这样的:

public function update_balance($userID)
{
    $balance = $this->get_balance($userID);

    $newBalance = ! empty($balance) ? ($balance - 50) : NULL;
    var_dump($newBalance);
    echo '<h1>'.$newBalance.'</h1>';

    $this->db->where("userID", $userID); 
    $this->db->update('users',['balance' => $newBalance]);
}

【讨论】:

  • Pradeep 非常感谢
  • 快乐是我快乐的编码
猜你喜欢
  • 2020-10-31
  • 2022-12-04
  • 2013-11-06
  • 2020-11-19
  • 2017-09-02
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多