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

CodeIgniter中constants.php全局常量数组的CRUD实现方法

解答

首先先纠正一个核心认知:PHP里用define()定义的常量一旦声明就无法在运行时修改,你现在把取消原因存在常量里,本身是没法直接做增删改操作的,必须配合存储层的修改逻辑才能实现CRUD。

一、增删改功能实现方案

首先先改你现有代码的两个明显bug:

  1. 循环输出option时,value属性填的是$reasons整个数组,应该填当前条目的key或者具体值
  2. 最后闭合标签写错了,<select>应该换成</select>,否则HTML渲染会错乱

实现CRUD有两种常见路径,优先选第一种:

  • 推荐方案:换存储介质,不要用constants存可变内容
    constants.php本身是用来存固定不变的系统常量的,存可修改的业务数据本身就不符合设计规范。
    • 最稳妥的方式是建一张简单的cancel_reasons数据库表,只需要id(主键)、content(存取消原因文本)两个字段,增删改查就是普通的数据库操作,和你项目里其他业务的CRUD逻辑完全一致,没有文件读写权限、并发写坏文件的问题,维护成本最低。
    • 如果不想用数据库,就把数组移到CodeIgniter的自定义配置文件里,比如新建application/config/cancel_config.php,直接返回数组:
      <?php
      return [
          'cancel_reasons' => [
              'Service(s) are no longer needed',
              'Choosing another company to work with',
              'Disatisfied with service(s) provided',
              'Service(s) are too expensive'
          ]
      ];
      
      读取的时候用CI自带的配置类加载就行,修改时可以通过文件操作把新的数组写回配置文件,比改constants.php的逻辑简单很多。
  • 不推荐方案:硬写文件修改constants.php
    如果你非要保留现有常量存储的形式,只能自己写文件读写逻辑:先读取constants.php的源码,用正则匹配到cancel_reasons对应的数组片段,替换成增删改后的新数组,重新拼接成合法的PHP代码再写回文件。这种方式要求给constants.php开web服务写权限,并发请求的时候很容易把文件写白导致整个项目报错,生产环境绝对不要用。

不管选哪种存储方式,前端交互逻辑都是通用的:

  1. 列表页读取所有取消原因,每条条目后面挂编辑、删除按钮,页面顶部放新增原因的输入框和提交按钮
  2. 新增:前端提交新的原因文本,后端把内容追加到存储结构里保存,刷新列表即可
  3. 编辑:点击编辑按钮回填当前内容,提交后后端找到对应条目替换文本后保存
  4. 删除:点击删除按钮传递对应条目的唯一标识,后端从存储结构里移除对应项后保存

二、传值到视图层会不会简化实现?

会,而且会简化很多。
你现在在控制器里直接拼echo HTML的写法,把业务逻辑和视图渲染完全混在一起,后续要加个按钮、改个样式、加个提交表单都要在控制器里拼字符串,不仅写起来麻烦,出了问题排查也很费劲。
把数组传到视图之后,你可以直接写原生HTML,循环输出、加表单、加JS交互都不用拼转义字符串,代码可读性高很多。
控制器只需要负责读数据、处理提交请求,视图负责渲染页面,符合CI的MVC设计规范。
举个最简单的调整示例:
控制器代码改成:

public function crudCancelConstants() {
    // 第二个参数传true,转成关联数组比stdClass对象操作更方便
    $data['reasons'] = json_decode(cancel_reasons, true);
    $this->load->view('cancel_reasons/crud_page', $data);
}

对应视图文件里直接写HTML即可:

<h5>View all cancellation reasons below:</h5>
<select>
    <option value="Select" selected>View Reasons</option>
    <?php foreach ($reasons as $key => $value): ?>
    <option value="<?php echo $key; ?>"><?php echo $value; ?></option>
    <?php endforeach; ?>
</select>
<!-- 后续加新增表单、编辑删除按钮、AJAX逻辑可以直接在这写,不用拼字符串 -->

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:21:46