2013-07-25 37 views
-1

我希望將數據插入到數據庫中未定義的值「執行」,但它讓我看到以下錯誤:Can't call method "execute" on an undefined value at C:/wamp/bin/apache/apache2.2.22/cgi-bin/ova/laura/shto.pl line 47.無法調用在

my $q= new CGI; 
    print $q->header; 
    print $q-> start_html(
     -title => " ", 
    ); 

    my $db = "peoples"; 
    my $user = "root"; 
    my $pass = ""; 
    my $host ="127.0.0.1"; 
    my $dbh = DBI->connect("DBI:mysql:$db:$host", $user, $pass); 
    my $name   = $q->param("Name"); 
    my $surname   = $q->param("Surname"); 
    my $$gender   = $q->param("Gender"); 
    my $dId = $q->param("pID"); 
    my $departamentiId = $q->param("dID"); 

    my $sql = "INSERT INTO person (Name, Surname, Gender, pID, dID) 
       VALUES ('$name', '$surname', '$gender','$pId','$dId')"; 

    my $sth = $dbh->prepare($sql); 
    my $sth->execute() or die $DBI::errstr; 
    my $sth->finish(); 
    my $dbh->commit or die $DBI::errstr; 

可能是什麼錯誤?

+0

將'使用警告'添加到您的代碼中。閱讀文檔以瞭解「我的」用於什麼。 –

回答

4

刪除my形成您不想聲明新變量的行。

使用use warnings會告訴你:

"my" variable $sth masks earlier declaration in same scope at -e line 1. 

此外,使用佔位符來構造SQL查詢,他們是safer

my $sql = 'INSERT INTO personi (Emri, Mbiemri, Seksi, Pozicioni_ID, Departamenti_ID) 
      VALUES (?, ?, ?, ?, ?)'; 
my $sth = $dbh->prepare($sql); 
$sth->execute($emri, $mbiemri, $gjinia, $pozicioniId, $departamentiId) or die $DBI::errstr; 
+0

好的,謝謝你現在的作品。請看看http://stackoverflow.com/questions/17852904/deleting-and-updating-data-from-database我找不到問題,我今天真的需要它 – Armida

+0

@Armida:同樣的錯誤。使用警告,不要使用'my'來進行方法調用。 – choroba

+0

請編輯它,因爲它仍然不起作用。我真的需要你的幫助 – Armida

2

的問題是這兩條線:

my $sth = $dbh->prepare($sql); 
my $sth->execute() or die $DBI::errstr; 

他們應該閱讀:

my $sth = $dbh->prepare($sql); 
$sth->execute() or die $DBI::errstr; 

原因是第二行的my重新聲明瞭變量$sth(因此擦除了包含STH對象的舊變量$ sth);在重新申報時,新的$sth將像所有新申報的變量一樣初始化爲undef

你應該閱讀下面的文檔來了解變量範圍在Perl:在PerlMonks

  • my

  • 0

    上choroba的回答稍微捎帶。我也喜歡,以確保「默認」值從返回「參數()」是理性的,一拉:

    my $emri   = $q->param("Emri")   || undef; 
    my $mbiemri   = $q->param("Mbiemri")  || "August"; 
    my $gjinia   = $q->param("Gjinia")   || 0; 
    my $pozicioniId  = $q->param("pozicioniId") || "none"; 
    my $departamentiId = $q->param("departamentiId") || 82.4; 
    

    「參數()」返回「民主基金」缺失值。即使在參數化查詢時發現undef值可能不是您所期望的。

    +0

    傳入值'0'將觸發您的默認設置;只是需要注意的一點 - 例如,如果pozicioniId的有效值是'0'。 – asjo

    +0

    是的,你對零值是正確的。我只希望分享一個簡單的技術樣本,如果你對入站數據有一定的瞭解,那麼這個技術就可以工作。我還沒有嘗試過,但你可以做一些像'my $ foo = defined($ q-> param(「foo」))? $ q-> param(「foo」):「一個默認值」;' –

    +0

    您也可以使用「//」,即「||」只檢查定義而不是真實性(我認爲從Perl 5.10開始)。 – asjo