2013-06-29 48 views
0

我有一个用户尝试查找在线人员的PHP页面。在PHP页面退出从数据库中删除条目

有一个搜索按钮,单击它,在数据库中为当前用户创建一个条目,控制进入一个循环,每5秒在数据库中搜索一次,以查找是否有新条目如果有条目被发现,那么合作伙伴的详细信息会显示给他。

我想,如果被发现用户退出或退出的合伙人之前的页面了,那么他的条目必须从数据库中删除。

我想对存储在会话变量中的用户创建的“ID”,使Ajax调用和删除条目,但不知何故,这个概念是不working.The数据没有被清除。这是因为仍在找到用户或其他东西的循环,无法得到它。

有谁能告诉我我的方法出了什么问题?

,我使用的代码段现

window.onbeforeunload = function() { 
funcDeleteonexit(); 
return "Are you sure you want to navigate away?"; 
} 

function funcDeleteonexit(){ 
    $.get("functions.php",{ 
     data:"delete" 
    },function(data,status){ 
}); 
} 

里面我的functions.php,我有

if($_GET){ 
if ($_GET['data']=="delete"){ 
    echo deletefromDb(); 
    } 
} 


function deletefromDb() { 

    $mysqli = new mysqli("localhost", "root", "", "test"); 

    /* check connection */ 
    if (mysqli_connect_errno()) 
    { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 
    $currentid = (int)$_SESSION['currentId']; 

    $query1 = "delete from test where id =". $currentid; 

    $mysqli->query($query1); 
    $mysqli->close(); 
    return $currentid; 
} 
+1

你的脚本充满了糟糕的做法,包括“全局状态”,“代码重复”和违反所有SOLID原则。 – Yang

+0

嘿戴夫我是一名PHP新手。你能指出我的代码中的缺陷吗? – ItachiUchiha

+0

我推荐'www.phpmaster.com'。从新手教程 – Yang

回答

-1

我建议该浏览器只是不发送Ajax或interupting它。 因此,尽量让你的AJAX请求同步。 jQuery的似乎是异步参数设置为false

$.get("functions.php",{ 
     data:"delete", 
     async : false 
    },function(data,status){ 
}); 
0

如果您想在某人退出页面做的东西,如果你想被解雇,然后在特定事件这将在大多数情况下,给你添麻烦了。有些情况下,浏览器无法触发事件(p.e.客户端崩溃等)。

因此,我会建议一种不同的方法。从服务器端进行控制,不要依赖用户浏览器或输入。

首先,你可以查询你的数据,同时定期从浏览器触发的Ajax事件。你不说这个,但我认为你做这样的事情:

function yourrequest(){ 
    $.ajax({ 
     type: "GET", 
     url: "your/php/script.php", 
     success: function(data){ 
      // do something, p.e. update a div 
     } 
    }); 
}; 

setInterval(yourrequest, 5000); 

(请不要撕裂此代码示例,它只是展示基础)。

在服务器端,你已经拥有的用户ID在某处你的数据库。添加一个时间戳字段到这个表(称之为last_request或类似的东西)。每次你发送一些数据给客户端,检查是否有last_request的用户低于你想要的阈值,并删除这些id。那么不需要等待一个特定的事件。

这不需要精确那里进行,你也可以做不同的事情,体育一个清理工作每5分钟左右就会完成一次,这样做完全不会干扰用户的请求。

+0

中使用'ignore_user_abort',但是你的方法有一个问题。实际上,我的方法遵循FIFO逻辑,即输入的条目必须首先找到合作伙伴。所以可能会出现这样的情况:person1已经离开,他的数据仍然在db,所以当person2试图找到伙伴时,他会发现伙伴ho已经离线了 – ItachiUchiha

+0

无论如何,您在某种程度上都会遇到这个问题,所以最好在你最好控制它的地方解决它 - 那从服务器。在我的方法中,它不是一个问题,当你想要这样做时,你必须处理一个普遍问题。 – Bjoern

+0

所以你说没有突破我的问题,我将不得不用二手选项管理? – ItachiUchiha