2013-07-29 22 views
-3

我想用perl CGI来删除数据库中的数据,但它显示了我的错误: 全局符号“$ queryDelete”需要在Dbm.pm行明确包名10

package Dbm; 
use DBI; 
use strict; 
use POSIX "fmod"; 
    sub connection { 
     return DBI->connect("DBI:mysql:boys:127.0.0.1" ,'root',''); 
    }; 

    sub do_delete { 
     my $rData = shift; 
     $queryDelete = " WHERE "; 
     my $cWhere = get_condition($rData); 
     my $queryDelete="DELETE FROM $rData->{table} $cWhere";  
     my $dbh = connection; 
     my $sqlDelete = $dbh->prepare($queryDelete) or die "Can't prepare $queryDelete: $dbh->errstr\n"; 
     return ($sqlDelete->execute) or die "can't execute the query: $sqlDelete->errstr"; 
    } 
sub get_condition{ 
    my $rData = shift; 
    my $cWhere = " 1=1 "; 

    while (my ($key,$value) = each $rData->{condition}) { 
     if (ref($value) eq 'ARRAY'){ 
      $cWhere .= " AND "; 

      #print $key.$value->[0]; 

      my $counter=0; 
      foreach my $cValueArray (@{$value}){ 
        if(fmod($counter,3)==0) { 
         $cWhere.=" ".$key." ".$cValueArray." "; 
        } 
        else { 
         $cWhere.= " ".$cValueArray. " "; 
        } 
        $counter++; 
      } 
     }else{ 
      #print "$key=$value\n 

      $cWhere .= " AND ". $key."=". $value; 
     } 
    }; 

return $cWhere; 
} 
1; 

test.pl

my $q = new CGI(); 

    my $handle = Dbm::connection(); 

    sub test_delete{ 
     my $rData = { 
      table  =>'boys', 
      condition => { 
       ID => 99, 
       Emri => ['<>','\'mon\'','AND','like','\'boy%\''], 
      } 
     }; 

     return Dbm::do_delete($rData); 
    }; 
print $q-> start_html(
    -title => "Main", 
    -style => [ {-src =>'/media/css/ui-lightness/jquery-ui-1.10.3.custom.css', -rel=>'alternate'}, 
       {-src =>'/media/css/ui-lightness/mystyle.css', -rel=>'stylesheet', -type=>'text/css'} 

    ], 
    -script => [ 
     { -src=>'/media/js/jquery-1.9.1.js'}, 
     { -src=>'/media/js/jquery-ui-1.10.3.custom.js' } 
    ] 
); 
print test_delete(); 

回答

3

您使用strict。那很好。

sub do_delete { 
    my $rData = shift; 
    $queryDelete = " WHERE "; 
    my $cWhere = get_condition($rData); 
    my $queryDelete="DELETE FROM $rData->{table} $cWhere";  
    ... 

在这里,我们试图使用变量$queryDelete(其中分配“WHERE”的话)之前它宣布与my,两行之后。那很糟。你必须在使用它们之前声明你的变量。

你可以只移动my到你第一次使用的$queryDelete,但可能因为你只是简单地覆盖它,当你分配一个新的字符串,它两条线后不会是非常有用的。

我的猜测是,你可能想要做这样的事情:

sub do_delete { 
    my $rData = shift; 
    my $cWhere = get_condition($rData); 
    my $queryDelete="DELETE FROM $rData->{table} WHERE $cWhere";  
    ... 
现在
+0

现在显示我:全局符号“%rDataUpd”需要在Dbm.pm线44.明确包名此代码:子_do_update { \t我$ rDataUpd = shift; \t my $ cQueryUpd =“UPDATE”。 “”。 $ rDataUpd {table}。 “”。 “SET”。 “”; (我的($ keyUpd,$ valUpd)=每个$ rDataUpd - > {data}){ \t $ cQueryUpd。= $ keyUpd。“=”。 “”。 $ valUpd。 “”; \t}; \t \t $ cQueryUpd。=“WHERE”; \t $ cQueryUpd。= get_condition($ rDataUpd)。“
”; return $ cQueryUpd; } – Armida

+0

请你可以看看这个问题吗?或者你想让我编辑我的代码? – Armida

+0

@Armida,现在你试图使用一个标量('$ rDataUpd')作为一个散列('%rDataUpd')。我认为它应该是一个哈希*参考*。所以你可能想要'$ rDataUpd - > {table}' – friedo

2

你没有在正确的位置定义$ queryDelete变量。你首先使用它并在之后定义它。尝试:的

my $queryDelete = " WHERE "; 
... 
$queryDelete="DELETE FROM $rData->{table} $cWhere"; 

代替

$queryDelete = " WHERE "; 
... 
my $queryDelete="DELETE FROM $rData->{table} $cWhere"; 
+0

它不显示错误,但不会删除我从数据库中要行:/ – Armida

+0

这将修复'strict'错误,但它只是导致'$ queryDelete'被无意义覆盖。 – friedo

+0

你是绝对正确的,我是集中在错误和忽视了:) – pajaja

相关问题