友情链接数据应存于自定义表中,常见字段为url、name、sort、status;控制器须用db::name()查status=1的数据并assign给$footer_links;模板用{volist}标签安全渲染,注意表前缀、缓存、存储引擎一致性。

友情链接数据该存在哪张表里
别硬套“friendlink”或“links”这种名字,TP5.0没约定俗成的表名。你得先确认数据库里有没有这张表,以及字段是否合理。常见字段包括 url、name、sort(排序)、status(是否启用),status 必须有,否则上线后可能莫名不显示。
如果表还没建,建议用迁移命令或手动建表,字段类型别用 TEXT 存 URL,用 VARCHAR(255) 更稳妥;sort 建议设为 INT UNSIGNED DEFAULT 0,避免负数干扰排序逻辑。
控制器里怎么查出友情链接并传给模板
别在模板里直接写 Db::name('link')→select() —— 违反 MVC,也难调试。统一在控制器处理:
- 确保
application/database.php配置正确,尤其database和prefix字段不能为空,否则Db::name()会静默失败,返回空数组也不报错 - 查数据时加状态过滤:
Db::name('link')->where('status', 1)->order('sort ASC')->select(),漏掉where('status', 1)是首页链接消失最常见的原因 - 别用
find(),它只返回一条,友情链接肯定是多条,必须用select() - 赋值给模板变量时,变量名别用
$links这种泛称,推荐$footer_links或$common_links,避免和导航栏、侧边栏等其他链接变量冲突
模板里怎么安全渲染友情链接
ThinkPHP5.0 模板默认关闭 PHP 代码执行,所以不能写 <?php foreach(...) ?>。必须用内置标签:
{volist name="footer_links" id="link"}
<a href="%7B%24link.url%7D" target="_blank">{$link.name}</a>
{/volist}
注意三点:
-
name属性必须和控制器里$this->assign('footer_links', $data)的键名一致,大小写敏感 - 如果
url字段可能为空或非法,加判断:<a href="%7B:htmlspecialchars(%24link.url)%7Cdefault='javascript:void(0)'%7D"></a>,防止 XSS 或跳转异常 - 别漏
target="_blank",否则用户点开后就离开你站了;同时建议加上rel="noopener"防止安全漏洞
为什么本地能显示、上线后没了
大概率是缓存或环境配置问题,不是代码逻辑错误:
- 检查
runtime/cache/目录权限是否可写,TP5.0 模板编译缓存失败时不会提示,但会导致 volist 标签不解析,页面空白 - 确认线上数据库表前缀和
database.php中的prefix一致,比如本地是think_,线上是tp5_,但代码里写了Db::name('link'),就会查tp5_link表——而你实际建的是think_link - 开启调试模式(
app_debug = true)后看日志,重点查runtime/log/下当天的 log 文件,搜索link或Empty dataset关键词
最隐蔽的坑:友情链接表用了 MyISAM 引擎,而线上 MySQL 默认禁用它,查询会静默返回空。换成 InnoDB 就行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











