如何用Perl CGI+MySQL按状态匹配展示连续/单个reserve_id
实现Perl CGI中连续reserve_id的分组展示需求
我刚开始用Perl CGI、MySQL和HTML模板,现有reserve表和Show.html模板。当前代码只能展示reserve_status=3的最大reserve_id(比如输出40001),现在需要把符合状态的reserve_id按规则展示:连续ID用~连接,单个ID直接显示,示例输出为34003~35002,36000,37001~37002,40001。以下是具体修改方案:
1. 调整MySQL查询逻辑
将原来取最大ID的查询,改为按reserve_id升序取出所有reserve_status=3的记录,SQL语句替换为:
SELECT reserve_id FROM reserve WHERE reserve_status = 3 ORDER BY reserve_id ASC;
该查询能获取所有符合条件的ID并按顺序排列,为后续连续ID分组处理提供基础。
2. 修改TextBookCommonStudent的GetReceiptNumber子例程
替换原有的取最大ID逻辑,实现连续ID的分组拼接:
sub GetReceiptNumber { my ($dbh) = @_; my @ids; # 查询所有符合条件的ID my $sth = $dbh->prepare("SELECT reserve_id FROM reserve WHERE reserve_status = 3 ORDER BY reserve_id ASC"); $sth->execute(); while (my $row = $sth->fetchrow_hashref) { push @ids, $row->{reserve_id}; } $sth->finish(); return '' unless @ids; # 无数据时返回空串 my @result; my $start = $ids[0]; my $prev = $ids[0]; # 遍历ID,分组连续序列 for my $id (@ids[1..$#ids]) { if ($id == $prev + 1) { $prev = $id; } else { # 结束当前连续序列 push @result, $start == $prev ? $start : "$start~$prev"; $start = $id; $prev = $id; } } # 处理最后一组序列 push @result, $start == $prev ? $start : "$start~$prev"; # 用逗号拼接所有分组结果 return join(',', @result); }
该子例程会自动识别连续ID段,将其合并为起始~结束格式,单个ID直接保留,最终返回符合要求的字符串。
3. 修改index.cgi代码
直接调用修改后的子例程获取处理好的ID字符串,传入模板进行渲染:
# 调用子例程获取格式化后的ID字符串 my $receipt_numbers = TextBookCommonStudent::GetReceiptNumber($dbh); # 将变量传入模板(以HTML::Template为例,根据你使用的模板引擎调整) my $template = HTML::Template->new(filename => 'Show.html'); $template->param(RECEIPT_NUMBERS => $receipt_numbers); print $template->output();
确保模板参数名与后续模板中的变量名保持一致。
4. 修改Show.html模板
替换原有的单ID展示代码,添加格式化ID的展示位置:
<!-- 替换原展示最大ID的代码 --> <div> 符合条件的预约ID:<span><TMPL_VAR NAME="RECEIPT_NUMBERS"></span> </div>
根据你的模板结构调整标签样式,确保TMPL_VAR的名称与CGI中传入的参数名(RECEIPT_NUMBERS)匹配。
内容的提问来源于stack exchange,提问作者raju
相关产品推荐
相关产品推荐

