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 INTOsupplier(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'); } }
错误原因
- 视图HTML语法错误:textarea标签的默认值被错误地作为属性写入,导致表单结构异常,可能影响字段提交;
- 模型未做字段检查:直接访问
$post['supp'],当字段未正常提交时触发Undefined index错误; - 表单验证缺失:仅依赖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>"; } }
验证效果
- 提交空表单时,浏览器和后端会双重拦截,提示必填字段;
- 有效数据提交后,模型能正确获取所有字段,无Undefined index错误;
- 数据库插入时
name字段不会为空,解决1048约束错误。
内容的提问来源于stack exchange,提问作者Matthew Ghani
相关产品推荐
相关产品推荐

