通过邮箱查询Transactions表仅返回一行数据的技术求助
问题排查与解决
问题原因
- 前端循环逻辑错误:
foreach循环的闭合花括号写在了HTML输出代码之前,循环结束后才输出表格行,此时$row仅保留最后一条数据的引用,因此只会显示一行结果。 - SQL注入风险:直接将
$email拼接进SQL语句,未使用PDO参数绑定,存在安全漏洞。
修复后的代码
1. 修复查询函数(解决注入问题)
public function fetchAirtimeTrans() { $email = $_SESSION['logged']; // 使用参数绑定避免SQL注入 $query = $this->db->prepare("SELECT * FROM Transactions WHERE `email` = :email ORDER BY id ASC "); $query->bindParam(':email', $email, PDO::PARAM_STR); $query->execute(); $query->setFetchMode(PDO::FETCH_ASSOC); $result = $query->fetchAll(); return $result; }
2. 修复前端展示代码(解决仅显示一行问题)
$datas = new Transactions(); $result = $datas->fetchAirtimeTrans(); if($result) { foreach( $result as $row) { // 将表格行输出逻辑移至循环内部,每条数据对应一行 ?> <tr> <td><?= $row['trans_id'] ?></td> </tr> <?php } }
修复说明
- 前端代码将表格行的输出逻辑移入
foreach循环内部,循环遍历每条交易数据时都会生成对应的表格行,从而展示所有结果。 - 查询函数改用PDO参数绑定方式传递
email参数,彻底避免SQL注入风险,同时保证查询逻辑的稳定性。
内容的提问来源于stack exchange,提问作者Syntax Byte Solutions
相关产品推荐
相关产品推荐

