奇怪的自动增量问题

时间:2015-04-19 13:46:49

标签: php mysql sql

我正在制作一个自动增量字段为BIGINT(20)的交易表。

添加新事务时,将检索插入ID并将其格式化为更具可读性:

public function add_transaction($paymethod, $cursus_id)
{
    $this->load->model('Config_model');

    $btw = $this->Config_model->get('transactions.btw');

    $query = "  INSERT INTO transacties(userid, paymethod, amount, btw_pc) 
                VALUES((SELECT userid FROM users WHERE lcase(username)=lcase('{$this->session->userdata('username')}')), 
                        '{$paymethod}',
                        (SELECT prijs FROM p_cursus_uitvoering WHERE uitvoering_id = {$cursus_id}),
                        {$btw});";

    $this->db->query($query);
    $insertId = $this->db->insert_id();

    $newCode = date('Ymd') . str_pad($insertId, 8, '0', STR_PAD_LEFT);

    $this->db->where('transact_id', $insertId);
    $this->db->update('transacties', ['transact_id' => $newCode]);

    return $newCode;
}

结果是ID从例如:5更新到2015041800000005。

这很好用,但正如你所看到的,newCode在函数中返回并被另一个函数用于另一个函数中。

以下是问题出现的地方,ID变成:201504192058506757。

即使我回显newCode,它仍会打印201504192058506757 ..即使它正确插入一次,但第二次错误插入!

编辑:

以下是调用该函数的代码段:

public function workshop(){
    $this->load->model('Inschrijven_model');
    $paymethod = $this->input->post("paymethod");
    //eigenlijk uitvoering_id.....
    $cursus_id = $this->input->post("cursus_id");
    if($paymethod == null || $cursus_id == null){
        redirect('cursus');
    }
    if($this->Inschrijven_model->cursus_has_room($cursus_id)){
        if(!$this->Inschrijven_model->cursus_ingeschreven($cursus_id)){
            $this->load->model('Cc_payment_model');
            $this->load->model('Cursus_model');
            $amount = $this->Cursus_model->get_price($cursus_id);

            $orderId = $this->Cc_payment_model->add_transaction($paymethod, $cursus_id);
            $this->Inschrijven_model->cursus_inschrijven($cursus_id,$orderId);


            $function = explode('_',$paymethod);
            $this->{$function[0]}($function[1], $amount, $orderId);

        }else{
            echo "Al ingeschreven";
        }
    }else{
        echo "geen ruimte";
    }
}

以下是重新插入返回$newCode的代码段:

public function cursus_inschrijven($cursus_id,$transaction_id){
    $query = "  INSERT INTO p_cursus_in(uitvoering_id, userid, transact_id)
                VALUES({$cursus_id},(SELECT userid FROM users WHERE lcase(username)=lcase('{$this->session->userdata('username')}')),{$transaction_id})";
    $this->db->query($query);
}

重新插入,以便我可以在某人注册课程和他们为该课程付款之间建立联系。

1 个答案:

答案 0 :(得分:1)

在进入PHP之前,你必须将BIGINT转换为字符串

以下是如何使用SQL语句转换它: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert

我不知道你正在使用什么框架,但是如果你正在使用BIGINT,那么你必须进行转换,而BIGINT的长度不受PHP直接支持。似乎框架将在更新后读取记录以检查操作是否成功完成,并且由于没有转换的读取过程,您的编号错误。

您还可以使用PHP GMP模块来处理BIGINT: https://php.net/manual/en/book.gmp.php