我有一个PHP搜索引擎,很多人都在使用它。我想做的是当一个人搜索超过25次然后给他一个警告说你已超过今天的限制并且不允许进一步的saerch。
我怎么能用PHP mysql做到这一点?或者使用cookie或会话更好?如果是这样的话怎么办?
答案 0 :(得分:2)
您可以使用用户ID(或任何其他唯一标识信息)在MySQL中创建一个表,一个表示当天的日期,以及一个计数器字段,每次搜索时您都可以增加1。然后在开始搜索之前检查计数器,如果计数器是25,则不允许搜索。
使用会话,APC,内存缓存,cookie等不保证您能够保持限制。
如果您使用APC或memcache或任何其他专为缓存而设计的系统,您的内存限制可能会耗尽,而您存储的密钥将会消失,从而允许用户进行25次新搜索。
如果您使用会话,则用户只需注销并再次登录即可获得25次新搜索。
如果您使用Cookie,用户只需在浏览器中更改或删除Cookie,即可再次进行新搜索。
永远不要相信用户或缓存系统。
答案 1 :(得分:1)
但是你可以用cookies来做到这一点:
因此,用户需要做的就是更改浏览器,计算机或清除他/她的cookie,并且他们有一组新的搜索。
您可以使用会话变量来执行此操作:
因此,用户需要做的就是关闭并重新打开浏览器,然后他们会有一组新的搜索。
因此,“最粘”选项是在数据库中存储增量的搜索计数,但是:
尽管如此,这仍然是最好的选择。
您可以通过多种方式设计和实施数据库架构,老实说,您如何做到这一点将真正依赖完全每天有多少用户+用户搜索。
但是,基本算法(无论数据库设计如何)都是:
答案 2 :(得分:0)
session_start();
if ( isset($_POST['q']) ) { // insert your query parameter instead of 'q'
// Determine if the search counter exists
if (isset( $_SESSION['search_counter'] ) ) {
if ( $_SESSION['search_counter'] > 25 ) {
// Rate-limit message here
}
}
else {
// Create a session key to hold the search counter.
$_SESSION['search_counter'] = 0;
}
// Increment the counter after every search.
$_SESSION['search_counter']++;
}
答案 3 :(得分:0)
如果这些用户未登录,则在服务器端会话中存储数据是最可靠的方式,因为可以轻松清除cookie。但即使这样也可以规避。如果这确实是一个大问题 - 让他们进行身份验证,然后将这些数据绑定到他们的会话和服务器上的用户信息,如果它被清除,您可以仔细检查数据库,然后允许他们执行操作。这会抑制性能,因此您的里程可能会有所不同。