我只是注意到@Berdir非常适合db_affected_rows
从Drupal 7中删除。我现在想知道现在最好的方法是检测您运行的查询是否更改了数据库中的任何内容。
一个典型的用例是。
db_query(...);
if (!db_affected_rows()) {
db_query(...);
}
我看了从db_query返回的查询对象,但似乎并没有太大帮助。
更新:
我不清楚我在什么情况下需要该信息。
我当前的用例是一个非常简单的用例。我有一个带有nid列和一些数据列的节点类型表。我有一个表单,提交表单后,我想插入或更新数据库中的行。
db_update
/ 的问题db_insert
在于,如果我先使用update,并且在update返回0时插入,我将无法捕获条件,即使用db中的值提交表单。如果我先使用db_insert,则在数据库中已经存在一行的情况下,将引发en错误。
我想在这种特定情况下,我可以在创建节点时插入一个空白值,然后仅使用更新,但是在某些情况下,如果我需要存储键入到外部数据库的信息,这可能是不可能的。我还想避免必须依赖数据库值才能使代码起作用。
对于这种情况,我通常的策略是
db_query("INSERT IGNORE INTO ...")
if (!db_affected_rows()) {
db_query("UPDATE ...");
}
无论数据库处于什么条件,这样做都是简单且无错误的。我现在看到的最佳选择是使用SQL处理它并执行以下操作:
db_query("INSERT ... ON DUPLICATE KEY UPDATE");
但是我希望数据库API能够处理此问题。