先让欢迎页亮起来:ci 3.x放htdocs/myapp并访问localhost/myapp,ci 4.x入口在public/需访问localhost/myapp/public;php版本必须匹配(ci3需5.6–7.4,ci4需8.0+);base_url须带尾斜杠;数据库用utf8mb4;多语言路由须显式定义且置于通配符之前。

想用CodeIgniter搭个能跑起来的PHP网站,却卡在解压后打不开欢迎页、改完配置还是404、数据库连不上报错——这篇指南只讲你动手时真正会踩的坑,从解压那一刻开始,每一步都标出错误高发点。
环境启动阶段:先让欢迎页亮起来
下载CI 4.5.3(当前最新稳定版)或CI 3.1.13,解压后【必须放在Web根目录下,例如XAMPP的htdocs/myapp或/var/www/html/myapp】,桌面或文档目录里双击打开毫无意义。
访问 http://localhost/myapp/ ——如果看到空白页或500错误,【90%是PHP版本不匹配】:CI 3.x仅支持PHP 5.6–7.4,CI 4.x最低需PHP 8.0,别用PHP 8.3+硬跑CI 3。
CI 4用户注意:入口文件index.php不在项目根目录,而在public/子目录里。浏览器地址必须写成 http://localhost/myapp/public/,否则必然404且错误提示不明确。
CI 3用户直接访问 http://localhost/myapp/ 即可,但要立刻修改 application/config/config.php 中的 $config['base_url'],填入完整URL并带末尾斜杠,例如 $config['base_url'] = 'http://localhost/myapp/';——漏掉会导致CSS/JS全挂、链接跳转失效。
MVC通路验证:控制器到视图不能断
方法一:静态页面输出(最简验证)
在 application/controllers/ 下新建 Home.php:
<?php defined('BASEPATH') OR exit('No direct script access allowed');<br>class Home extends CI_Controller {<br> public function index() {<br> $this->load->view('home_view');<br> }<br>}
再在 application/views/ 下建 home_view.php,写
<h1>Hello from CI!</h1>。访问 http://localhost/myapp/index.php/home,能看到标题才算控制器→视图链路打通。
方法二:动态传值(后续所有页面依赖此步)
改 Home.php 的 index() 方法:
$data['title'] = '我的首条新闻';<br>$data['content'] = '这是正文内容,发布于'.date('Y-m-d');<br>$this->load->view('home_view', $data);
对应 home_view.php 里写
<h2>= $title ?></h2>
<p>= $content ?></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2515" title="CodeIgniter 4.7.0"><img
src="https://img.php.cn/upload/manual/001/503/042/6a6b043218cde750.png" alt="CodeIgniter 4.7.0" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/gongju/2515" title="CodeIgniter 4.7.0" class="overflowclass">CodeIgniter 4.7.0</a>
<p class="overflowclass">CodeIgniter下载页提供 CodeIgniter 4.7.0 官方源码包,并整理框架安装、数据库配置与入门开发说明。</p>
</div>
<a rel="nofollow" href="/xiazai/gongju/2515" title="CodeIgniter 4.7.0" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>。这步不做,后面所有带变量的页面都会变白板——框架不会自动帮你提取数组键名当变量名。
数据库连通实操:从创建库到查出数据
第一步:确认MySQL服务已运行,用phpMyAdmin或命令行创建名为 ci_demo 的数据库,字符集选 utf8mb4,排序规则选 utf8mb4_unicode_ci——用latin1或utf8会存中文乱码,且后期无法回退修复。
第二步:编辑 application/config/database.php(CI 3)或 app/Config/Database.php(CI 4),填入本地凭证:
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'ci_demo',
'dbdriver' => 'mysqli'。
第三步:在控制器里加一行测试代码:print_r($this->db->list_tables());
放在 index() 方法里,访问页面若输出空数组或报错,说明连接失败;若输出表名列表,证明数据库已通。
多语言路由避坑:/zh/home 不是默认就能用的
CodeIgniter 4 不会自动识别 /zh/home 中的 zh 是语言码——它只当普通URI段处理。没在 Routes.php 里明确定义,就直接404。
方法一:显式注册每条语言路由(推荐新手)
在 app/Config/Routes.php 中添加:
$routes->get('/zh/home', 'Home::index');<br>$routes->get('/en/home', 'Home::index');<br>$routes->get('/zh/about', 'Page::about');<br>$routes->get('/en/about', 'Page::about');
【所有带语言前缀的路由必须放在通配符路由之前】,比如 $routes->get('(:any)', 'Fallback::handle'); 这类规则必须写在最后,否则 /zh/home 会被通配符吃掉,语言参数根本传不到业务逻辑里。
方法二:手动提取语言参数
加一条高优先级路由:$routes->get('/(:any)/(:any)', 'LanguageRouter::route/$1/$2');
然后在 app/Controllers/LanguageRouter.php 中解析 $1(语言码)、$2(路径),再转发调用真实控制器——这需要你自行实现分发逻辑,新手慎用。
切记:CI4默认禁用自动路由,即使控制器方法写成 public function index(string $lang = 'zh'),框架也不会从URL自动注入 $lang 参数。必须在路由定义中显式传参,例如 $routes->get('/zh/contact', 'Contact::show/zh');,同时确保 Contact.php 的 show() 方法签名接收该参数。










