Php 防止重复的窗口/选项卡

Php 防止重复的窗口/选项卡,php,mysql,architecture,email-verification,Php,Mysql,Architecture,Email Verification,我已经为我的网站设置了电子邮件验证 用户注册后,系统会提示他们通过电子邮件发送给他们的链接验证其帐户。如果用户单击链接,它将激活他们的帐户并将他们带到登录屏幕,当然是在新选项卡中 也许我是强迫症患者,但我的问题是,如果有人在注册后立即去验证他们的帐户,而没有关闭第一个选项卡,他们会在单击验证链接后在登录屏幕上打开两个选项卡如果已经打开了具有相同域的选项卡,是否有任何方法可以阻止此操作或使用相同的选项卡?还是有更好的体系结构可供使用? 我已经设置了验证过程,以便在我的数据库中有两个单独的表 用户\

我已经为我的网站设置了电子邮件验证

用户注册后,系统会提示他们通过电子邮件发送给他们的链接验证其帐户。如果用户单击链接,它将激活他们的帐户并将他们带到登录屏幕,当然是在新选项卡中

也许我是强迫症患者,但我的问题是,如果有人在注册后立即去验证他们的帐户,而没有关闭第一个选项卡,他们会在单击验证链接后在登录屏幕上打开两个选项卡如果已经打开了具有相同域的选项卡,是否有任何方法可以阻止此操作或使用相同的选项卡?还是有更好的体系结构可供使用?

我已经设置了验证过程,以便在我的数据库中有两个单独的表

用户\u未经验证
(表A)
帐户|电子邮件|帐户|密码|令牌|输入|时间|数字| id(主要)

用户\u已验证
(表B)
账户|电子邮件|账户|密码|加入|……

该过程可以分解如下:

  • 用户使用电子邮件和密码注册,从而创建令牌
  • 令牌通过电子邮件发送给他们,并带有验证链接
  • 一旦用户通过链接注册(如果令牌匹配且未过期),
    帐户\u电子邮件
    帐户\u密码
    将从
    未验证的用户
    传输到
    已验证的用户
    ,并显示确认消息
  • users\u unverified
    中的记录被删除

  • 是否有一种不同或更好的方法可以做到这一点,从而避免同时打开两个选项卡的可能性?

    一般来说,我认为您不必担心,用户会理解,单击电子邮件中的链接将打开一个浏览器选项卡,然后他们就完成了这个过程

    不过,如果您确实想这样做,您可以使用
    localStorage
    设置窗口已打开的状态,并使用
    BroadcastChannel
    在选项卡之间发送数据(例如,将哈希发送回您的窗口,以便您可以显示请求验证其电子邮件的DOM或执行重定向)

    以下是一个例子:

    此javascript将位于注册页面上:

    <script type="text/javascript">
        var channel = new BroadcastChannel("linkopened");
        channel.onmessage = function(e) {
            // do something with data sent from other tab
            alert('Email link opened, show DOM or redirect: ' + e.data)
        };
    
        localStorage.setItem('pageopen', true);
        window.onbeforeunload = function() {
            localStorage.removeItem('pageopen');
        };
    </script>
    
    
    var频道=新广播频道(“链接打开”);
    channel.onmessage=函数(e){
    //对从其他选项卡发送的数据执行某些操作
    警报('电子邮件链接已打开,显示DOM或重定向:'+e.data)
    };
    setItem('pageopen',true);
    window.onbeforeunload=函数(){
    localStorage.removietem('pageopen');
    };
    
    这将出现在新选项卡中打开的页面上:

    <script type="text/javascript">
        if (localStorage.getItem('pageopen')) {
            var channel = new BroadcastChannel("linkopened");
            channel.postMessage('Some special link or hash');
            window.close();
        }
    </script>
    
    
    if(localStorage.getItem('pageopen')){
    var频道=新广播频道(“链接打开”);
    channel.postMessage(“某些特殊链接或散列”);
    window.close();
    }
    
    你的意思是这样的@Juakali92给我一秒钟读it@Juakali92是的,非常相似。很高兴听到更多的回应,不过非常感谢。等我有空的时候我会测试一下。你听说过window.postmessage()吗?channel.postmessage就是这么做的,我想如果从gmail打开
    window.close()
    的话,它是不会工作的。但您可以向focus发送一个事件,但仍然会留下一个打开的选项卡。