【问题标题】:PHP: How to delete a cookie with onclick event from buttonPHP:如何从按钮中删除带有 onclick 事件的 cookie
【发布时间】:2023-03-04 00:35:01
【问题描述】:

我正在尝试使用 php 创建一个退出按钮。我可能会以完全错误的方式解决这个问题,但无论如何我试图通过单击按钮来删除 cookie。

    <?php 
    function logOut() {
        setcookie('userDetails[username]',"", time()-1200);
    }



if(isset($_COOKIE["userDetails"])) {
    echo "<table id='rtgLoginBox'>" ;
        echo "<tr>" ;
            echo "<td> Cookie " . $_COOKIE["userDetails"]["username"] . "!";
            echo "<td></td>" ;
        echo "</tr><tr>" ;
            echo "<td><input id='rtgLoginBtn' type='submit' value='Log Out' onclick=\"logOut();\" /></td>" ;
            echo "<td>";
            echo "<td></td>" ;
            echo "<td></td>" ;
        echo "</tr><tr>" ;
            echo "<td></td>" ;
            echo "<td></td>" ;
        echo "</tr>" ;
    echo "</table>" ;
} else {
    echo "<table id='rtgLoginBox'>" ;
        echo "<tr>" ;
            echo "<td><form action='process.php' method='post'>Username:</td>" ;
            echo "<td><input name='usernamein' id='rtgUsernameTxt' type='text' size='20' class='rtgSignUpTxt'/></td>" ;
        echo "</tr><tr>" ;
            echo "<td>Password:</td>" ;
            echo "<td><input name='passwordin' id='rtgPasswordTxt' type='password' size='20' class='rtgSignUpTxt' /></td>" ;
        echo "</tr><tr>" ;
            echo "<td></td>" ;
            echo "<td><input id='rtgLoginBtn' type='submit' value='Log In' />  </form><input id='rtgLoginBtn' type='submit' value='Sign Up' onclick=\"location.href='SignUp.php'\" /></td>" ;
        echo "</tr><tr>" ;
            echo "<td></td>" ;
            echo "<td><a href='mysite.com'><p style='padding:0 !important;'>Forgot Login Details?</p></a></td>" ;
        echo "</tr>" ;
    echo "</table>" ;
    }

    ?>

据我在线阅读,这应该有效吗?我也尝试将函数放在 echoed table 下,但这也不起作用。

【问题讨论】:

  • PHP 不是事件驱动语言
  • 那么我将如何弥合差距,以便注销按钮会取消设置 cookie?
  • 问题是,当您将 cookie 设置为负时间以按照您应该的方式清除它时,在您尝试进一步处理之前,尚未将标头发送到浏览器在饼干上。只需取消设置 cookie。 unset($_COOKIE['userDetails'])
  • @MetalFrog,我该怎么写?将用户发送到重定向注销页面会起作用吗?
  • 我刚刚在我的评论中给了你代码。把它放在你的setcookie 之后……另外,我认为约翰也在做一些事情。你真的在调用你的注销函数吗?

标签: php forms button cookies unset


【解决方案1】:

如果用户按下注销按钮,此代码将导致用户注销,然后将他们重定向到名为whatever.php 的新页面。您显然可以将其更改为您想要的任何内容。

<?php 
    function logOut() {
        setcookie('userDetails[username]',"", time()-1200);
        unset($_COOKIE['userDetails']);
    }

if ('POST' === $_SERVER['REQUEST_METHOD'])
{
    logOut();
    header('Location: /whatever.php');
    exit;
}

if(isset($_COOKIE["userDetails"])) {
    echo "<form action='".htmlspecialchars($_SERVER['PHP_SELF'])."' method='post'><table id='rtgLoginBox'>" ;
        echo "<tr>" ;
            echo "<td> Cookie " . $_COOKIE["userDetails"]["username"] . "!";
            echo "<td></td>" ;
        echo "</tr><tr>" ;
            echo "<td><input id='rtgLoginBtn' type='submit' value='Log Out' /></td>" ;
            echo "<td>";
            echo "<td></td>" ;
            echo "<td></td>" ;
        echo "</tr><tr>" ;
            echo "<td></td>" ;
            echo "<td></td>" ;
        echo "</tr>" ;
    echo "</table></form>" ;
} else {
    echo "<table id='rtgLoginBox'>" ;
        echo "<tr>" ;
            echo "<td><form action='process.php' method='post'>Username:</td>" ;
            echo "<td><input name='usernamein' id='rtgUsernameTxt' type='text' size='20' class='rtgSignUpTxt'/></td>" ;
        echo "</tr><tr>" ;
            echo "<td>Password:</td>" ;
            echo "<td><input name='passwordin' id='rtgPasswordTxt' type='password' size='20' class='rtgSignUpTxt' /></td>" ;
        echo "</tr><tr>" ;
            echo "<td></td>" ;
            echo "<td><input id='rtgLoginBtn' type='submit' value='Log In' />  </form><input id='rtgLoginBtn' type='submit' value='Sign Up' onclick=\"location.href='SignUp.php'\" /></td>" ;
        echo "</tr><tr>" ;
            echo "<td></td>" ;
            echo "<td><a href='mysite.com'><p style='padding:0 !important;'>Forgot Login Details?</p></a></td>" ;
        echo "</tr>" ;
    echo "</table>" ;
    }

    ?>

【讨论】:

    【解决方案2】:

    正如你所说的“onclick='logOut()'”,你是从 javascript 调用函数 logOut(),而不是 php....

    我们可能认为程序总是交互式的,我们总是可以在发生某些事情时调用某种函数,但 php 不是这样工作的……要理解这一点,你应该更多地了解浏览器/服务器模型。

    由于有人需要一个 php 页面,例如 index.php,服务器获取请求并根据您提供的 URL 在其磁盘上查找 index.php....然后将整个 php 文件解释为 html并将 html 文档传输到浏览器....所以屏幕前面的不再是 php 代码,而是静态 HTML 文档...

    如果您想使页面具有交互性,请将 javaScript 插入到您的网页中,javascript 以纯文本形式传输到浏览器,它在浏览器中运行,而不是在服务器上运行。

    所以一个网站同时使用 js 和 php,php 用于处理服务器端的工作,例如查询数据库和管理整个网站......而 javascript 在页面上工作..

    因此,如果您想以交互方式更改或删除 cookie,您需要的是 javascript,您可以在 javascript 中声明一个“logOut()”函数,并用它来控制 cookie....或者如果您真的想控制用php的cookie,用js通过ajax把命令传给某个php文件,删除php中的cookie。

    【讨论】:

      【解决方案3】:

      好的,我有一个奇怪但有效的解决方案来解决这个问题。问题是您不能调用 php 函数,是的,但是您可以通过向表单添加一个值为“whatever”的隐藏输入框来调用 POST 到 PHP,然后使用按钮的 onclick 事件来更改该值像“cut”这样的东西。然后在调用 POST 方法时检查 key = "cut" 的值。您可能无法使用此过程将值更改回“notCut”,但如果您足够有创意,您可以设置一个计时器,每隔一段时间将值更改回“notCut”......我自己测试了它效果很好!

      <?php 
       if (array_key_exists('cutter', $_POST)) {
                  if ($_POST["cutter"] == 'cut') {
                  setcookie("yourCookie", "cookie", time() - 60 * 60);
                  echo "You ate the cookie!";
              }
              }
      ?>
      
          <form method="post">
              <input type="text" id="cutter" name="cutter" value="NOTcut" hidden="true">
              <input id='cutter' type="submit" value="Cookie Cutter" onclick="document.getElementById('cutter').value='cut'">
          </form> 
      

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 2020-02-03
        • 2014-05-17
        • 2019-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        相关资源
        最近更新 更多