一个只能被点击一次,永远无法再次点击的按钮。

3
正如标题所述,我想创建一个按钮,上面写着“可用”,并且当任何人点击它时,它就会变成“不可用”以供所有未来用户使用。有什么想法吗?
注意:这是为了学校项目,没有任何花哨的或者安全性保证,只是试图证明一个观点。
对于一些含糊不清的内容,很抱歉,我只想在我的Joomla网站上创建一篇文章,并附带一个按钮,只有最快的用户才能访问和点击它,这就是全部。我不担心安全问题甚至欺骗尝试。Joomla文章可以添加PHP JS代码等。

8
何意? - BoltClock
1
将一个布尔值保存在数据库中,然后检查它是 true 还是 false。 - slinzerthegod
所有那些人都在同一台电脑前面,每个人都有一个鼠标吗(例如,在游戏中)? - hakre
“只是想证明一个观点”?什么意思?您能否非常具体地说明您需要什么以及(由于此问题的标准自您最初发布以来已经改变了几次)您正在尝试做什么? - jwheron
请明确定义任务的目的 - Zain Khan
6个回答

2

这其实很复杂。通过JavaScript生成按钮,防止没有JavaScript的人无限制地点击它。保持一个彗星服务器,使得当一个用户点击它时,更改会立即传播到所有其他连接的客户端,并且按钮被移除。之后,不要授权任何新用户生成按钮。


不需要是JavaScript,PHP或任何其他语言都可以。 - a7medo778
只是简单地搜索,我是指不涉及数据库调用。 - a7medo778
使用Comet是大幅降低以下情况发生几率的唯一方法:用户A加载页面,用户B加载页面,用户A点击按钮,用户B点击按钮。而且只有使用JavaScript才能使用Comet。实际上,您也可以使用Flash,但是同样的原则适用。您需要在客户端与服务器端进行通信。至于数据库,一个简单的文件就足够了 - 当按下按钮时创建一个文件,如果文件存在,则禁用按钮。 - Amadan
2
@a7medo778 我认为你所缺少的是你处于客户端/服务器环境中。每个客户端都完全与其他客户端隔离。除了通过你在服务器上设置的通道进行通信,它们不会相互通信,正如Amadan所建议的那样,真正没有“简单”的解决方案。你可以很容易地使按钮被点击后不再在请求中提供它,但是,当另一个客户端点击按钮时,打开的任何页面仍然可用于点击,因为它们自从按钮被其他客户端点击以来就没有与服务器通信。 - Matthew Vines

1

最简单的方法是不使用数据库,这里是使用简单文本(或者您可以使用YAML、ini、xml等)文件的基本逻辑,其中包含1(已点击)或0(未点击):

$filePath = './clicked.txt';

if((int) file_get_contents($filePath)){
    // put code here to display the button and mark it as disabled
    echo "Can't click";
} else {
    // code to display button
    // code to process button request and marked clicked as true in the file
    file_put_contents( $filePath, '1');
    echo "changed file";
}

你需要进行一些验证检查,例如文件是否可读,是否可以更新文件等,但如果您不想使用数据库,那就基本上是所有需要做的了。

此外,请确保将该文件放在Web目录下方,以防用户浏览到它。

编辑:但如果您正在使用Joomla,则只需使用数据库即可。这种方式很丑陋


0

如果按钮被按下,您可以将一个值保存到数据库或创建一个文本文件。如果数据库条目或文件已存在,则不允许进一步按下。请确保在按钮被按下时禁用按钮,并且不执行服务器端操作。


我正在使用Joomla,有没有比创建数据库更简单的方法?既然我不担心安全问题,当点击时我能否只更新HTML文件? - a7medo778
当然,您可以更新HTML文件。但是恶意用户仍然可以提交表单 ;) - TimWolla
我不关心作弊者:P,有什么建议吗?比直接访问数据库简单多了。 - a7medo778
加载模板并使用 str_replace 替换其中的部分内容? - TimWolla

0

你真的想让这个按钮只被点击一次吗?如果是的话,那么你需要将它的状态存储在某种数据库中,并在有人点击它时更新数据库。

最好不要通过JavaScript禁用它,因为有人可以关闭JavaScript并规避你的决定。

顺便说一下,我觉得这个要求没有太多意义。这将是 -- 最好的情况下 -- 很难验证。你可以创建一个提交按钮,重定向到另一个页面,但用户可以轻松地点击浏览器的后退按钮,然后再次点击按钮。你无法防止这种情况发生。

既然你澄清了:你最好还是将“已点击”值存储在某个数据库中(文件也可以)。

当你加载页面时,使用PHP检查文件中是否有“已点击”值。如果有,你可以直接在HTML中禁用该按钮。

我建议在 PHP (或者你正在使用的任何服务器端语言)中添加第二层检查。当有人点击按钮时,你可以直接返回到数据库/文件中,检查 "clicked" 值是否存在。如果发现它已经被点击过了,你就什么也不用做(或者向用户显示一条消息,让他们知道已经被点击过了)。否则,你可以相应地更新数据库/文件。

1
不是很关心安全问题,这只是一个小学校项目。 - a7medo778
如果您将来有类似学校项目的问题,请在提问时加上“作业”标签。这将有助于社区更好地理解您的需求。 - jwheron

0

你有几个部分需要处理。

首先,你需要一个方法来存储值(是否已被点击)。我的标准做法是在数据库中创建一个user_properties表(uid、property、value)来存储该值。

为了在应用程序中管理它,我将属性加载到用户(配置文件)对象中,并将其存储到会话中以供参考。当按钮被渲染时,你可以快速检查用户配置文件的属性数组中是否存在该值,如果存在,则禁用;否则保持不变。

当按钮被点击时,用户配置文件中的属性将被存储并更新到数据库中。个人而言,在加载时检查会话配置文件是否有变化,如果有,则更新数据库。


这是一个合理的答案,但并不能解决确保按钮只被点击一次的问题,因为两个用户可以同时打开页面,当A点击并在服务器上设置值时,B的表单仍然有一个活动和可用的按钮。 - Matthew Vines

0

考虑到你的问题性质,你最好从另一端阻止用户。也就是说,由于你希望链接只被访问一次,因此服务器只提供该页面一次,然后拒绝访问。按钮对每个人都可点击,但只有一个用户会实际收到所请求的页面,并且仅限一次。

可以像其他人建议的隐藏按钮一样操作,将值设置在文件、数据库或服务器上的任何持久位置,并在页面加载时检查,如果存在,则中止、或重定向到拒绝页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接