织梦为何无法获取主键?

99ANYc3cd6
预计阅读时长 13 分钟
位置: 首页 织梦建站 正文
  • 无法编辑内容:在后台点击“编辑”文章或文档时,页面打不开或提示错误。
  • 无法删除内容:删除操作无效或报错。
  • 联动类别/表单无法保存:保存联动类别或自定义表单数据时失败。
  • 自定义模型功能异常:基于自定义模型添加的内容无法正常管理。

下面我将从原因分析解决方案预防措施三个方面,详细地为你解答这个问题。


问题根源分析

“无法获得主键”的根本原因在于,织梦的后台程序在执行某个操作(如编辑、删除)时,无法通过URL或其他参数正确地找到那条记录的唯一标识符(通常是 id 字段)。

主键(Primary Key)在数据库中是每条记录的“身份证号”,织梦的后台操作流程通常是:

  1. 列表页列表中,每条记录的“编辑”、“删除”等链接都附带了一个 id 参数,archives_do.php?aid=123
  2. 处理页:后台的PHP脚本(如 archives_do.php)接收到这个 id
  3. 数据库查询:脚本使用这个 id 去数据库里查找对应的记录,SELECT * FROMdede_archivesWHERE id = 123
  4. 执行操作:找到记录后,再进行编辑、删除等后续操作。

当这个链条中的任何一环断裂,就会出现“无法获得主键”的错误,常见的原因有以下几种:

URL参数缺失或错误(最常见)

这是最直接的原因,后台的“编辑”链接可能被修改过,或者模板文件被误删,导致点击后没有传递正确的 idaid (文章ID) 参数。

  • 表现:点击“编辑”按钮,浏览器地址栏的URL是 archives_do.phparchives_do.php?dopost=edit,后面没有 aid=xxx
  • 排查列表页,鼠标悬停在“编辑”链接上,查看浏览器状态栏或右键查看链接属性,确认链接中是否包含 aid= 参数。

数据库表结构问题

管理依赖于多个关联表,

  • dede_archives (主表,存储文章的基本信息,如标题、发布时间等)
  • dede_addonarticle (附加表,存储文章正文,由模型决定表名)
  • dede_arctype (栏目表)

如果这些表的结构被破坏,

  • id 字段被删除或类型改变。
  • aid (文章ID) 字段在某些表中不存在或数据不一致。
  • 数据库表与织梦的配置文件 (dede/templets/system_sysset.xml 或模型配置) 不匹配。

程序在查询时就会找不到对应的主键。

自定义模型配置错误

在使用自定义模型时,这个问题尤其高发,通常是因为:

  • 模型附加表不存在:创建模型时指定了附加表名,但该表并未在数据库中创建。
  • 字段配置错误:在模型管理中,字段的“字段名称”和数据库中的列名不一致,或者主键设置错误。
  • maintable (主表) 和 addtable (附加表) 的关联关系:织梦通过 aid 来关联这两个表。addtable 中没有 aid 字段,或者数据导入时 aid 没有正确同步,就会导致无法通过 aid 定位到附加表中的数据。

程序文件被修改或损坏

如果二次开发者修改了核心文件,archives_do.php,可能会不小心删除了获取 aid 参数的代码,或者逻辑写错,导致 $aid 变量为空。

缓存问题

虽然不常见,但有时缓存文件可能会干扰程序的正常执行,导致读取到错误的数据或参数。


解决方案

请按照以下步骤,从易到难进行排查和修复。

检查URL参数(最优先)

  1. 登录织梦后台。
  2. 管理” -> “所有文档”。
  3. 找到任意一篇文章,将鼠标光标移动到“编辑”按钮上。
  4. 查看链接:右键点击,选择“复制链接地址”。
  5. 分析链接:粘贴到记事本中,检查链接是否包含 aid= 并且后面有数字。
    • 正常链接/dede/archives_do.php?aid=123&dopost=edit
    • 异常链接/dede/archives_do.php?dopost=edit (缺少 aid)

如果缺少 aid 参数:

  • 检查你使用的列表页模板 list_article.htm 或其他自定义列表模板,找到 [field:editurl/] 这个标签,看它是否被错误地修改或删除了,默认情况下它应该能正确生成带 aid 的链接。
  • 如果是默认模板也出现此问题,可能是织梦核心文件被破坏,需要重新上传一份未修改过的 archives_do.php 文件。

检查数据库表结构

如果URL参数正常,但依然报错,那问题很可能出在数据库。

  1. 登录你的数据库管理工具(如 phpMyAdmin)。
  2. 找到织梦的数据库。
  3. 检查以下关键表的结构:
    • dede_archives:确认有 id (主键, INT, 自增) 和 aid (INT, 普通索引) 字段。
    • 自定义附加表:如果你使用了自定义模型,找到对应的附加表(如 dede_addon17),确认它有 aid 字段,aid 字段上有索引。
    • 数据一致性:随便在 dede_archives 表里找一条记录,记下它的 id,然后去附加表里,看是否存在一条 aid 等于这个 id 的记录,如果不存在,说明数据不同步。

如果发现表结构被破坏:

  • 如果是 idaid 字段丢失,这通常是严重问题,建议从备份恢复数据库。
  • 如果是附加表缺少 aid 字段,你需要为它添加这个字段并设置索引:ALTER TABLE你的附加表名ADDaidINT(11) NOT NULL DEFAULT '0', ADD INDEXaidaid 然后需要手动或通过脚本为已有数据补充 aid 值,这个操作比较复杂,建议有经验的人操作。

检查自定义模型配置(针对自定义模型报错)

如果你是在管理自定义模型的内容时出错,重点检查这里:

  1. 进入后台“核心” -> “内容模型管理”。
  2. 点击你出错的那个模型,进入“字段管理”。
  3. 检查主键:确保有一个字段是“主键”。aid 字段会被自动设置为主键,检查这个字段的配置是否正确。
  4. 检查附加表:回到“模型管理”列表,点击你的模型进行修改,检查“附加表”的名称是否与数据库中的表名完全一致(注意大小写和前缀 dede_)。
  5. 重建数据字典:有时候配置文件和数据库实际结构不同步,可以尝试在模型管理页面,找到“数据字典”相关的选项(如果有),尝试重建一下。

检查程序文件和清理缓存

  1. 重新上传核心文件:用原版织梦程序包里的 archives_do.php 文件,覆盖你网站根目录下的 /dede/archives_do.php 文件,这可以修复因文件修改或损坏导致的问题。
  2. 清理缓存
    • 登录后台,点击“系统” -> “清除缓存”,执行所有缓存清除操作。
    • 通过FTP删除 /data 目录下的所有缓存文件(cache_*, tplcache_* 等),让织梦重新生成。

预防措施

  1. 修改默认前缀:安装织梦时,强烈建议将默认的数据库表前缀 dede_ 修改为自定义的(如 mycms_),这可以有效防止利用默认前缀进行攻击,也方便管理。
  2. 谨慎二次开发:修改核心文件(/dede/ 目录下的PHP文件)前,务必先备份原始文件,最好基于一个子目录或独立的环境进行开发测试。
  3. 定期备份数据:养成定期(如每天)备份数据库和网站文件的习惯,可以使用织梦自带的备份工具,或通过服务器面板进行,这是最有效的“后悔药”。
  4. 使用安全插件:安装一些织梦安全插件,可以防止恶意篡改文件和数据库,减少因被黑导致的各种诡异问题。

“织梦无法获得主键”是一个症状,而不是病因,解决它的关键在于定位问题发生的环节

  • 先看链接:URL里有没有 aid?这是最快最简单的排查。
  • 再看数据库:表结构对不对?数据在不在?
  • 再想模型:是不是自定义模型配错了?
  • 最后才考虑文件和缓存:是不是文件被改了?缓存乱了?

按照这个思路,90% 以上的问题都能被顺利解决,如果以上步骤都无法解决,那很可能是数据库出现了严重损坏或逻辑混乱,建议直接从备份恢复。

-- 展开阅读全文 --
头像
织梦生成后前台为何不变?
« 上一篇 今天
dede共用数据库如何安全隔离数据?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]