如何从Mojolicious Perl中与所选下拉列表相关的mysql DB中搜索

问题描述

我已将学生订购的信息数据存储在DB中。我想通过从截止日期到时间的下拉列表来搜索这些订单。通常情况下,我可以搜索数据库中的所有数据,但不能工作时,我选择下拉从到日期和时间明智的选择。

我的文件在下面:

SrchList.html.ep

    <%
    my $SrchResult = stash('SrchResult');
    my $Date = stash('Date');
    my @Date =(['--' => '']);
    foreach my $key (sort keys %{$Date}){     
        push(@Date,($Date->{$key}->{name}) => $key);
    }
    my $Time = stash('Time');
    my @Time =(['--' => '']);
    for(my $i = 1; $i <= $Time->{max}; $i++){ 
        push(@Time,[$i.'H' => $i]);
    }
%>
<form action="<%= url_for('/SrchList') %>" method="post" class="form-horizontal frmSrchList">
    <div class="row">
        <div class="col-lg-10 col-lg-offset-1">
            <div class="input-group">Order Start<%= select_field 'Date'=>\@Date,class=>'form-control',id=>'Date_start' %></div>
            <div class="input-group">Time Start<%= select_field 'Time'=>\@Time,id=>'Time_start' %></div>
            <div> ~ </div>
            <div class="input-group">Order End<%= select_field 'Date'=>\@Date,id=>'Date_end' %></div>
            <div class="input-group">Time End<%= select_field 'Time'=>\@Time,id=>'Time_end' %></div>
        </div>
        <div class="col-lg-10 col-lg-offset-1">
                <button type="submit" class="btn btn-success">Search</button>
        </div>
    </div>
    <div class="row"><table class="table table-striped">
            <thead><tr><th>recptid</th><th>student_id</th><th>price</th><th>total</th><th>upd_date</th></tr></thead>
            <tbody >
                % foreach my $reserve_id (sort {$b <=> $a} keys %{$SrchResult}){
                % $SrchResult->{$reserve_id}->{upd_date} =~ /(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
                % $SrchResult->{$reserve_id}->{price} =~ s/\,/<br>/g;
                <tr>
                    <td><%= uc($SrchResult->{$reserve_id}->{recptid}) %></td>
                    <td><%= uc($SrchResult->{$reserve_id}->{student_id}) %></td>
                    <td align="right"> <%== decode('utf-8',$SrchResult->{$reserve_id}->{price}) %> </td>
                    <td align="center"> <%== decode('utf-8',$SrchResult->{$reserve_id}->{total})  %></td>
                    <td> <%= decode('utf-8',$SrchResult->{$reserve_id}->{upd_date}) %> </td>
                </tr>% }
            </tbody>
    </table></div>
</form>

index.cgi

get '/SrchList'=>{page => undef} => sub {
    my $self = shift;
    my @breadcrumb = ('SrchList');
    $self->stash('breadcrumb'=> \@breadcrumb);
    my $Date = $TextBookCommon->GetDate();
    $self->stash('Date' => $Date);
    $self->stash('Time' => $TextBookCommon->{'CONfig'}->{'SELECT'}->{'Time'});
    $session->clear('_SRCH_DATA');
    $self->render('SrchList');
};
post '/SrchList/:page' => {page => undef} => sub {
    my $self = shift;
    my @breadcrumb = ('SrchList');
    $self->stash('breadcrumb'=> \@breadcrumb);
    my %sRCH_DATA = (defined $session->param('_SRCH_DATA') ? %{$session->param('_SRCH_DATA')} : '');
    my $Date;
    my $Time;
    if(! defined $self->param('return')){
        $Date = ($self->param('Date') ne ''  ? $self->param('Date') : $Date);
        $Time = ($self->param('Time') ne ''  ? $self->param('Time') : $Time);
    } else {
        $Date = (exists($SRCH_DATA{'Date'}) ?  $SRCH_DATA{'Date'} : '');
        $Time = (exists($SRCH_DATA{'Time'}) ?  $SRCH_DATA{'Time'} : '');
    }
    my $SrchData = {
        'Date' => $Date,'Time' => $Time
    } ;
    my $DateData = $TextBookCommon->GetDate();
    $session->param(-name=>'_SRCH_DATA',-value=>$SrchData);
    my $SrchResult = $TextBookCommon->GetorderSearch($SrchData);
    $self->stash('Date' => $DateData);
    $self->stash('Time' => $TextBookCommon->{'CONfig'}->{'SELECT'}->{'Time'});
    $self->stash('SrchResult'=> $SrchResult);
    $self->stash('SrchData'=> $SrchData);
    $self->stash('TextBookCommon' => $TextBookCommon);
    $self->render('SrchList');
};

index.cgi.conf

{
    'SELECT' => {  
        'Time' =>{   
                    'max' => 24                                               
                },},}

TextBookCommon.pm

sub CreateOrderSearchsql(){
    my $self = shift;
    my $StudentData = shift;
    my $Date_start = $StudentData->{Date_start};
    my $Time_start = $StudentData->{Time_start};
    my $Date_end = $StudentData->{Date_end};
    my $Time_end = $StudentData->{Time_end};
    my $sql;
    my $dbh = $self->{'dbh'};
    my $data = '';
    my @param = ();
    $sql =<<"   sql_EOL";
            SELECT tr.reserve_id,tr.recptid,tr.student_id,GROUP_CONCAT(tr.price) AS 'price',SUM(tr.price)+1000 AS 'total',tr.upd_date AS 'upd_date'
            FROM 
                ( SELECT ra.reserve_id,RIGHT(ra.reserve_id,5) AS recptid,m.student_id,rb.price,rb.upd_date FROM t_reserve_a AS ra 
                INNER JOIN t_reserve_b AS rb ON ra.reserve_id=rb.reserve_id
                INNER JOIN m_student AS m ON m.student_id=ra.student_id ) AS tr
            GROUP BY tr.reserve_id
    sql_EOL
    if($Date_start ne '' ||  $Date_end ne ''){
        $sql .="and WHERE DATE(t_reserve_a.upd_date) BETWEEN DATE(t_reserve_a.upd_date) = ? AND DATE(t_reserve_a.upd_date) =?";
        push(@param,$Date_start,$Date_end);
    }
    if($Time_start ne '' ||  $Time_end ne ''){
        $sql .="and WHERE TIME(t_reserve_a.upd_date) BETWEEN TIME(t_reserve_a.upd_date) = ? AND TIME(t_reserve_a.upd_date) = ? ";
        push(@param,$Date_end);
    }
    my $result = {
        'sql' =>  $sql,'param' => \@param,};
    return $result;
}
sub GetorderSearch(){
    my $self = shift;
    my $StudentData = shift;
    my $result = $self->CreateOrderSearchsql($StudentData);
    my $sql = $result->{'sql'};
    my @param = @{$result->{'param'}};
    $sql .= " order by tr.reserve_id ";
    my $SrchResult = $dbh->selectall_hashref($sql,'reserve_id',undef,@param);
    return $SrchResult;
}

有人可以帮我解决这个问题吗?

解决方法

您的SQL看起来不正确。您要在WHERE后面附加GROUP BY子句。这是一个SQL语法错误。本质上,您正在生成这样的SQL:

SELECT * FROM foo GROUP BY id AND WHERE bar = 1;

这将引发类似于

的错误

SQL错误(1064):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的“ WHERE bar = 1”附近使用

我们看不到您的$dbh的创建位置,但是我认为您没有进行错误检查。您的$dbhGetOrderSearch中甚至都不可用。您可以通过另一种方法从$self中取出它,在该方法中构造SQL而不使用它,但实际上不在运行查询的位置,因此您的代码可能根本无法编译。

在任何情况下,您都应该重新排列SQL代码的创建并将其分解为多个步骤。

my $sql = 'SELECT * FROM foo';

my @where,@args;
if ($some_condition) {
  push @where,'foo BETWEEN ? AND ?';
  push @args,$datetime_from,$datetime_to;
}

if ($another_condition) {
  push @where,'id > ?';
  push @args,$id;
}

if (@where) {
 $sql .= ' WHERE ' . join( ' AND ',@where);
}

$sql .= ' GROUP BY id';

这样,SQL的顺序就正确了。

将来,当您的SQL无法使用时,请将其调试到服务器日志中,然后在mysql服务器上手动运行它以查看发生了什么情况。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...