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

如何用PHP从MySQL两张表中获取指定用户数据并展示

问题修正与优化方案

你的代码存在几个关键问题,直接运行会导致逻辑错误和安全风险,下面是修正后的完整实现:

核心问题分析

  1. SQL注入风险:直接将$user拼接进SQL语句,恶意用户可通过构造特殊值篡改SQL逻辑,窃取或破坏数据。
  2. 循环逻辑错误:while($row = $result->fetch_assoc() || $row = $result1->fetch_assoc())中,||是逻辑或,会先执行左边的赋值,若左边结果为真(即还有行),就不会执行右边的赋值,导致只会遍历完其中一张表的所有行,另一张表的行完全不会被处理。
  3. 字段兼容性问题:transaction和withdraw表的字段可能不完全一致(比如withdraw可能没有Transaction_id、from_who),直接取字段会导致未定义索引错误。
  4. 样式重复输出:<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:03:39