
本文讲解如何在php网页中实现“点击列表中的某个id后,仅显示该id对应数据库记录的详细信息”,解决当前代码中全表遍历导致所有数据重复显示的问题,并提供安全、可复用的查询逻辑。
本文讲解如何在php网页中实现“点击列表中的某个id后,仅显示该id对应数据库记录的详细信息”,解决当前代码中全表遍历导致所有数据重复显示的问题,并提供安全、可复用的查询逻辑。
在当前代码中,$query = "SELECT * FROM semi_synthetic" 始终检索整张表,而后续 while 循环会遍历全部结果——无论用户是否点击了某个 ID。关键问题在于:未将 URL 中传递的 CHIHBT_ID 参数用于 WHERE 条件过滤查询,导致每次请求都返回全部记录。
要实现“点击即展示单条详情”,需分三步重构逻辑:
✅ 1. 构建带条件的安全查询
避免直接拼接 $_GET 参数(存在 SQL 注入风险),应使用预处理语句。以下是推荐写法:
<?php include("../conn.php"); ?><?php $id = null;
if (isset($_GET["CHIHBT_ID"]) && is_numeric($_GET["CHIHBT_ID"])) {
$id = (int)$_GET["CHIHBT_ID"];
}
?><div class="container">
<div class="compound_report_card">
<h2>Compound Report</h2>
<div class="card-content">
<?php if ($id): ?><?php // 安全预处理查询:只获取匹配 CHIHBT_ID 的单条记录
$stmt = $conn->prepare("SELECT * FROM semi_synthetic WHERE CHIHBT_ID = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 1) {
$row = $result->fetch_assoc();
echo "<p>Calculated Properties of: " . htmlspecialchars($row['CHIHBT_ID']) . "</p>";
?>
<ul>
<li>Canonical SMILES: = htmlspecialchars($row['smile_notation'] ?? 'N/A') ?></li>
<li>Molecular weight: = htmlspecialchars($row['molecular_weight'] ?? 'N/A') ?></li>
<li>Heavy atoms: = htmlspecialchars($row['number_of_heavy_atoms'] ?? 'N/A') ?></li>
<li>Aromatic heavy atoms: = htmlspecialchars($row['number_of_aeromatic_heavy_atoms'] ?? 'N/A') ?></li>
<li>Rotatable bonds: = htmlspecialchars($row['number_of_rotatable_bonds'] ?? 'N/A') ?></li>
<li>H-bond acceptors: = htmlspecialchars($row['number_of_h_bond_acceptors'] ?? 'N/A') ?></li>
<li>H-bond donors: = htmlspecialchars($row['number_of_h_bond_donors'] ?? 'N/A') ?></li>
<li>TPSA (Ų): = htmlspecialchars($row['tpsa'] ?? 'N/A') ?></li>
</ul>
<?php } else {
echo "<p><strong>⚠️ No compound found with ID: " . htmlspecialchars($id) . "</strong>";
}
$stmt->close();
else: ?>
<p><strong>? Please select a compound ID from the list.</strong></p>
<!-- 可在此处添加 ID 列表链接(如:foreach 查询所有 ID 生成 <a href="?CHIHBT_ID=123">123</a>) -->
<?php endif; ?>
</div>
</div>
</div>
<?php include("../footer.php"); ?>
⚠️ 注意事项与最佳实践
- 永远不要直接拼接用户输入:原答案中 $query .= ' WHERE CHIHBT_ID = ' . $_GET["CHIHBT_ID"] 是严重安全隐患,已替换为 mysqli::prepare() 预处理。
- 验证参数类型:使用 is_numeric() + 强制类型转换 (int) 确保 ID 为整数,防止恶意字符串注入。
- 输出转义:所有 echo 数据均经 htmlspecialchars() 处理,防止 XSS 攻击。
- 空结果处理:明确提示“未找到记录”,提升用户体验。
- 扩展建议:若需展示所有 ID 的可点击列表,可在上方新增一段查询 SELECT CHIHBT_ID FROM semi_synthetic ORDER BY CHIHBT_ID 并生成 链接。
通过以上改造,页面将严格按 URL 中 ?CHIHBT_ID=xxx 的值精准加载唯一化合物数据,彻底解决全表渲染问题,同时兼顾安全性与健壮性。










