【问题标题】:Has Mysql Query Executed - Confirm query has executed correctly已执行 Mysql 查询 - 确认查询已正确执行
【发布时间】:2014-11-26 09:19:41
【问题描述】:

我最近编写了一个脚本,每十分钟写入一次数据库。该脚本的目的是如果该用户的记录存在则更新该记录,否则它会为该用户插入一条记录。

数据库有三个重要字段,idusernameip

随着 IP 更改,脚本将更新该用户的 IP 字段或为具有新 IP 的用户添加记录,并在下次运行时更新 IP 而不是添加记录。

我正在尝试找出知道记录是否存在的最佳方法,以便我可以更新而不是插入。

我之前在更新语句之后使用$f->rowCount(),即

if($f->rowCount() > 0){ continue; }else{ the insert statement}

因此,如果受影响的行数大于 0,我就知道该记录存在。但是,如果 IP 没有更改,则实际上不会发生任何更新,$f->rowCount() 将等于 0

现在我只是选择所有记录并将它们存储在一个数组中,检查用户名是否为in_array,如果是则进行更新,否则进行插入。有没有更好或更快的方法来确保记录是否存在,而无需进行选择?

我的问题真的是看看是否存在类似于$f->rowCount() 的东西,因为我前几天才发现。非常感谢

【问题讨论】:

  • 对我来说,你在做什么非常不清楚。特别是“随着 IP 更改,脚本将更新该用户的 IP 字段或为具有新 IP 的用户添加记录,并在下次运行时更新 IP 而不是添加记录。” - 什么时候更新记录,什么时候插入一条新记录?请提供更多您的代码,因为我不明白您想使用的逻辑。
  • @northkildonan 我认为 OP 的意思是,如果用户名和 IP 的组合存在,那么什么都不应该发生(因此这里的更新是多余的)。不清楚他为什么要使用用户名而不是用户 ID 和 IP。

标签: php mysql


【解决方案1】:

您可以将这三列设为唯一键。这将允许您使用
INSERT ... ON DUPLICATE KEY 查询表达式:

INSERT INTO `users`
([other fields], `username`, `ip`)
VALUES ([values for other fields], [user name], [IP address]) 
ON DUPLICATE KEY
UPDATE [other fields]=[other values], `username`=[user name], `ip`=[IP address]

【讨论】:

  • 这看起来不错。当 INSERT 由于重复键而失败时,我不知道 ON DUPLICATE KEY
【解决方案2】:

silkfire 的答案看起来很有希望。但如果您不想更改表中的唯一键,为什么不更改rowCount() 的查询?
例如:

SELECT COUNT(*) FROM `users` 
WHERE `ip` = [IP address]
AND 'username' = [user name]

看起来您正在使用 PDO;因此,在此声明中使用$f->fetchColumn(),您将知道这个确切的组合是否已经存在。您还将知道它是否存在不止一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2019-05-10
    相关资源
    最近更新 更多