PHP会员认证查询系统异常:始终显示首位注册会员数据
问题诊断与修复方案
核心问题
你的查询逻辑完全没有利用用户输入的ID和证书编号作为筛选条件,导致SQL查询返回所有会员数据,而mysqli_fetch_array只会读取结果集中的第一条记录,所以每次都显示首位会员的信息。
具体问题点:
- 第一个SQL语句的
WHEREsname=sname``是恒成立条件,会查询出student表中所有记录。 - 代码中没有获取用户提交的ID(对应字段
sname)和证书编号(Certificate_number)来构建筛选逻辑。 - 存在严重SQL注入风险,直接将变量拼接进SQL语句(比如
WHERE sname='$_SESSION[sname]')极易被攻击。
修复步骤
1. 获取并验证用户输入参数
假设用户通过表单提交id(对应会员ID字段sname)和certificate_number两个参数,先获取并做基础校验:
// 根据表单提交方式(POST/GET)获取参数 $inputId = isset($_POST['id']) ? trim($_POST['id']) : ''; $inputCertNum = isset($_POST['certificate_number']) ? trim($_POST['certificate_number']) : ''; // 校验参数是否为空 if(empty($inputId) || empty($inputCertNum)) { die("<div class='text-center text-danger'>请输入完整的ID和证书编号</div>"); }
2. 使用预处理语句执行安全查询
替换原有的SQL查询,用预处理语句绑定参数,既解决筛选问题,又彻底规避SQL注入:
require 'conn.php'; // 构建带占位符的SQL语句 $query = "SELECT `ord`, `sname`, `saddress`, `Certificate_number`, `Certi`, `country`, `sphone`, `Certificate_image`, `Issuance_date` FROM `student` WHERE `sname` = ? AND `Certificate_number` = ?"; // 初始化预处理语句 $stmt = mysqli_prepare($conn, $query); // 绑定参数("ss"表示两个字符串类型参数,根据实际字段类型调整) mysqli_stmt_bind_param($stmt, "ss", $inputId, $inputCertNum); // 执行查询 mysqli_stmt_execute($stmt); // 获取结果集 $result = mysqli_stmt_get_result($stmt); // 获取匹配的会员记录 $fetch = mysqli_fetch_array($result); // 检查是否找到匹配数据 if(!$fetch) { die("<div class='text-center text-danger'>未找到匹配的会员信息,请检查ID和证书编号</div>"); }
3. 优化下载链接逻辑
原代码中重复查询Certificate_image的操作完全多余,直接使用前面查询到的结果即可:
echo "<a class='d-grid gap-2 mt-4 btn btn-warning' href='../attestation/{$fetch['Certificate_image']}' target='_blank'>Download My document</a>"; echo "<a class='d-grid gap-2 my-2 btn btn-primary' href='index.php'>Back to homepage</a>";
完整修复后的代码片段
<?php require 'conn.php'; // 获取用户输入的ID和证书编号 $inputId = isset($_POST['id']) ? trim($_POST['id']) : ''; $inputCertNum = isset($_POST['certificate_number']) ? trim($_POST['certificate_number']) : ''; if(empty($inputId) || empty($inputCertNum)) { die("<div class='text-center text-danger'>请输入完整的ID和证书编号</div>"); } // 预处理查询会员信息 $query = "SELECT `ord`, `sname`, `saddress`, `Certificate_number`, `Certi`, `country`, `sphone`, `Certificate_image`, `Issuance_date` FROM `student` WHERE `sname` = ? AND `Certificate_number` = ?"; $stmt = mysqli_prepare($conn, $query); mysqli_stmt_bind_param($stmt, "ss", $inputId, $inputCertNum); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $fetch = mysqli_fetch_array($result); if(!$fetch) { die("<div class='text-center text-danger'>未找到匹配的会员信息,请检查ID和证书编号</div>"); } // 输出会员信息 echo "<h2 dir='ltr' class='txt1 fs-1 text-center '> WELCOME   " .$fetch['saddress']. " <br> </h2><h5 class='text-light text-center'>AIITA wishes you a good luck</h5>"; echo "<hr style='border-top:1px dotted red;'/>"; echo "<div dir='ltr' class=' row align-items-start '> <div class=' col lh-lg fs-5 text-success '>Order N° </div> <div class='col lh-lg fs-5 text-light '> " .$fetch['ord']. "</div> </div>"; echo "<div dir='ltr' class=' row align-items-start '> <div class=' col lh-lg fs-5 text-success '>Your ID Number is </div> <div class='col lh-lg fs-5 text-light '> " .$fetch['sname']. "</div> </div>"; echo "<div dir='ltr' class=' row align-items-start '> <div class='col lh-lg fs-5 text-success '>Doc Number </div> <div class='col lh-lg fs-5 text-light '> " .$fetch['Certificate_number']. "</div> </div>"; echo "<div dir='ltr' class=' row align-items-start '> <div class='col lh-lg fs-5 text-success '>Doc Type </div> <div class='col lh-lg fs-5 text-light '> " .$fetch['Certi']. "</div> </div>"; echo "<div dir='ltr' class=' row align-items-start '> <div class='col lh-lg fs-5 text-success '>Country</div> <div class='col lh-lg fs-5 text-light '> " .$fetch['country']. "</div> </div>"; echo "<div dir='ltr' class=' row align-items-start '> <div class='col lh-lg fs-5 text-success '>Phone N° </div> <div class='col lh-lg fs-5 text-light '> " .$fetch['sphone']. "</div> </div>"; echo "<div dir='ltr' class='row align-items-start '> <div class='col lh-lg fs-5 text-success '> File Extention </div> <div class='col lh-lg fs-5 text-light '> " .$fetch['Certificate_image']. " </div> </div>"; echo "<div dir='ltr' class='row align-items-start '> <div class='col lh-lg fs-5 text-success '> Issuance date</div> <div class='col lh-lg fs-5 text-light '> " .$fetch['Issuance_date']. " </div> </div>"; // 下载按钮与返回首页按钮 echo "<a class='d-grid gap-2 mt-4 btn btn-warning' href='../attestation/{$fetch['Certificate_image']}' target='_blank'>Download My document</a>"; echo "<a class='d-grid gap-2 my-2 btn btn-primary' href='index.php'>Back to homepage</a>"; // 关闭资源 mysqli_stmt_close($stmt); mysqli_close($conn); ?>
额外注意事项
- 确保表单输入框的
name属性与代码中获取的id、certificate_number参数名一致。 - 建议增加更严格的输入格式校验(比如ID长度、证书编号格式),提升系统稳定性。
- 所有涉及用户输入的数据库操作,必须使用预处理语句,杜绝SQL注入风险。
内容的提问来源于stack exchange,提问作者user19302467
相关产品推荐
相关产品推荐

