【问题标题】:Sql query for visit counter not working as expected访问计数器的 Sql 查询未按预期工作
【发布时间】:2021-05-05 10:52:21
【问题描述】:

以下经典 ASP 代码用于统计网站的每日页面访问量。然后检查最后一条记录的日期:

  • 如果日期已更改,则插入新行
  • 如果日期未更改,则更新以前的记录

但是,每天都有多个不需要的记录,其中重复日期有 1 次或 2 次或 3 次访问,还有一个真实记录,例如同一日期有 10000 次访问。重复记录的可能原因有哪些?

recordset.open "select top 1 id from visit order by id desc",objcon
    if recordset("mdate")=today then
    
        sql="update visit set counter=counter+1 where id=" & recordset("id")
        objcon.execute sql
        
        else
        
        sql="insert into visit (mdate,counter) values ('" & today & "','1')"
        objcon.execute sql
    
    end if
recordset.close

【问题讨论】:

  • 我很困惑。 mdate 是如何定义的?
  • 你来这个网站问问题有多久了,你似乎没有学习或坚持以前的建议,SQL 注入,并发问题这些是你现在应该知道如何解决的问题避免。看到同一个用户一遍又一遍地犯同样的错误是很痛苦的。
  • 谢谢@user692942 我知道如何避免注入。你有一些重要的心态,并期望这对每个人都很重要。这是一个原始示例代码,将在重要用途之前进行多次编辑和改进。为什么我要害怕来自安全感知的示例代码?不怕别人抄这些代码吗?
  • @AliSheikhpour 没有理解为样本写错的概念。如果您要编写需要使用参数化查询的示例代码,请包括它们。如果它不是示例,您将如何编写此代码?为什么您甚至需要示例代码的帮助?这些都没有任何意义。

标签: sql asp-classic


【解决方案1】:

这听起来像是一种竞争条件。同一个id同时访问两次。他们俩都运行了一个查询,发现id 不在表中。瞧!他们俩都决定插入一个新行。你会得到重复。

有几种方法可以解决此问题。一种是在整个过程中锁定表。我认为我更喜欢以下内容:

  • (id, date) 上定义唯一索引,以便数据库 确保唯一性。
  • 尝试insert 计数为 1 的新行。
  • 如果 insert 失败,则将计数更新 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2023-03-24
    • 2015-09-05
    相关资源
    最近更新 更多