PHP PDO&CRUD三表关联查询输出企业产品信息问题求助
PHP企业关联产品展示功能问题修复方案
现存问题点
- 未正确获取URL传递的企业ID,代码中
$FirmenID、$result变量未定义 - PDO查询逻辑错误:用
query()方法执行带占位符的预处理SQL,无法正确绑定参数;用fetch()仅获取单条数据,无法遍历企业下的多个关联产品 - HTML结构不规范:
<tr>标签直接嵌套<div>,循环元素重复使用同一id - 输出内容未做转义,存在XSS风险
分步修复
1. 规范URL传参与参数获取
建议把企业跳转链接的参数改成语义化形式,避免使用?1=这种无意义参数写法,点击企业的跳转链接示例:
<a href="/TESTING/index.php?firma_id=<?= $firma['FirmenID'] ?>">对应企业名称</a>
在index.php业务逻辑最开头添加参数获取与校验代码:
// 获取企业ID,转整数防注入,参数不存在则默认0 $FirmenID = isset($_GET['firma_id']) ? intval($_GET['firma_id']) : 0; if ($FirmenID <= 0) { exit('请选择有效企业'); } // 实例化CRUD类(如果已有实例化逻辑可跳过) $fpCrud = new Crud(); $fpresults = $fpCrud->getPicUrl($FirmenID); // 从查询结果中提取企业名称 $companyName = !empty($fpresults) ? $fpresults[0]['firmenname'] : '暂无企业信息';
若必须使用
?1=的传参格式,参数获取改为$FirmenID = intval($_GET[1] ?? 0);即可,不推荐该写法,可维护性极差。
2. 修复CRUD类查询方法
把query()换成prepare()支持参数绑定,fetch()换成fetchAll()获取全量关联产品数据,修正后代码:
public function getPicUrl($FirmenID) { // 替换query为prepare,支持预处理参数绑定 $stmt = $this->conn->prepare( "SELECT fp.FirmenID, f.firmenname, p.ProduktLogo, fp.url FROM firma f JOIN firmaprodukt fp ON fp.FirmenID = f.FirmenID JOIN produkt p ON fp.ProduktID = p.ProduktID WHERE fp.FirmenID = :FirmenID"); $stmt->execute(array(':FirmenID' => $FirmenID)); // 替换fetch为fetchAll,获取该企业下所有关联产品,指定返回关联数组 $data = $stmt->fetchAll(PDO::FETCH_ASSOC); return $data; }
前置要求:PDO连接初始化时需开启错误模式,添加配置
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);,方便快速定位SQL语法、关联逻辑错误。
3. 修复页面渲染逻辑与HTML结构
修正未定义变量、不规范HTML结构,添加输出转义与空数据判断,代码如下:
<div class="col-xl-6"> <div id="login_content"> <div class="scrollP"> <div class="col-12 d-flex justify-content-center heading-div"> <h3> <?= htmlspecialchars($companyName)?> </h3> </div> <table border="0"> <tbody> <?php if (empty($fpresults)) { echo '<tr><td>该企业暂未上传关联产品</td></tr>'; } else { foreach ($fpresults as $fpresult){ ?> <tr> <!-- tr标签必须嵌套td作为直接子元素,移除重复id改为class --> <td> <div class="box customer-box project_reg_box" data-parent="#login_card"> <a href="<?= htmlspecialchars($fpresult['url'])?>"> <img src="dashboard/TESTING/<?= htmlspecialchars($fpresult['ProduktLogo'])?>" height="100%" alt="产品图"> </a> </div> </td> </tr> <?php } } ?> </tbody> </table> </div> </div> </div>
补充说明
该功能为GET请求直接查询渲染场景,不需要在formprocess.php中编写额外处理逻辑,以上代码修改完成后即可正常输出对应企业的产品图片与跳转链接。
内容的提问来源于stack exchange,提问作者Lampi
相关产品推荐
相关产品推荐

