所以我试图制作一个视图计数器,我的桌子看起来像这样。
post_id | view_count | view_ip
----------------------------------
20 | 1 | some ip
21 | 1 | some ip
在这一点上,我非常迷茫,我知道这样做是错误的,但我不知道该怎么做。
所以目前我正在用 count(post_id) 调用视图,它给了我 1 但是当我用我的手机(不是在 wifi 上)打开网站时,我希望有第二行 post_id = 20 但重复激活和我不是在做新的插入...
这是我的查询:
INSERT IGNORE INTO `views`
SET view_count=1, post_id = '.$article['post_id'].', view_ip = "'.$ip.'"
ON DUPLICATE KEY UPDATE view_count=view_count;
堆栈中的某个地方有一个如何跳过更新的答案,这是推荐的,但我不确定这是否可以...
PS:这个想法是每个 ip 有一个视图。
从语义上讲,您试图表达“为这篇文章插入一个新视图,但如果它已经有一个视图,请添加一个”。
这可以通过以下方式完成:
INSERT INTO `views` (post_id, view_count, view_ip)
VALUES (?, 1, ?)
ON DUPLICATE KEY UPDATE view_count = view_count + 1;
你需要在uniq的指数(post_id, view_ip)
的DUPLICATE KEY
情况发生。
哦,拜托,请不要连接字符串来伪造 SQL 查询,这是SQL 注入的方法。请使用准备好的语句,准备好的语句提供了非常干净的(视觉上和技术上)方式来将值放入语句中,并且它在服务器端非常安全。
当我说它“视觉上干净”时,我的意思是我更喜欢:
view_ip = ?
超过:
view_ip = "'.$ip.'"
另外,第二个很容易受到 SQL 注入。
(?
占位符可能因系统而异)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句