Perl cgi绑定动态列数

时间:2015-11-04 05:04:12

标签: perl cgi dbi

我试图从数据库中进行简单的选择,问题是我希望相同的脚本能够选择其中的任何表。我已经解决了所有问题,直到我需要将列绑定到变量,因为它们必须动态生成我不知道该怎么做。

这里是代码:

 if($op eq "SELECT"){
    if ($whr){
    $query1 = "SELECT $colsf FROM $tab WHERE $whr";
    }else{
    $query1 = "SELECT $colsf FROM $tab";
    }
    $seth = $dbh->prepare($query1);
    $seth->execute();
    foreach $cajas(@columnas){
    $seth->bind_col(*$dynamically_generated_var*);
    }
    print $q->br();
    print $q->br();
    print $q->br();

变量@columans包含所选列的名称(变化很大),我需要为$seth->bind_col()上的每个列分配一个变量。

我怎样才能实现这个目标?

1 个答案:

答案 0 :(得分:2)

使用{ "where_to_buy": true, "spec_sheet": true, "dwg_access": true, "bim_access": true, "product_prices": true, "portal_access": true, "save_quote": true, "request_drawings": true, "place_order": true, "special_offer": true } 不会在这里获得任何好处。正如您已经想到的那样,用于将固定数量的结果绑定到一组变量。但是你没有固定的设置

来思考哦,我可以动态地创建它们是一个非常常见的错误。它会让你into all kinds of trouble later。 Perl有一个专门针对这个用例的数据结构:哈希

DBI内置了许多函数,用于在bind_col之后检索数据。其中之一是fetchrow_hashref。它将结果作为哈希引用返回,每列一个键,一次一行。

execute

我们假设结果如下:

while (my $res = $sth->fetchrow_hashref) {
  p $res; # p is from Data::Printer
}

您可以通过说出$res = { id => 1, color => 'red', } 来访问颜色。 perlrefperlreftut上的perldocs有很多关于此的信息。

请注意,命名语句句柄变量的最佳做法是$res->{color}

在您的情况下,您有一个动态的列数。这些必须以$sth的格式加入。我猜你已经在col1, col2, col3做过了。该表格在$colsf中非常明显,因此我们只剩下$tab

这部分很棘手。这对always sanitize your input非常重要,尤其是在CGI环境中。使用DBI,最好使用占位符。他们将为您提供所有逃生服务,并且易于使用。

$whr

现在我们不需要关心颜色是my $sth = $dbi->prepare('select cars from garage where color=?'); $sth->execute($color); red还是blue,这可能会破坏。如果它非常动态,请改用$dbi->quote

让我们把它放在你的代码中。

' and 1; --