2013-07-29 27 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

相關問題