如何用PHP从MySQL两张表中获取指定用户数据并展示
问题修正与优化方案
你的代码存在几个关键问题,直接运行会导致逻辑错误和安全风险,下面是修正后的完整实现:
核心问题分析
- SQL注入风险:直接将
$user拼接进SQL语句,恶意用户可通过构造特殊值篡改SQL逻辑,窃取或破坏数据。 - 循环逻辑错误:
while($row = $result->fetch_assoc() || $row = $result1->fetch_assoc())中,||是逻辑或,会先执行左边的赋值,若左边结果为真(即还有行),就不会执行右边的赋值,导致只会遍历完其中一张表的所有行,另一张表的行完全不会被处理。 - 字段兼容性问题:
transaction和withdraw表的字段可能不完全一致(比如withdraw可能没有Transaction_id、from_who),直接取字段会导致未定义索引错误。 - 样式重复输出:
<style>标签放在循环内部,每循环一次就输出一遍,造成冗余代码,影响页面性能。
修正后的代码
<?php // 使用预处理语句防止SQL注入,同时用UNION ALL合并两张表的查询结果 // 注意:需要确保两张表的字段数量和类型匹配,若字段名不同,用AS统一别名 $stmt = $db->prepare(" SELECT '交易' AS Type, date, Transaction_id, from_who, to_who FROM transaction WHERE created_by = ? UNION ALL SELECT '提现' AS Type, date, NULL AS Transaction_id, // 若withdraw无此字段,用NULL填充 NULL AS from_who, // 根据实际表结构调整 NULL AS to_who FROM withdraw WHERE created_by = ? "); $stmt->bind_param("ss", $user, $user); // 绑定两个参数(因为UNION的两个查询各有一个?) $stmt->execute(); $result = $stmt->get_result(); ?> <style> table{ padding:10px; } .purple-border { border: 1px solid purple; /* 补充边框样式,原代码只加了class但没定义样式 */ } </style> <?php if($result->num_rows > 0): ?> <table> <thead> <tr> <th>序号</th> <th>类型</th> <th>日期</th> <th>交易ID</th> <th>来源</th> <th>去向</th> </tr> </thead> <tbody> <?php $id = 0; while($row = $result->fetch_assoc()): $id++; ?> <tr class="purple-border"> <td><?= $id; ?></td> <td><?= htmlspecialchars($row['Type']); ?></td> <td><?= htmlspecialchars($row['date']); ?></td> <td><?= $row['Transaction_id'] ? htmlspecialchars($row['Transaction_id']) : '-'; ?></td> <td><?= $row['from_who'] ? htmlspecialchars($row['from_who']) : '-'; ?></td> <td><?= $row['to_who'] ? htmlspecialchars($row['to_who']) : '-'; ?></td> </tr> <?php endwhile; ?> </tbody> </table> <?php else: ?> <p>暂无相关记录</p> <?php endif; ?>
关键优化点说明
- 防SQL注入:使用预处理语句
prepare和参数绑定bind_param,避免直接拼接用户输入。 - 统一结果集:用
UNION ALL合并两张表的查询,给不同表的记录标记类型(交易/提现),同时对不存在的字段用NULL填充,保证结果集结构一致。 - 安全输出:用
htmlspecialchars()转义输出内容,防止XSS攻击。 - 样式优化:将
<style>标签移到循环外,避免重复输出,同时补充purple-border的样式定义。 - 空状态处理:添加无记录时的提示,提升用户体验。
内容的提问来源于stack exchange,提问作者Ifediba Emmanuel
相关产品推荐
相关产品推荐

