【问题标题】:Node insert continues to call nodeapi even if query failed即使查询失败,节点插入也会继续调用 nodeapi
【发布时间】:2011-02-21 07:53:35
【问题描述】:

我有一个自定义的 nodapi 函数,用于在插入一种内容类型时执行额外的操作。但是,我发生了以下错误“第 3538 行的 test1\includes\common.inc 中的警告。”。我已经多次追踪到这是一个编码问题,但我不确定如何解决。

但是,我没有得到的是即使查询失败,nodeapi 仍然被调用并且我得到一个空白的 nid。这也会导致其他插入失败,因为 nid 和 vid 为 0 或 null。

我知道导致问题是编码,但我不明白为什么如果节点插入(我相信)失败并且没有生成 nid 或 vid,Drupal 仍然运行 nodeapi。

任何帮助将不胜感激。

格雷格。

【问题讨论】:

  • 我认为这与问题无关。如果节点插入失败,Drupal 根本不应该调用 hook_nodeapi。除非这是设计使然,并且我需要检查 nid 的存在,但即便如此,如果 node_save 上的节点更新失败,nodeapi 怎么知道?

标签: php mysql drupal drupal-6 drupal-modules


【解决方案1】:

看看node_save。 Drupal 运行查询但不检查查询结果。所以hook_nodeapi不管节点实际上是保存在数据库中的。

Drupal 可以检查查询的结果,但是这样做会带来很多开销,而这个问题只能由不正确的数据库设置引起。 Drupal 需要正确的数据库设置,就像它需要网络服务器和 PHP。检查这些系统是否正常运行不应该是 Drupal 的工作。

【讨论】:

  • 您说得好像 Drupal 的挂钩中不提供任何事务是设计使然。 Drupal 将继续调用钩子是正确的,即使一个失败了。但这更多是由于“我们从未想过”,然后是出于选择。
  • 感谢您的回复。当 drupal_write_record 本身返回结果时,我几乎不相信这是在头上添加的。恕我直言,当节点查询本身失败时,Drupal 永远不应继续 nodeapi 挂钩调用。
  • @lordg:最好的选择是在 IMO 上调用钩子,因为它允许模块在插入失败时清理它们在 presave 中所做的事情。如果您想要/需要检查,您可以检查 nid 的存在。无论如何,这是一个见仁见智的问题。
  • @berkes:这可能是偶然的,也可能是经过深思熟虑的。只有真正编写代码的人才知道。我的观点是,它实际上是所有考虑的最佳行为。至少我是这么想的。
  • @googletorp:关于预保存的有效点。然而,这确实给我们留下了节点更新的问题。最好的解决方案是让节点添加一个属性,告诉 nodeapi funcs 结果,这样他们就可以完全自己决定。
猜你喜欢
  • 1970-01-01
  • 2014-11-05
  • 2020-08-23
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多