0

我有一个 php 页面,用户在其中尝试查找在线人员。

有一个搜索按钮,点击它,在数据库中为当前用户创建一个条目,并且控件进入一个循环,每 5 秒在数据库中进行一次搜索以查找是否已创建新条目,如果找到一个条目,然后向他显示合作伙伴的详细信息。

我希望如果用户在找到合作伙伴之前退出或导航离开页面,那么必须从数据库中删除他的条目。

我正在尝试将针对用户创建的“id”存储在会话变量中,进行 ajax 调用并删除条目,但不知何故,这个概念不起作用。数据没有被删除。这是因为循环仍在寻找用户或其他东西,我无法得到它。

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

我正在使用的代码片段特此

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;
}
4

2 回答 2

0

如果您想在某人退出页面时完成某些操作,那么如果您希望随后触发特定事件,这在大多数情况下会给您带来麻烦。在某些情况下浏览器无法触发事件(pe 客户端崩溃等)。

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

首先,您可以在定期从浏览器触发 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 分钟左右执行一次清理工作,这会单独执行,以完全不打扰用户的请求。

于 2013-06-29T17:57:34.723 回答
-1

我建议浏览器只是不发送 ajax 或中断它。所以尽量让你的 AJAX 请求同步。对于 JQuery 似乎将异步参数设置为 false

$.get("functions.php",{
      data:"delete",
      async : false
  },function(data,status){
 });
于 2013-06-29T17:34:49.667 回答