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

如何基于前序选中的公司筛选后续游戏下拉框可选选项

实现方案

你需要实现的是两级联动下拉效果,由于PHP是服务端渲染,页面加载完成后无法直接动态更新游戏下拉选项,推荐用前端预加载映射关系的方案实现,无需额外接口开发,响应速度快,适合游戏数据量不大的场景。


完整修改代码

<!-- 公司下拉框 -->
<div class="form-group">
<label for="company">公司名称</label>
<select id="companySelect" name="company" autocomplete="off">
<?php 
// 优化SQL参数绑定,避免注入风险
$sql = "SELECT * from clients having manager like :uname" ;
$query = $dbh -> prepare($sql);
$query->bindValue(':uname', "%$uname%", PDO::PARAM_STR);
$query->execute();
$results=$query->fetchAll(PDO::FETCH_OBJ);
if($query->rowCount() > 0) {
    // 增加默认空选项引导用户选择
    echo '<option value="">请选择公司</option>';
    foreach($results as $result) {  
?>                                            
<option value="<?php echo htmlentities($result->company);?>"><?php echo htmlentities($result->company);?></option>
<?php 
    }
} 
?>
</select>
</div>

<!-- 游戏下拉框 -->
<div class="form-group">
<label for="game">游戏名称</label>
<select id="gameSelect" name="game" autocomplete="off">
    <option value="">请先选择公司</option>
</select>
</div>

<!-- 联动逻辑代码 -->
<?php
// 预查询所有公司对应的游戏数据,生成映射关系
$gameSql = "SELECT company, gamename FROM clientgames";
$gameQuery = $dbh->prepare($gameSql);
$gameQuery->execute();
$allGames = $gameQuery->fetchAll(PDO::FETCH_ASSOC);
$gameMap = [];
foreach ($allGames as $g) {
    $gameMap[$g['company']][] = $g['gamename'];
}
?>
<script>
// 把PHP生成的映射关系传递给前端JS
const companyGameMap = <?= json_encode($gameMap) ?>;

// 监听公司下拉框选择事件
document.getElementById('companySelect').addEventListener('change', function() {
    const selectedCompany = this.value;
    const gameSelect = document.getElementById('gameSelect');
    // 清空原有选项
    gameSelect.innerHTML = '';
    
    if (!selectedCompany) {
        gameSelect.innerHTML = '<option value="">请先选择公司</option>';
        return;
    }
    
    // 生成对应公司的游戏选项
    const games = companyGameMap[selectedCompany] || [];
    if (games.length === 0) {
        gameSelect.innerHTML = '<option value="">该公司暂无游戏</option>';
        return;
    }
    games.forEach(game => {
        const option = document.createElement('option');
        option.value = game;
        option.textContent = game;
        gameSelect.appendChild(option);
    });
});

// 页面加载完成后初始化游戏下拉框状态
window.addEventListener('load', () => {
    document.getElementById('companySelect').dispatchEvent(new Event('change'));
});
</script>

补充说明

  • 如果游戏数据量很大(超过万级),可以改用AJAX方案:公司选择后发送异步请求到后端接口,查询对应公司的游戏列表后再渲染选项,减少页面初始加载体积
  • 原有直接拼接变量到SQL语句的写法存在SQL注入风险,上述代码已经优化为PDO参数绑定的写法,安全性更高

内容的提问来源于stack exchange,提问作者Muhammad Ayub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:45:09