You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeIgniter供应商模块报错求助:PHP未定义索引与数据库非空约束错误

CodeIgniter供应商模块报错修复方案

报错信息

PHP错误

严重程度:通知
消息:Undefined index: supp
文件路径:models/Supplier_m.php
行号:18
回溯:
文件: C:\xampp\htdocs\sikan_v2\application\models\Supplier_m.php
行: 18 调用函数: _error_handler
文件: C:\xampp\htdocs\sikan_v2\application\controllers\Supplier.php
行: 42 调用函数: add
文件: C:\xampp\htdocs\sikan_v2\index.php 行: 315 调用函数: require_once

数据库错误

错误编号:1048
错误内容:列 'name' 不能为null
执行语句:INSERT INTO supplier (name, phone, address, description) VALUES (NULL, '81213176824', 'xa', NULL)
文件路径:C:/xampp/htdocs/sikan_v2/system/database/DB_driver.php
行号: 692
关联控制器:controllers/Supplier.php


原始代码

控制器代码(controllers/Supplier.php)

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Supplier extends CI_Controller {

    
    function __construct()
    {
        parent::__construct();
        check_not_login();
        check_admin();
        $this->load->model('supplier_m');
    
    } 


    public function index()
    {
        $data['row'] = $this->supplier_m->get();
        $this->template->load('template', 'supplier/supplier_data', $data);
    }

    public function add()
     {
        $data['row'] = $this->supplier_m->get();
        $supplier = new stdClass();
        $supplier->supplier_id = null;
        $supplier->name = null;
        $supplier->phone = null;
        $supplier->address = null;
        $supplier->description = null;
        $data = array(
            'page' => 'add',
            'row' => $supplier
        );
        $this->template->load('template', 'supplier/supplier_form', $data);
    }

    public function process()
    {
        $post = $this->input->post(null, TRUE);
        if(isset($_POST['add'])) {
            $this->supplier_m->add($post);
        }

        if($this->db->affected_rows() > 0) {
            echo "<script>alert('Data berhasil disimpan');</script>";
        }
        echo "<script>window.location='".site_url('supplier')."';</script>";
    }

    public function del($id) {
        $this->supplier_m->del($id);
        if($this->db->affected_rows() > 0) {
            echo "<script>alert('Data berhasil dihapus');</script>";
        }
        echo "<script>window.location='".site_url('supplier')."';</script>";
    }
}

视图代码(views/supplier_form.php)

<section class="content-header">
      <h1>Suppliers
        <small>Pemasok Barang</small>
      </h1>
      <ol class="breadcrumb">
        <li><a href="#"><i class="fa fa-dashboard"></i></a></li>
        <li><a href="#"></a></li>
        <li class="active">Suppliers</li>
      </ol>
    </section>

    <!-- Main content -->
    <section class="content">

    <div class="box">
        <div class="box-header">
            <h3 class="box-title">Add Supplier</h3>
            <div class="pull-right">
                <a href="<?=site_url('supplier')?>" class="btn btn-warning btn-flat">
                   <i class="fa fa-undo"></i> Back
                </a>
            </div>
         </div>
         <div class="box-body">
            <div class="row">
                <div class="col-md-4 col-md-offset-4">
                    <form action="<?=site_url('supplier/process')?>" method="post">
                        <div class="form-group">
                            <label>Supplier Name *</label>
                            <input type="text" name="supp" value="<?=$row->name?>" class="form-control" required>
                        </div>
                        <div class="form-group">
                            <label>Phone *</label>
                            <input type="number" name="phone" value="<?=$row->phone?>" class="form-control" required>
                        </div>
                        <div class="form-group">
                            <label>Address</label>
                            <textarea name="addr" class="form-control" required <?=$row->address?>></textarea>
                        </div>
                        <div class="form-group">
                            <label>Description</label>
                            <textarea name="desc" class="form-control" <?=$row->description?>></textarea>
                        </div>
                        <div class="form-group">
                            <button type="submit" name="<?=$page?>" class="btn btn-success btn-flat">
                               <i class="fa fa-paper-plane"></i> Save
                            </button>    
                            <button type="Reset" class="btn btn-flat">Reset</button>    
                        </div>
                
                    </form>

                </div>

            </div>
         </div>
         
            
    </div>

    </section> 

模型代码(models/Supplier_m.php)

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Supplier_m extends CI_Model {

    public function get($id = null)
    {
        $this->db->from('supplier');
        if($id != null) {
            $this->db->where('supplier_id', $id);
        }
        $query = $this->db->get();
        return $query;
    } 

   public function add($post)
   {
    $params = [
        'name' => $post['supp'],
        'phone' => $post['phone'],
        'address' => $post['addr'],
        'description' => empty($post['desc']) ? null : $post['desc'],
    ];
    $this->db->insert('supplier', $params);

   }

    public function del($id)
    {
        $this->db->where('supplier_id', $id);
        $this->db->delete('supplier');
    }

}

错误原因

  1. 视图HTML语法错误:textarea标签的默认值被错误地作为属性写入,导致表单结构异常,可能影响字段提交;
  2. 模型未做字段检查:直接访问$post['supp'],当字段未正常提交时触发Undefined index错误;
  3. 表单验证缺失:仅依赖HTML的required属性,未在后端做二次验证,导致空值进入数据库触发非空约束错误。

修复方案

1. 修正视图文件(views/supplier_form.php)

修复textarea标签的语法错误,将默认值放在标签内部:

<section class="content-header">
      <h1>Suppliers
        <small>Pemasok Barang</small>
      </h1>
      <ol class="breadcrumb">
        <li><a href="#"><i class="fa fa-dashboard"></i></a></li>
        <li><a href="#"></a></li>
        <li class="active">Suppliers</li>
      </ol>
    </section>

    <!-- Main content -->
    <section class="content">

    <div class="box">
        <div class="box-header">
            <h3 class="box-title">Add Supplier</h3>
            <div class="pull-right">
                <a href="<?=site_url('supplier')?>" class="btn btn-warning btn-flat">
                   <i class="fa fa-undo"></i> Back
                </a>
            </div>
         </div>
         <div class="box-body">
            <div class="row">
                <div class="col-md-4 col-md-offset-4">
                    <form action="<?=site_url('supplier/process')?>" method="post">
                        <div class="form-group">
                            <label>Supplier Name *</label>
                            <input type="text" name="supp" value="<?=$row->name?>" class="form-control" required>
                        </div>
                        <div class="form-group">
                            <label>Phone *</label>
                            <input type="number" name="phone" value="<?=$row->phone?>" class="form-control" required>
                        </div>
                        <div class="form-group">
                            <label>Address</label>
                            <textarea name="addr" class="form-control"><?=$row->address?></textarea>
                        </div>
                        <div class="form-group">
                            <label>Description</label>
                            <textarea name="desc" class="form-control"><?=$row->description?></textarea>
                        </div>
                        <div class="form-group">
                            <button type="submit" name="<?=$page?>" class="btn btn-success btn-flat">
                               <i class="fa fa-paper-plane"></i> Save
                            </button>    
                            <button type="Reset" class="btn btn-flat">Reset</button>    
                        </div>
                
                    </form>

                </div>

            </div>
         </div>
         
            
    </div>

    </section> 

2. 优化模型文件(models/Supplier_m.php)

添加字段存在性检查,避免Undefined index错误:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Supplier_m extends CI_Model {

    public function get($id = null)
    {
        $this->db->from('supplier');
        if($id != null) {
            $this->db->where('supplier_id', $id);
        }
        $query = $this->db->get();
        return $query;
    } 

   public function add($post)
   {
    // 检查并处理必填字段
    $supp_name = isset($post['supp']) ? trim($post['supp']) : '';
    if(empty($supp_name)) {
        return false;
    }

    $params = [
        'name' => $supp_name,
        'phone' => isset($post['phone']) ? $post['phone'] : '',
        'address' => isset($post['addr']) ? $post['addr'] : null,
        'description' => empty($post['desc']) ? null : $post['desc'],
    ];
    $this->db->insert('supplier', $params);
    return true;
   }

    public function del($id)
    {
        $this->db->where('supplier_id', $id);
        $this->db->delete('supplier');
    }

}

3. 添加控制器表单验证(controllers/Supplier.php)

在后端添加表单验证,提前拦截无效数据:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Supplier extends CI_Controller {

    
    function __construct()
    {
        parent::__construct();
        check_not_login();
        check_admin();
        $this->load->model('supplier_m');
        // 加载表单验证库
        $this->load->library('form_validation');
    
    } 


    public function index()
    {
        $data['row'] = $this->supplier_m->get();
        $this->template->load('template', 'supplier/supplier_data', $data);
    }

    public function add()
     {
        $supplier = new stdClass();
        $supplier->supplier_id = null;
        $supplier->name = null;
        $supplier->phone = null;
        $supplier->address = null;
        $supplier->description = null;
        $data = array(
            'page' => 'add',
            'row' => $supplier
        );
        $this->template->load('template', 'supplier/supplier_form', $data);
    }

    public function process()
    {
        // 设置表单验证规则
        $this->form_validation->set_rules('supp', 'Supplier Name', 'required|trim');
        $this->form_validation->set_rules('phone', 'Phone', 'required|trim');
        
        if($this->form_validation->run() == FALSE) {
            // 验证失败,返回表单页面
            $this->add();
        } else {
            $post = $this->input->post(null, TRUE);
            if(isset($_POST['add'])) {
                $result = $this->supplier_m->add($post);
                if($result && $this->db->affected_rows() > 0) {
                    echo "<script>alert('Data berhasil disimpan');</script>";
                } else {
                    echo "<script>alert('Gagal menyimpan data: Nama supplier tidak boleh kosong');</script>";
                }
            }
            echo "<script>window.location='".site_url('supplier')."';</script>";
        }
    }

    public function del($id) {
        $this->supplier_m->del($id);
        if($this->db->affected_rows() > 0) {
            echo "<script>alert('Data berhasil dihapus');</script>";
        }
        echo "<script>window.location='".site_url('supplier')."';</script>";
    }
}

验证效果

  1. 提交空表单时,浏览器和后端会双重拦截,提示必填字段;
  2. 有效数据提交后,模型能正确获取所有字段,无Undefined index错误;
  3. 数据库插入时name字段不会为空,解决1048约束错误。

内容的提问来源于stack exchange,提问作者Matthew Ghani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:01:33