【问题标题】:Delete an entry from db on PHP page exit在 PHP 页面退出时从 db 中删除一个条目
【发布时间】:2013-06-29 17:24:10
【问题描述】:

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

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

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

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

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

我正在使用的代码 sn-p 特此

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

【问题讨论】:

  • 您的脚本充满了不良做法,包括global state、code duplication 以及违反所有 SOLID 原则。
  • 嘿,戴夫,我是 php 新手。你能指出我的代码中的缺陷吗?
  • 我推荐www.phpmaster.com。从新手教程开始
  • 感谢您的推荐。你有办法解决我的问题吗?
  • $currentid = (int)$_SESSION['currentId'];添加一个;最后

标签: php ajax session


【解决方案1】:

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

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

首先,您可以在定期从浏览器触发 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。无需等待特定事件。

这不需要完全在那里完成,你也可以做一些不同的事情,p.e.每 5 分钟左右执行一次清理作业,它会单独执行此操作,根本不会打扰用户的请求。

【讨论】:

  • 但是您的方法存在问题..实际上我的方法遵循 FIFO 逻辑,即输入的条目必须先找到合作伙伴。所以可能会出现person1已经离开,而他的数据还在db中的情况,所以当person2尝试寻找合作伙伴时,会发现合作伙伴ho已经下线
  • 无论如何你都会在某种程度上遇到这个问题,所以最好在你最好控制它的地方解决它——那就是从服务器。在我的方法中,这不是问题,而是当您想要完成这样的事情时必须处理的一般问题。
  • 所以你是说我的问题没有突破,我必须用二手选项来管理?
  • 您依赖用户/浏览器来做某事,而没有研究如果他们的行为不像您希望的那样会发生什么。如果您的应用程序有必要,则必须处理。在您的服务器上跟踪它们并在您认为有必要时删除这些事件。我在编写复杂的网络平台时做过类似的事情。我也想知道他们什么时候退出网站——因此他们会定期发送事件(对于其他事情,比如检查邮件等),我使用缺少事件来确定用户是否在没有点击按钮的情况下注销.像魅力一样工作。
  • “我使用缺少事件来确定用户是否在未单击按钮的情况下注销。” - 你如何确定这个?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多