PHP正在删除记录,但不使用$\u GET传递id

PHP正在删除记录,但不使用$\u GET传递id,php,html,get,Php,Html,Get,我想知道是否有一种方法可以在php中删除一条记录,而不通过$\u GET传递,可能是通过$\u POST或其他方法。 我在read.php页面中使用了这段代码 <table class="table table-bordered"> <thead> <tr> <td>#</td> <td>Sigla</td> <td>Nome</td>

我想知道是否有一种方法可以在php中删除一条记录,而不通过$\u GET传递,可能是通过$\u POST或其他方法。 我在read.php页面中使用了这段代码

<table class="table table-bordered">
  <thead>
    <tr>
      <td>#</td>
      <td>Sigla</td>
      <td>Nome</td>
      <td>Bilancio</td>
      <td>Responsabile</td>
      <td>Azione</td>
    </tr>
  </thead>
  <tbody>
  <?php foreach ($rows as $row): ?>
    <tr>
      <td><?=$row['id']?></td>
      <td><?=$row['sigla']?></td>
      <td><?=$row['nome']?></td>
      <td><?=$row['bilancio']?></td>
      <td><?=$row['responsabile']?></td>
      <td class="actions">
        <a href="update.php?id=<?php echo $row['id']; ?>" class="edit">
          <i class="fas fa-pen fa-xs"></i>                
        </a>
        <a href="delete.php?id=<?php echo $row['id']; ?>" class="trash">
          <i class="fas fa-trash fa-xs"></i>
        </a>
      </td>
    </tr>
    <?php endforeach; ?>
  </tbody>
</table>

#
西格拉
诺姆
比兰西奥
负责的
阿齐翁
正如您所看到的,我为每条记录创建了一个href,重定向到“删除”或“更新”页面,并通过$获取id。
有没有办法不在url中显示id?(可能是通过$\u POST),我读了数百篇文章,但都没有回答我的问题。

你需要AJAX或表单

使用链接删除是非常危险的,因为一旦从爬虫程序中删除,您的数据库就会损坏

我建议这样做

  • 将单击委托给容器表
  • 使用ID的数据属性
  • 使用POST的Ajax—我在这里使用
    fetch
    来实现这一点
  • 让fetchData={
    方法:“发布”
    }
    const url=“delete.php”;
    document.querySelector(“表单”).addEventListener(“单击”,函数(e){
    常数tgt=e.target;
    if(tgt.classList.contains(“垃圾”)和确认(“Delete”+this.id+“?”){
    e、 预防默认值();
    获取数据[“正文”]={
    “id”:此.getAttribute(“数据id”)
    };
    获取(url,获取数据)
    .然后(函数(){
    控制台日志(“已删除”);
    });
    }
    })
    

    URL中显示的id绝对没有问题。这并不会使删除操作更加安全或不安全。你还有一个,也许两个问题:

    • 任何破坏性操作都必须使用POST请求。普通的链接可以由搜索引擎自由爬网,也可以由浏览器预加载。这意味着,一旦谷歌抓取了你所有的链接,你的数据库将是空的。这就是为什么使用POST很重要,因为每个行为正常的HTTP客户机都知道POST具有破坏性
    • 如果你问这个问题是因为你担心用户可以简单地操纵URL中显示的id并删除他们不应该删除的其他记录,那么你真正的问题不在于你传递id的位置,而是你没有权限检查你的服务器
    对于初学者,使用表单创建POST请求:

    <form action="delete.php?id=<?php echo htmlspecialchars(urlencode($row['id'])); ?>" 
          method="post">
        <input type="submit" value="Delete">
    </form>
    

    使用隐藏表单提交将GET请求转换为Post,首选方法是在提交数据时加密记录id

    你可以这样做

    在后端,您必须加密所有参数,如以下代码:

    $encryptedParameters = encrypt([
      'id' => 132,
      'something' => 'value',
      'another_key' => 'another_value',
    ]);
    
    $decryptedParameters = decrypt($_GET['s']);
    $id = $decryptedParameters['id'];
    $something = $decryptedParameters['something'];
    $another_key = $decryptedParameters['another_key'];
    
    然后将此值发送到html模板

    在前端,如果您想通过
    GET
    执行类似操作,则您的用户无法看到您发送到后端的内容,因为它是加密的:

    <a href="delete.php?s=<?php echo $encryptedParameters; ?>"></a>
    


    删除链接并使用表单。但是任何人仍然可以通过表单更改id的值。所以也许还需要做更多的服务器端检查。google bot的一次访问和数据库是emptyUse AJAX和一个确认按钮即使你使用一个表单,你仍然需要在一个隐藏的字段中传递id,但是任何想要查看页面源代码的人都会看到id。我认为没有一种方法可以在id不可见的情况下实现这一点。如果您有安全方面的顾虑,您可能需要考虑身份验证。@mplungjan谢谢您的建议,如果您不理解我是这个领域的新手,那么很抱歉我会对您的亵渎表示抱歉,但我会认真记住您的建议,建议AJAX作为第一件事有点过火。@deceze jQuery在哪里?认真地说,不发布一次点击而不是一次点击就重新加载整个页面是糟糕的用户体验,如果any@mplungjan我听说过,你是说使用Jquery在两个页面之间传递数据吗?不,这里没有Jquery。我叫你删除点击垃圾箱。在.then中,您可以隐藏该行或OP似乎想要隐藏请求的真实ID的方法。听起来OP想要实现隐蔽性每次删除一个表单是很糟糕的。当使用AJAX向服务器发送一篇简单的帖子就足够了时,等待服务器更新以完成包含大量HTML的页面是一件过分的事情。如果它只是一个“不要在URL中显示ID,因为它很难看”,那么就只需要一个Ajax callYes,但这是关于改进UX的。我在这里首先解释破坏性请求的基本原理,并试图解决有关在URL中显示id的主要问题。而且,目前的用户体验是一样的,这似乎不是主要的问题。我的答案因为回答用户体验方面的问题而被否决了,假设显示的ID更多的是使用href删除的症状,我在question@mplungjan您能推荐使用ajax的其他方法删除而不重新加载页面吗?我希望这两种方法都可用。@deceze顺便说一句,垃圾邮件机器人将尝试提交您的表单,结果与原始问题中的href大致相同。我的建议是,至少只有在有人确认删除后才会运行。为什么“加密记录id”是“首选方法”?你能举一个更具体的例子来说明隐藏表单提交是什么样子的吗?向公众显示记录ID是不可靠的,尤其是从浏览器URL。这是为什么?在数据网格中列出记录时,使用表单提交和POST请求,使删除链接具有按钮角色。这是为什么deceze:为了避免理解背后操作的人进行SQL注入,也为了更好的可执行性和正确的显示,为了避免知道数据库中已保存的每条记录的确切id,数据变得不安全-为了更安全,某些类型的项目首选此方法。
    <a href="delete.php?s=<?php echo $encryptedParameters; ?>"></a>
    
    $decryptedParameters = decrypt($_GET['s']);
    $id = $decryptedParameters['id'];
    $something = $decryptedParameters['something'];
    $another_key = $decryptedParameters['another_key'];