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

PHP会员认证查询系统异常:始终显示首位注册会员数据

问题诊断与修复方案

核心问题

你的查询逻辑完全没有利用用户输入的ID和证书编号作为筛选条件,导致SQL查询返回所有会员数据,而mysqli_fetch_array只会读取结果集中的第一条记录,所以每次都显示首位会员的信息。

具体问题点:

  • 第一个SQL语句的WHERE sname= 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 &nbsp " .$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:33:30