新手用codeigniter搭建商城常因框架机制不熟导致上线出问题,典型坑包括:路由404(需配默认控制器及文件规范)、表单入库失败(须用input类、设allowedfields、密码哈希)、登录态丢失(session路径可写、手动set、方法内判存)、库存超卖(禁用select+update、改用原子sql或行锁)。

新手用 CodeIgniter 搭建商城类项目,最常卡在“功能能跑通,但上线就出问题”——表面是代码写错了,根子其实是框架机制没吃透、业务逻辑和框架约束没对齐。下面这些坑,90% 的初学者都踩过,而且往往反复踩。
路由与URL访问不匹配,首页直接404
刚建好项目,访问 http://localhost/shop 就报 “404 Page Not Found”,不是服务器没启,而是 CodeIgniter 默认不认裸路径。
- 确认
application/config/routes.php中设置了默认控制器,比如:$route['default_controller'] = 'home'; - 检查
application/controllers/Home.php是否存在,且类名严格为class Home extends CI_Controller(CI4 是Controller),文件名首字母大写、无空格 - 想去掉 URL 中的
index.php?光写 .htaccess 不够,必须开启 Apache 的mod_rewrite,并在application/config/config.php中把$config['index_page'] = '';,同时确保$config['uri_protocol']设置为REQUEST_URI或QUERY_STRING
表单提交后数据插不进数据库
注册页填完点提交,页面刷新但用户没新增——问题常出在数据获取、验证或模型配置上。
- 别直接用
$_POST,统一用$this->input->post('email')获取,它自带 XSS 过滤 - CI4 的模型必须显式声明可写字段:
protected $allowedFields = ['username', 'email', 'password'];,漏写一个字段,整条记录都不会入库 - 密码不能明文存:控制器里要先
password_hash($pwd, PASSWORD_DEFAULT),再传给模型;数据库字段类型得是VARCHAR(255),太短会截断哈希值 - 插入前建议加简单验证:
if (!$this->validation->run()) { return $this->load->view('register', ['errors' => $this->validation->getErrors()]); }
登录状态无法跨页面保持
用户登进去了,点“我的订单”又跳回登录页——Session 没配稳,或者调用时机不对。
- CI4 默认用
CodeIgniter\Session\Handlers\FileHandler,确保app/Config/Session.php中$sessionDriver和$sessionSavePath可写(比如设为WRITEPATH . 'session') - 登录成功后,必须手动写入 session:
$this->session->set('user_id', $user['id']);,不能只存在局部变量里 - 每次需要判断登录态的地方(比如订单控制器),开头加:
if (! $this->session->has('user_id')) { return redirect()->to('/login'); } - 别在构造函数里直接读 session —— CI4 控制器构造时 session 可能还没初始化,放到具体方法里更稳妥
商品库存扣减出现超卖
秒杀或并发下单时,两个请求同时读到“库存=1”,都判定可以下单,结果库存变 -1——这是典型的竞态条件,框架不帮你解决,得自己加锁或校验。
- 别在 PHP 层靠
SELECT + UPDATE两步走:先查库存,再扣减,中间可能被其他请求插队 - 用原子操作:在模型中执行 SQL 直接扣减并检查影响行数,例如:
$builder->where('id', $product_id)->where('stock > 0')->set('stock', 'stock - 1', FALSE)->update('products');,再用$this->db->affectedRows()判断是否更新成功 - 高并发场景下,建议搭配数据库行级锁(如
SELECT ... FOR UPDATE),或引入 Redis 做分布式库存预占
不复杂,但容易忽略细节。踩坑本身不可怕,关键是知道哪一步该盯住什么机制——CodeIgniter 不是黑盒,它每一步行为都有依据,看清底层逻辑,商城功能就能稳着落地。











