如何避免地址栏显示用户ID,同时实现用户资料查看功能?
避免地址栏显示用户ID的资料展示实现方案
方法一:用POST请求提交用户ID
GET请求会把参数暴露在地址栏,换成POST就能解决这个问题,具体修改如下:
替换原HTML按钮代码
把原来的按钮+a标签改成内嵌表单,点击按钮就会以POST方式提交ID,不会出现在地址栏:
<form action="view.php" method="post" style="display: inline;"> <input type="hidden" name="member_id" value="<?php echo $roww['member_id']; ?>"> <button type="submit">View</button> </form>
设置display: inline是为了让表单和按钮保持原有布局,不会额外换行占位。
调整view.php的PHP逻辑
注意你原来的代码里,HTML传的是member_id,但PHP里取的是snippet_id,这明显不匹配,先修正这个,同时改成用$_POST获取参数:
if (isset($_POST['member_id'])) { $member_id = $_POST['member_id']; try { // 这里表名请根据实际数据库调整,你原来写的snippets表大概率是笔误,用户资料应该对应members表 $stmt = $pdo->prepare('SELECT * FROM members WHERE member_id = :id'); $stmt->execute([':id' => $member_id]); $row = $stmt->fetch(PDO::FETCH_ASSOC); $count = $stmt->rowCount(); } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); exit(); } }
方法二:用SESSION存储用户ID
如果不想用表单跳转,可以先把要查看的用户ID存入会话,再跳转到view.php读取:
新增中间处理页(比如go_to_view.php)
先做一个表单提交到中间页:
<form action="go_to_view.php" method="post" style="display: inline;"> <input type="hidden" name="member_id" value="<?php echo $roww['member_id']; ?>"> <button type="submit">View</button> </form>
中间页go_to_view.php的代码
<?php session_start(); if (isset($_POST['member_id'])) { $_SESSION['view_member_id'] = $_POST['member_id']; header('Location: view.php'); exit(); } ?>
修改view.php的代码
session_start(); if (isset($_SESSION['view_member_id'])) { $member_id = $_SESSION['view_member_id']; // 读取后立即销毁这个会话变量,避免后续误访问 unset($_SESSION['view_member_id']); try { $stmt = $pdo->prepare('SELECT * FROM members WHERE member_id = :id'); $stmt->execute([':id' => $member_id]); $row = $stmt->fetch(PDO::FETCH_ASSOC); $count = $stmt->rowCount(); } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); exit(); } }
额外安全提醒
- 不管用哪种方法,都必须加权限校验:检查当前登录用户是否有权限查看该用户的资料,防止越权访问。
- 继续保持使用PDO预编译语句,这已经能有效防止SQL注入,别改成直接拼接SQL的写法。
内容的提问来源于stack exchange,提问作者willy
相关产品推荐
相关产品推荐

