【问题标题】:Delete button and confirmation删除按钮和确认
【发布时间】:2013-06-06 22:07:18
【问题描述】:

您好,我有一个可以从数据库中删除一行的有效链接。

<a href="?action=delete&id=<? echo $id ?>" onclick="return confirm('Are you sure you want to delete?')"><strong>Delete this Case</strong></a></td>
<?php
    if($_POST['action']=="delete")
    {
         $id = $_POST['id'];

         mysql_query("DELETE FROM rmstable2 WHERE id= '$id'");
         echo("> Case # $id has been deleted as requested. To see your changes please click <a href='/martinupdate.php?id=$id'>here</a></b><br>");
    }
?>

我想要做的不是有一个链接,而是我想要一个按钮,当按下它时会显示一个确认,然后如果为真则删除该行。
我不希望意外删除。

<form>
    <input type="button" value="Delete this Case" onclick="return confirm('Are you sure you want to delete?')"; 
    <a href="?action=delete&id=<? echo $id ?>">
</form>

【问题讨论】:

  • 不要用GET删除东西!所发生的一切就是一台机器会出现并跟踪所有链接并从您的数据库中删除所有内容!
  • 这是一个管理页面,它是一个原型,所以我不太担心,更重要的是让它工作,然后将其显示为一个原型,然后使用另一种语言重建。跨度>
  • 你听说过 csrf 吗?这可能容易受到 csrf 的影响
  • @Alexandra 很高兴知道,但尽管如此,其他人可能会看到这个堆栈溢出帖子并在生产环境中复制您。
  • @messifan 你是对的,有什么更好的选择?

标签: php html


【解决方案1】:

在文件顶部试试这个:

<?php

if ($_SERVER['REQUEST_METHOD'] == 'DELETE' || ($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['_METHOD'] == 'DELETE')) {
    $id = (int) $_POST['id'];
    $result = mysql_query('DELETE FROM rmstable2 WHERE id='.$id);
    if ($result !== false) {
        // there's no way to return a 200 response and show a different resource, so redirect instead. 303 means "see other page" and does not indicate that the resource has moved.
        header('Location: http://fully-qualified-url/martinupdate.php?id='.$id, true, 303);
        exit;
    }
}

以此为形式:

<form method="POST" onsubmit="return confirm('Are you sure you want to delete this case?');">
    <input type="hidden" name="_METHOD" value="DELETE">
    <input type="hidden" name="id" value="<?php echo $id; ?>">
    <button type="submit">Delete Case</button>
</form>

【讨论】:

  • 对仍在回答此问题的人的后续说明:此处的目标是创建一个带有要删除的 ID 的表单。这不是 RESTful 设计。更好的设计是将请求发送到在地址中包含 ID 的 URL(而不是请求正文),例如 /cases/23 或 /cases?id=23 后者本来可以在这里使用,实际上,但发帖人可能有其他使用 $_POST['id'] 的代码,所以我玩得很安全,并将其作为 POST 字段留在答案中。
【解决方案2】:

您必须在表单的 onSubmit 事件中进行确认

因此,如果用户取消确认,则不会发送表单

<form onSubmit="return confirm('Are you sure you want to delete?')">
<button type="submit" ...>
</form>

【讨论】:

  • 我有点困惑,这与我已经拥有的表单是分开的还是应该添加 onSubmit 到按钮代码
  • 他的意思是在同一个表单上,你用
  • @Nicholas 我现在得到一个布尔值:/
  • 对话框的返回值应该阻止/允许提交继续。我会尝试添加我自己的答案
  • @Nicholas 谢谢!也许我做错了。确认有效,但随后我得到一个布尔值
【解决方案3】:

HTML:

<form id="delete-<?php echo $id; ?>" action="?action=delete" method="post">
    <input type="hidden" name="id" value="<?php echo $id; ?>" />
    <input type="submit" value="Delete this Case" /> 
</form>

为了方便起见,我假设使用 jquery:

$("#delete-<?php echo $id; ?>").submit(function() {
    return confirm("Are you sure you want to delete?");
});

如果 js 确认返回 false(不提交),则阻止默认提交操作,否则让常规帖子通过。

注意:你真的不应该使用 html 属性来声明事件处理程序,这段代码将逻辑分开。

编辑:@Nicholas 评论

这是一个非 jquery 解决方案。我没有测试它,我不相信 preventDefault 在 IE

function loaded()
{
    document.getElementById("delete-<?php echo $id; ?>").addEventListener(
        "submit",
        function(event)
        {
            if(confirm("Are you sure you want to delete?"))
            {
                event.preventDefault();
            }
            
            return false;
        },
        false
     );
}
window.addEventListener("load", loaded, false);

【讨论】:

  • 没有迹象表明 jQuery 可用。如果没有 jQuery(或其他库)分离出逻辑,将会更加冗长。
猜你喜欢
  • 2017-09-26
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2015-03-28
  • 2022-08-14
  • 2020-04-06
相关资源
最近更新 更多