PHP:如何从按钮中删除带有 onclick 事件的 cookie
Posted
技术标签:
【中文标题】PHP:如何从按钮中删除带有 onclick 事件的 cookie【英文标题】:PHP: How to delete a cookie with onclick event from button 【发布时间】:2012-05-02 00:16:34 【问题描述】:我正在尝试使用 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
之后……另外,我认为约翰也在做一些事情。你真的在调用你的注销函数吗?
【参考方案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>
【讨论】:
以上是关于PHP:如何从按钮中删除带有 onclick 事件的 cookie的主要内容,如果未能解决你的问题,请参考以下文章
如何使用onclick一个带有多个按钮php的插入功能的按钮
Material UI IconButton onClick 不允许处理事件
带有 Onclick 的自定义按钮,隐藏 Onclick 事件
在ReactJS中使用迭代时如何将onClick事件传递给父组件?