PHP实现PostgreSQL查询结果按基因名拆分子表格
按基因名分组生成独立子表格的PHP解决方案
你需要将PostgreSQL基因表的查询结果按gene_name分组,每个基因单独生成带标题的子表格,之前的尝试代码逻辑有误导致空结果,以下是修正方案:
先修正原代码的基础错误
- SQL语句里的
pg_escape_string(search_input)需改为pg_escape_string($search_input),变量名遗漏了$ - 输出HTML时存在无对应开标签的
</a>,以及重复的<td>标签,这些会导致页面结构混乱
核心实现思路
要实现分组输出,需先让查询结果按gene_name排序,确保同基因的记录连续排列;遍历结果时跟踪当前处理的基因名,遇到新基因时关闭上一个表格(若存在),输出新基因标题并开启新表格,同基因的记录则继续添加到当前表格中。
完整修正代码
<?php $search_input = test_input($_GET["search_keywords"]); $searched_by = test_input($_GET["search_by"]); // 修正变量名,添加ORDER BY确保同基因记录连续 $query = "SELECT * FROM gene WHERE lower($searched_by) SIMILAR TO '%".pg_escape_string($search_input)."%' ORDER BY gene_name"; $res = pg_query($query) or die('Query failed: ' . pg_last_error()); if (pg_num_rows($res) > 0) { $current_gene = ''; while ($line = pg_fetch_array($res, null, PGSQL_ASSOC)) { $found_gene = $line["gene_name"]; $found_desc = $line["description"]; // 遇到新基因时,关闭上一个表格(如果存在),输出新标题和新表格 if ($found_gene !== $current_gene) { if ($current_gene !== '') { echo "</tbody></table>\n"; } $current_gene = $found_gene; echo "<h4>$current_gene</h4>"; echo "<table class=\"table annot_table\">\n<thead><tr><th>Gene</th><th>Term</th></tr></thead><tbody>\n"; } // 输出当前记录的行 echo "<tr><td>$found_gene</td><td>$found_desc</td></tr>\n"; } // 关闭最后一个表格 echo "</tbody></table>\n"; } else { echo "<p>No results found.</p>\n"; } pg_free_result($res); ?>
代码关键说明
ORDER BY gene_name:确保SQL返回的结果按基因名排序,让同基因的记录连续排列,便于分组处理$current_gene变量:跟踪当前正在处理的基因名,每次循环对比当前记录的基因名,判断是否需要切换分组- 表格开闭逻辑:每次切换基因时,先关闭上一个表格(若不是第一个基因),再输出新基因标题和新表格头部,循环结束后关闭最后一个表格
你之前尝试代码的问题
你写的$uniqueGenes[] = array_unique($line["gene_name"]);逻辑错误:
array_unique()需要传入数组,但$line["gene_name"]是单个字符串,函数无法生效,只会返回包含该字符串的数组- 未在循环外初始化
$uniqueGenes数组,且每次循环都往数组中塞入无效数组,最终遍历无法得到正确结果
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

