php - 数据库类型 int 使用值进行计算

标签 php codeigniter mysqli codeigniter-3

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

问题

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

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

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

游戏模型

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');

    }

游戏 Controller

//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);
        }

我做了什么

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

最后我尝试了类型转换,如您在上面的代码中所见,但它仍然产生错误的结果。

我得到的结果

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

非常感谢任何帮助。

更新:

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

更新 2:

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

Severity: Notice Message: Array to string conversion Filename: models/Games_model.php Line Number: 130

更新 3

var_dump() 方法 get_balance()

array (size=1) 0 => object(stdClass)[41] public 'balance' => string '-49' (length=3)

最佳答案

希望这对您有帮助:

注意:设置你的字段类型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]);
}

关于php - 数据库类型 int 使用值进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50780151/

相关文章:

php - 无法访问字符串变量的属性

php - CodeIgniter - 为什么使用 xss_clean

php - Codeigniter:嵌套 View 中的逻辑

php - mysqli_result::free 增加 php 内存使用

php - MySQLi bind_param UPDATE 不适用于空值

php - 如何从ios正确上传大文件?

php - 在 php 中长时间运行的全局计时器

PHP mkdir() :Permission denied

php - 将模块添加到 bonfire 中的新上下文中

php - 如果在循环中使用 MySQLi 准备语句,我什么时候调用 bind_param?