codeigniter4 / CodeIgniter4

Open Source PHP Framework (originally from EllisLab)
https://codeigniter.com/
MIT License
5.35k stars 1.9k forks source link

Bug: $db->insertID() causes error after upgrading 4.1.5 #5329

Closed fransiti closed 2 years ago

fransiti commented 2 years ago

PHP Version

7.4

CodeIgniter4 Version

4.1.5

Which operating systems have you tested for this bug?

Windows

Which server did you use?

apache

Database

Mysql

What happened?

Hi, Team any problem with upgrade version 4.1.4 to 4.1.5 cannot using $db->insertID();

if using 4.1.4 we can do it but after upgrade Error

{
    "title": "CodeIgniter\\Database\\Exceptions\\DatabaseException",
    "type": "CodeIgniter\\Database\\Exceptions\\DatabaseException",
    "code": 500,
    "message": "You must set the database table to be used with your query.",
    "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\Database\\BaseConnection.php",
    "line": 849,
    "trace": [
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\Model.php",
            "line": 545,
            "function": "table",
            "class": "CodeIgniter\\Database\\BaseConnection",
            "type": "->",
            "args": [
                null
            ]
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\Model.php",
            "line": 717,
            "function": "builder",
            "class": "CodeIgniter\\Model",
            "type": "->",
            "args": []
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\app\\Modules\\Frontend\\Controllers\\Export\\DeliveryOrder.php",
            "line": 262,
            "function": "__call",
            "class": "CodeIgniter\\Model",
            "type": "->",
            "args": [
                "insertID",
                []
            ]
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\CodeIgniter.php",
            "line": 824,
            "function": "store",
            "class": "App\\Modules\\Frontend\\Controllers\\Export\\DeliveryOrder",
            "type": "->",
            "args": []
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\CodeIgniter.php",
            "line": 410,
            "function": "runController",
            "class": "CodeIgniter\\CodeIgniter",
            "type": "->",
            "args": [
                {
                    "security": {},
                    "validation": {},
                    "email": {
                        "archive": null,
                        "fromEmail": null,
                        "fromName": null,
                        "userAgent": "CodeIgniter",
                        "mailPath": "/usr/sbin/sendmail",
                        "protocol": "mail",
                        "SMTPHost": "",
                        "SMTPUser": "",
                        "SMTPPass": "",
                        "SMTPPort": 25,
                        "SMTPTimeout": 5,
                        "SMTPKeepAlive": false,
                        "SMTPCrypto": "tls",
                        "wordWrap": true,
                        "wrapChars": 76,
                        "mailType": "text",
                        "charset": "UTF-8",
                        "altMessage": "",
                        "validate": false,
                        "priority": 3,
                        "newline": "\r\n",
                        "CRLF": "\r\n",
                        "DSN": false,
                        "sendMultipart": true,
                        "BCCBatchMode": false,
                        "BCCBatchSize": 200
                    },
                    "global": {
                        "pager": null
                    },
                    "users": {
                        "pager": null
                    },
                    "master": {
                        "pager": null
                    },
                    "deliveryorder": {
                        "pager": null
                    }
                }
            ]
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\CodeIgniter.php",
            "line": 318,
            "function": "handleRequest",
            "class": "CodeIgniter\\CodeIgniter",
            "type": "->",
            "args": [
                null,
                {
                    "handler": "file",
                    "backupHandler": "dummy",
                    "storePath": "D:\\Project\\Codeigniter\\blgroup\\writable\\cache/",
                    "cacheQueryString": false,
                    "prefix": "",
                    "ttl": 60,
                    "file": {
                        "storePath": "D:\\Project\\Codeigniter\\blgroup\\writable\\cache/",
                        "mode": 416
                    },
                    "memcached": {
                        "host": "127.0.0.1",
                        "port": 11211,
                        "weight": 1,
                        "raw": false
                    },
                    "redis": {
                        "host": "127.0.0.1",
                        "password": null,
                        "port": 6379,
                        "timeout": 0,
                        "database": 0
                    },
                    "validHandlers": {
                        "dummy": "CodeIgniter\\Cache\\Handlers\\DummyHandler",
                        "file": "CodeIgniter\\Cache\\Handlers\\FileHandler",
                        "memcached": "CodeIgniter\\Cache\\Handlers\\MemcachedHandler",
                        "predis": "CodeIgniter\\Cache\\Handlers\\PredisHandler",
                        "redis": "CodeIgniter\\Cache\\Handlers\\RedisHandler",
                        "wincache": "CodeIgniter\\Cache\\Handlers\\WincacheHandler"
                    }
                },
                false
            ]
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\public\\index.php",
            "line": 37,
            "function": "run",
            "class": "CodeIgniter\\CodeIgniter",
            "type": "->",
            "args": []
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\Commands\\Server\\rewrite.php",
            "line": 43,
            "args": [
                "D:\\Project\\Codeigniter\\blgroup\\public\\index.php"
            ],
            "function": "require_once"
        }
    ]
} 

Steps to Reproduce

public function store()
    {
        $deliveryorder = new DeliveryOrderModel();
        $validation = $this->validation;

        $global = $this->global;
        $user = $this->users;
        $branch = $global->find_branch(session()->get('branch'));
        $member = $user->find_member(session()->get('id'));

        if ($this->request->getVar('action'))
        {
            $do_date_error = '';
            $do_etd_error = '';
            $do_pol_error = '';
            $do_pod_error = '';
            $do_vessel_error = '';
            $do_voyage_error = '';
            $error = 'no';
            $success = 'no';
            $message = '';
            $token = '';
            $kodelast = '';

            $error = $this->validate([
                'do_date'   => 'required',
                'do_etd'    => 'required',
                'do_pol'    => 'required',
                'do_pod'    => 'required',
                'do_vessel' => 'required',
                'do_voyage' => 'required',
            ]);

            if (!$error)
            {
                $error = 'yes';

                if ($validation->getError('do_date'))
                {
                    $do_date_error = $validation->getError('do_date');
                }

                if ($validation->getError('do_etd'))
                {
                    $do_etd_error = $validation->getError('do_etd');
                }

                if ($validation->getError('do_pol'))
                {
                    $do_pol_error = $validation->getError('do_pol');
                }

                if ($validation->getError('do_pod'))
                {
                    $do_pod_error = $validation->getError('do_pod');
                }

                if ($validation->getError('do_vessel'))
                {
                    $do_vessel_error = $validation->getError('do_vessel');
                }

                if ($validation->getError('do_voyage'))
                {
                    $do_voyage_error = $validation->getError('do_voyage');
                }

                $token = csrf_field();

            } else {
                if ($this->request->getVar('action') == 'tambahdo') {

                    //check last do
                    $getlastcode = $deliveryorder->find_last_id();
                    $ambillastcode = $getlastcode + 1;

                    //check code double
                    $check_double_code = $deliveryorder->find_deliveryorder_by_code($ambillastcode);
                    if ($check_double_code)
                    {
                        $ambilterakhircodedo = $check_double_code + 1;
                    } else {
                        $ambilterakhircodedo = $ambillastcode;
                    }

                    $data = [
                        'user_id' => session()->get('id'),
                        'company_id' => session()->get('company'),
                        'branch_id' => session()->get('branch'),
                        'do_periode' => session()->get('periode'),
                        'depo_id' => $this->request->getVar('depo_id'),
                        'principal_id' => $this->request->getVar('principal_id'),
                        'shipper_id' => $this->request->getVar('shipper_id'),
                        'do_code' => $ambilterakhircodedo,
                        'do_date' => $this->request->getVar('do_date'),
                        'do_etd' => $this->request->getVar('do_etd'),
                        'do_pol' => $this->request->getVar('do_pol'),
                        'do_pod' => $this->request->getVar('do_pod'),
                        'do_vessel' => $this->request->getVar('do_vessel'),
                        'do_voyage' => $this->request->getVar('do_voyage'),
                        'do_volume_qty_20' => $this->request->getVar('do_volume_qty_20'),
                        'do_volume_eqp_20' => $this->request->getVar('do_volume_eqp_20'),
                        'do_volume_qty_40' => $this->request->getVar('do_volume_qty_40'),
                        'do_volume_eqp_40' => $this->request->getVar('do_volume_eqp_40'),
                        'do_berlaku' => $this->request->getVar('do_berlaku'),
                        'do_closing' => $this->request->getVar('do_closing'),
                        'do_container_desc' => $this->request->getVar('do_container_desc'),
                        'do_terminal' => $this->request->getVar('do_terminal'),
                        'do_commodity' => $this->request->getVar('do_commodity'),
                        'do_description' => $this->request->getVar('do_description'),
                        'do_services' => $this->request->getVar('do_services'),
                        'do_status' => 1,
                        'do_print' => 0,
                    ];

                    $messages = 'Pada ' . hari_ini() . ' ' . date('d F, Y').' Member '.$member->user_fullname.' <br> Perusahaan ' .$branch->company_name. ' Cab. '. $branch->branch_name .' melakukan aktivitas Tambah Data Export DO - Delivery Order <br>IP Server ' . getClientIpAddress();

                    //monitor 
                    $data_monitor = [
                        'user_id' => session()->get('id'),
                        'company_id' => session()->get('company'),
                        'branch_id' => session()->get('branch'),
                        'monitor_name' => $member->user_fullname. ' Tambah Data Export DO Delivery Order',
                        'monitor_color' => 'bg-success',
                        'monitor_icon' => 'fas fa-plus-circle',
                        'monitor_content' => $messages,
                        'monitor_status' => 1
                    ];

                    $deliveryorder->insert_deliveryorder($data);
                    $getkodeterakhir = $deliveryorder->insertID();
                    $global->insert_monitor($data_monitor);

                    $success = 'yes';
                    $message = 'DO - Delivery Order Berhasil';
                    $token = csrf_field();
                    $kodelast = $getkodeterakhir;

                } elseif ($this->request->getVar('action') == 'updatedo') {

                    $do_id = $this->request->getVar('do_id');

                    $data = [
                        'do_id' => $this->request->getVar('do_id'),
                        'depo_id' => $this->request->getVar('depo_id'),
                        'principal_id' => $this->request->getVar('principal_id'),
                        'shipper_id' => $this->request->getVar('shipper_id'),
                        'do_date' => $this->request->getVar('do_date'),
                        'do_etd' => $this->request->getVar('do_etd'),
                        'do_pol' => $this->request->getVar('do_pol'),
                        'do_pod' => $this->request->getVar('do_pod'),
                        'do_vessel' => $this->request->getVar('do_vessel'),
                        'do_voyage' => $this->request->getVar('do_voyage'),
                        'do_volume_qty_20' => $this->request->getVar('do_volume_qty_20'),
                        'do_volume_eqp_20' => $this->request->getVar('do_volume_eqp_20'),
                        'do_volume_qty_40' => $this->request->getVar('do_volume_qty_40'),
                        'do_volume_eqp_40' => $this->request->getVar('do_volume_eqp_40'),
                        'do_berlaku' => $this->request->getVar('do_berlaku'),
                        'do_closing' => $this->request->getVar('do_closing'),
                        'do_container_desc' => $this->request->getVar('do_container_desc'),
                        'do_terminal' => $this->request->getVar('do_terminal'),
                        'do_commodity' => $this->request->getVar('do_commodity'),
                        'do_description' => $this->request->getVar('do_description'),
                        'do_services' => $this->request->getVar('do_services'),
                    ];

                    $messages = 'Pada ' . hari_ini() . ' ' . date('d F, Y').' Member '.$member->user_fullname.' <br> Perusahaan ' .$branch->company_name. ' Cab. '. $branch->branch_name .' melakukan aktivitas UPDATE Data Export DO - Delivery Order ID '.$do_id.' <br>IP Server ' . getClientIpAddress();

                    //monitor 
                    $data_monitor = [
                        'user_id' => session()->get('id'),
                        'company_id' => session()->get('company'),
                        'branch_id' => session()->get('branch'),
                        'monitor_name' => $member->user_fullname. ' Tambah Data Export DO Delivery Order',
                        'monitor_color' => 'bg-success',
                        'monitor_icon' => 'fas fa-plus-circle',
                        'monitor_content' => $messages,
                        'monitor_status' => 1
                    ];

                    $deliveryorder->update_deliveryorder($data, $do_id);
                    $global->insert_monitor($data_monitor);

                    $success = 'yes';
                    $message = 'Revisi DO - Delivery Order Berhasil';
                    $token = csrf_field();

                } elseif ($this->request->getVar('action') == 'deletedo') {

                     $do_id = $this->request->getVar('do_id');

                    $data = [
                        'do_id' => $this->request->getVar('do_id'),
                        'do_date' => $this->request->getVar('do_date'),
                        'do_etd' => $this->request->getVar('do_etd'),
                        'do_pol' => $this->request->getVar('do_pol'),
                        'do_pod' => $this->request->getVar('do_pod'),
                        'do_vessel' => $this->request->getVar('do_vessel'),
                        'do_voyage' => $this->request->getVar('do_voyage'),
                        'do_status' => 2,
                    ];

                    $messages = 'Pada ' . hari_ini() . ' ' . date('d F, Y').' Member '.$member->user_fullname.' <br> Perusahaan ' .$branch->company_name. ' Cab. '. $branch->branch_name .' melakukan aktivitas cancel Export DO - Delivery Order ID '.$do_id.' <br>IP Server ' . getClientIpAddress();

                    //monitor 
                    $data_monitor = [
                        'user_id' => session()->get('id'),
                        'company_id' => session()->get('company'),
                        'branch_id' => session()->get('branch'),
                        'monitor_name' => $member->user_fullname. ' Tambah Data Export DO Delivery Order',
                        'monitor_color' => 'bg-success',
                        'monitor_icon' => 'fas fa-plus-circle',
                        'monitor_content' => $messages,
                        'monitor_status' => 1
                    ];

                    $deliveryorder->update_deliveryorder($data, $do_id);
                    $global->insert_monitor($data_monitor);

                    $success = 'yes';
                    $message = 'Cancel DO - Delivery Order Berhasil';
                    $token = csrf_field();

                }
            }

            $output = [
               'do_date_error'      => $do_date_error, 
               'do_etd_error'       => $do_etd_error, 
               'do_pol_error'       => $do_pol_error, 
               'do_pod_error'       => $do_pod_error, 
               'do_vessel_error'    => $do_vessel_error, 
               'do_voyage_error'    => $do_voyage_error, 
               'error'              => $error, 
               'success'            => $success, 
               'message'            => $message, 
               'token'              => $token, 
               'kodelast'           => $kodelast
            ];

            echo json_encode($output);
        }
    }
}

Expected Output

{
    "title": "CodeIgniter\\Database\\Exceptions\\DatabaseException",
    "type": "CodeIgniter\\Database\\Exceptions\\DatabaseException",
    "code": 500,
    "message": "You must set the database table to be used with your query.",
    "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\Database\\BaseConnection.php",
    "line": 849,
    "trace": [
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\Model.php",
            "line": 545,
            "function": "table",
            "class": "CodeIgniter\\Database\\BaseConnection",
            "type": "->",
            "args": [
                null
            ]
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\Model.php",
            "line": 717,
            "function": "builder",
            "class": "CodeIgniter\\Model",
            "type": "->",
            "args": []
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\app\\Modules\\Frontend\\Controllers\\Export\\DeliveryOrder.php",
            "line": 262,
            "function": "__call",
            "class": "CodeIgniter\\Model",
            "type": "->",
            "args": [
                "insertID",
                []
            ]
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\CodeIgniter.php",
            "line": 824,
            "function": "store",
            "class": "App\\Modules\\Frontend\\Controllers\\Export\\DeliveryOrder",
            "type": "->",
            "args": []
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\CodeIgniter.php",
            "line": 410,
            "function": "runController",
            "class": "CodeIgniter\\CodeIgniter",
            "type": "->",
            "args": [
                {
                    "security": {},
                    "validation": {},
                    "email": {
                        "archive": null,
                        "fromEmail": null,
                        "fromName": null,
                        "userAgent": "CodeIgniter",
                        "mailPath": "/usr/sbin/sendmail",
                        "protocol": "mail",
                        "SMTPHost": "",
                        "SMTPUser": "",
                        "SMTPPass": "",
                        "SMTPPort": 25,
                        "SMTPTimeout": 5,
                        "SMTPKeepAlive": false,
                        "SMTPCrypto": "tls",
                        "wordWrap": true,
                        "wrapChars": 76,
                        "mailType": "text",
                        "charset": "UTF-8",
                        "altMessage": "",
                        "validate": false,
                        "priority": 3,
                        "newline": "\r\n",
                        "CRLF": "\r\n",
                        "DSN": false,
                        "sendMultipart": true,
                        "BCCBatchMode": false,
                        "BCCBatchSize": 200
                    },
                    "global": {
                        "pager": null
                    },
                    "users": {
                        "pager": null
                    },
                    "master": {
                        "pager": null
                    },
                    "deliveryorder": {
                        "pager": null
                    }
                }
            ]
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\CodeIgniter.php",
            "line": 318,
            "function": "handleRequest",
            "class": "CodeIgniter\\CodeIgniter",
            "type": "->",
            "args": [
                null,
                {
                    "handler": "file",
                    "backupHandler": "dummy",
                    "storePath": "D:\\Project\\Codeigniter\\blgroup\\writable\\cache/",
                    "cacheQueryString": false,
                    "prefix": "",
                    "ttl": 60,
                    "file": {
                        "storePath": "D:\\Project\\Codeigniter\\blgroup\\writable\\cache/",
                        "mode": 416
                    },
                    "memcached": {
                        "host": "127.0.0.1",
                        "port": 11211,
                        "weight": 1,
                        "raw": false
                    },
                    "redis": {
                        "host": "127.0.0.1",
                        "password": null,
                        "port": 6379,
                        "timeout": 0,
                        "database": 0
                    },
                    "validHandlers": {
                        "dummy": "CodeIgniter\\Cache\\Handlers\\DummyHandler",
                        "file": "CodeIgniter\\Cache\\Handlers\\FileHandler",
                        "memcached": "CodeIgniter\\Cache\\Handlers\\MemcachedHandler",
                        "predis": "CodeIgniter\\Cache\\Handlers\\PredisHandler",
                        "redis": "CodeIgniter\\Cache\\Handlers\\RedisHandler",
                        "wincache": "CodeIgniter\\Cache\\Handlers\\WincacheHandler"
                    }
                },
                false
            ]
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\public\\index.php",
            "line": 37,
            "function": "run",
            "class": "CodeIgniter\\CodeIgniter",
            "type": "->",
            "args": []
        },
        {
            "file": "D:\\Project\\Codeigniter\\blgroup\\vendor\\codeigniter4\\framework\\system\\Commands\\Server\\rewrite.php",
            "line": 43,
            "args": [
                "D:\\Project\\Codeigniter\\blgroup\\public\\index.php"
            ],
            "function": "require_once"
        }
    ]
}

Anything else?

No response

kenjis commented 2 years ago

@fransiti Thank you for reporting.

But your code is too long and complex. If you can, please show us the minimum code to reproduce the error. And you did not show your Model code that is important to your error. We cannot reproduce the error.

fransiti commented 2 years ago

hai kenji sorry about long code and this Code from Model

class DeliveryOrderModel extends Model
{
    function find_deliveryorder()
    {
        $builder = $this->db->query("SELECT do.*, cp.company_name, bc.branch_name, us.user_fullname, dp.depo_code, dp.depo_perusahaan, pr.principal_code, pr.principal_perusahaan, sp.shipper_code, sp.shipper_perusahaan 
        FROM export_do do
        LEFT JOIN company cp ON do.company_id = cp.company_id
        LEFT JOIN branch bc ON do.branch_id = bc.branch_id
        LEFT JOIN users us ON do.user_id = us.user_id
        LEFT JOIN master_depo dp ON do.depo_id = dp.depo_id
        LEFT JOIN master_principal pr ON do.principal_id = pr.principal_id
        LEFT JOIN master_shipper sp ON do.shipper_id = sp.shipper_id
        WHERE do.company_id = '".session()->get('company')."' AND do.branch_id = '".session()->get('branch')."' AND do.do_periode = '".session()->get('periode')."' AND do.do_status = 1 ");

        return $builder->getResult();
    }

    function find_deliveryorder_by_id($id)
    {
        $builder = $this->db->query("SELECT do.*, cp.company_name, bc.branch_name, dp.depo_code, dp.depo_perusahaan, pr.principal_code, pr.principal_perusahaan, sp.shipper_code, sp.shipper_perusahaan 
        FROM export_do do
        LEFT JOIN company cp ON do.company_id = cp.company_id
        LEFT JOIN branch bc ON do.branch_id = bc.branch_id
        LEFT JOIN master_depo dp ON do.depo_id = dp.depo_id
        LEFT JOIN master_principal pr ON do.principal_id = pr.principal_id
        LEFT JOIN master_shipper sp ON do.shipper_id = sp.shipper_id
        WHERE do.do_id = '".$id."'");

        return $builder->getRow();
    }

    function find_last_id()
    {
        $builder = $this->db->query("SELECT COUNT(do_code) AS totLast FROM export_do WHERE company_id = '".session()->get('company')."' AND branch_id = '".session()->get('branch')."' AND do_periode = '".session()->get('periode')."' AND do_status = 1 ");
        return $builder->getRow()->totLast;
    }

    function find_deliveryorder_by_code($code)
    {
        $builder = $this->db->query("SELECT do_code FROM export_do WHERE do_code = '".$code."' AND company_id = '".session()->get('company')."' AND branch_id = '".session()->get('branch')."' AND do_periode = '".session()->get('periode')."' AND do_status = 1");
        return $builder->getRow();
    }

    function insert_deliveryorder($data)
    {
        return $this->db->table('export_do')->insert($data);
    }

    function update_deliveryorder($data, $id)
    {
        return $this->db->table('export_do')->update($data, array('do_id' => $id));
    }

    function delete_deliveryorder($id)
    {
        return $this->db->table('export_do')->delete(array('do_id' => $id));
    }
}
kenjis commented 2 years ago

@fransiti

What if you add the $table property in your Model?

protected $table = 'export_do';
kenjis commented 2 years ago

It seems #5139 causes this error.

fransiti commented 2 years ago

Ok Thank @kenjis