我正在制作一个自动增量字段为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);
}
重新插入,以便我可以在某人注册课程和他们为该课程付款之间建立联系。
答案 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