You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何不通过URL(不使用$_GET)传递记录ID至其他页面?

如何在不通过URL($_GET)传递记录ID的情况下跳转到更新/删除页面?

当然有办法啦!你目前用$_GET传ID的方式虽然简单,但确实会把ID暴露在URL里,下面给你几种常用的替代方案:


方案1:使用表单+POST请求(最推荐)

POST请求的参数不会显示在URL中,是隐藏ID的常用方法。你可以把每个操作按钮包裹在一个表单里,用隐藏字段存储ID,然后通过提交表单来传递数据:

修改你的代码如下:

<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">
        <!-- 更新操作表单 -->
        <form action="update.php" method="POST" style="display: inline;">
          <input type="hidden" name="id" value="<?php echo $row['id']; ?>">
          <button type="submit" class="edit" style="border: none; background: none; padding: 0;">
            <i class="fas fa-pen fa-xs"></i>
          </button>
        </form>
        <!-- 删除操作表单 -->
        <form action="delete.php" method="POST" style="display: inline;">
          <input type="hidden" name="id" value="<?php echo $row['id']; ?>">
          <button type="submit" class="trash" style="border: none; background: none; padding: 0;" onclick="return confirm('确定要删除这条记录吗?');">
            <i class="fas fa-trash fa-xs"></i>
          </button>
        </form>
      </td>
    </tr>
    <?php endforeach; ?>
  </tbody>
</table>

然后在update.php和delete.php里,用$_POST['id']来获取ID:

// update.php 示例
if(isset($_POST['id'])){
    $id = $_POST['id'];
    // 后续更新逻辑
}

注意:我给表单加了display: inline让按钮保持在同一行,按钮样式也改成了无背景无边框,避免破坏原有的UI风格。删除按钮还加了确认提示,提升用户体验。


方案2:使用Session存储ID

你可以先把记录ID存入Session,然后跳转到目标页面后再从Session中取出:

在列表页面的操作按钮点击时(可以用JavaScript或者表单触发),先把ID存入Session:

// 比如点击更新按钮时,先执行这个逻辑(可以放在单独的处理页面,或者用AJAX)
session_start();
$_SESSION['record_id'] = $row['id'];
header("Location: update.php");
exit;

然后在update.php中取出:

session_start();
if(isset($_SESSION['record_id'])){
    $id = $_SESSION['record_id'];
    // 用完后可以销毁这个Session变量,避免后续误操作
    unset($_SESSION['record_id']);
    // 后续更新逻辑
}

⚠️ 注意:这种方法要考虑多标签页冲突的问题,如果用户同时打开多个操作页面,Session里的ID会被覆盖,所以不如POST方案可靠。


方案3:加密GET参数(折中方案)

如果你还是想保留链接跳转的方式,可以对ID进行加密,这样URL里的参数就不是明文的ID了:

比如用PHP的openssl_encrypt和openssl_decrypt来加密解密:

// 加密函数
function encryptId($id){
    $key = "你的加密密钥"; // 要保密!
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-CBC'));
    $encrypted = openssl_encrypt($id, 'AES-256-CBC', $key, 0, $iv);
    return base64_encode($encrypted . '::' . $iv);
}

// 解密函数
function decryptId($encryptedId){
    $key = "你的加密密钥";
    list($encryptedData, $iv) = explode('::', base64_decode($encryptedId), 2);
    return openssl_decrypt($encryptedData, 'AES-256-CBC', $key, 0, $iv);
}

然后在列表页面生成链接:

<a href="update.php?id=<?php echo encryptId($row['id']); ?>" class="edit">
  <i class="fas fa-pen fa-xs"></i>
</a>

在update.php中解密:

if(isset($_GET['id'])){
    $id = decryptId($_GET['id']);
    // 后续逻辑
}

这种方法虽然参数还在URL里,但别人无法直接看懂真实的ID,适合需要保留链接跳转又想隐藏真实ID的场景。


内容的提问来源于stack exchange,提问作者Simone De Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:07:29