2011-08-17 98 views
1

請問我用這段代碼我已經嘗試了好幾個小時,它給我的錯誤DBD :: mysql的:: ST fetchrow_hashref失敗:取()不執行()在第15行DBD和mysql在perl中出現問題

 sub Split_Into_Words 
     { 
      #### Connection parameters ############################ 
      my $dsn = "dbi:mysql:malware:localhost:3306"; 
      my $user = 'root'; 
      my $passwd = 'sxxxs'; 
      ######################################################## 
      my $domain ; 
      my $countDir = 0 ; 
      my $file = shift ; 
      my $labelID = (split(/[.]/ , $file))[1] ; ### Split and get the middle value since format is temporay. 

      #### Query String ############################################################################ 
      my $InsertIntoHostTable_QS = "INSERT INTO TB_host(HostName , UrlID , ExtID) Values (? , ? , ?) ; "; 
      my $InsertIntoDomainTable_QS = "INSERT IGNORE INTO TB_Domain(Domain) values (?) ;" ; 
      my $InsertIntoArgVal_QS = "INSERT INTO TB_Arg_Value(Arg, URL_ID) VALUES (? , ?) ; " ; 
      my $InsertIntoDirectory_QS = "INSERT INTO TB_Directory(DIRNAME , DEPTH , URLID) VALUES (? , ? , ?)" ; 
      my $InsertIntoExtension_QS = "INSERT IGNORE INTO TB_Extension (Extension) values (?) ; "; 
      my $InsertIntoExtensionNULL_QS = "INSERT IGNORE INTO TB_Extension (ID , Extension) values (? , ?) ; "; 
      my $SelectString = " Select URL , ID from TB_URL where LabelID = '" . $labelID."';"; 
      my $InsertIntoFileName_QS = "INSERT IGNORE INTO TB_FileName(filename) VALUES (?) ; " ; 

      ################################################################################################### 
      my $DBIConnect = DBI->connect($dsn , $user , $passwd) or die("Cannot connect to datadbase $DBI::errstr\n"); 


      print ("Splitting Into Words \n"); 


      ######Initialization of a default DB value ################# 
      my $sth = $DBIConnect->prepare($InsertIntoExtensionNULL_QS); 
        $sth->execute(1 , 'null') or die("Error Executing the Insertion" . $sth->errstr); 
        $sth->finish(); 
      ############################################################# 
      $sth = $DBIConnect ->prepare($SelectString); 
      sleep(10); 
      open (FH , '<' , $file); # Open file to be read from disk 

      my $i = 0; 
      $sth->execute() or die("Error Executing the Insertion" . $sth->errstr); 

    ->line 15  while(my $hash_ref = $sth->fetchrow_hashref) 
      { 
        my $extensionID = "1"; 
        my $intialURL = $hash_ref->{URL} ; 

       my $initialID = $hash_ref->{ID}; 
    } 
    } 
+2

首先,把一個'...或死$ dbh-> errstr;'畢竟是準備'()'調用。其次,在'$ SelectString'的SQL中,將'$ labelID'變成綁定參數,而不是像這樣連接。我懷疑解決這兩個問題可以解決問題,或者讓問題更加明顯。 – frezik

回答

2

我不知道這是否是問題,但你可能不需要完成插入後。從DBI doc

表明,沒有更多的數據將從這個語句獲取處理 之前要麼重新執行或摧毀了它。你幾乎可以肯定 不需要調用這個方法。

添加調用來完成循環後取回所有行是一個共同的 錯誤,不要這樣做,它可以掩蓋真正的問題,如未捕獲的錯誤提取 。

如果這是問題,您可能需要爲select調用創建第二個語句處理程序。

+0

傻我。有效 !!我只需要創建另一個語句處理程序。謝謝 – damola

1

除了煩人的SQL變量名,$ SelectString應該包含一個「?」,以防$ $ labelID包含可能破壞查詢或導致注入的內容。 prepare()並不一定需要「?」,但如果execute有參數,那麼必須有一個匹配的數字「?」。在查詢字符串中。

首先$ sth-> finish()是不需要的,因爲查詢是一個插入並且不返回任何行。

二「模」應該是「執行錯誤查詢」,因爲它執行$ SelectString

注意SQL約定是寫全部大寫,並在反引號額外的安全的封裝字段名。查詢不以分號結尾。另請注意,「我的」變量是大括號之間的變量的本地變量,因此,後面的while循環中的變量將不可用。

因此,建議格式化:

所有的
sub Split_Into_Words { 
    #### Connection parameters ############################ 
    my $dsn = "dbi:mysql:malware:localhost:3306"; 
    my $user = 'root'; 
    my $passwd = 'sxxxs'; 
    ######################################################## 
    my $domain ; 
    my $countDir = 0 ; 
    my $file = shift ; 
    my $labelID = (split(/[.]/ , $file))[1] ; ### Split and get the middle value since format is temporary. 

    #### Query String ############################################################################ 
    my $InsertIntoHostTable_QS = "INSERT INTO `TB_host` (`HostName`,`UrlID`,`ExtID`) VALUES (?,?,?)"; 
    my $InsertIntoDomainTable_QS = "INSERT IGNORE INTO `TB_Domain` (`Domain`) VALUES (?)"; 
    my $InsertIntoArgVal_QS  = "INSERT INTO `TB_Arg_Value` (`Arg`,`URL_ID`) VALUES (?,?)";. 
    my $InsertIntoDirectory_QS = "INSERT INTO `TB_Directory` (`DIRNAME`,`DEPTH`,`URLID`) VALUES (?,?,?)"; 
    my $InsertIntoExtension_QS = "INSERT IGNORE INTO `TB_Extension` (`Extension`) VALUES (?)"; 
    my $InsertIntoExtensionNULL_QS= "INSERT IGNORE INTO `TB_Extension` (`ID`,`Extension`) VALUES (?,?)"; 
    my $SelectString    = "SELECT `URL`,`ID` FROM `TB_URL` WHERE `LabelID`=?"; 
    my $InsertIntoFileName_QS  = "INSERT IGNORE INTO `TB_FileName` (`filename`) VALUES (?)"; 

    ################################################################################################### 
    my $DBIConnect = DBI->connect($dsn , $user , $passwd) or die("Cannot connect to datadbase $DBI::errstr\n"); 

    print ("Splitting Into Words \n"); 

    ######Initialization of a default DB value ################# 
    my $sth = $DBIConnect->prepare($InsertIntoExtensionNULL_QS); 
    $sth->execute(1 , 'null') or die("Error executing the Insertion: " . $sth->errstr); 
    # $sth->finish(); # not needed because it's an insert 

    ############################################################# 
    $sth = $DBIConnect->prepare($SelectString); 
    sleep(10); 
    open (FH , "<$file"); # Open file to be read from disk 

    my $i = 0; 
    $sth->execute($labelID) or die("Error executing query: " . $sth->errstr); 

    while(my $hash_ref = $sth->fetchrow_hashref) { 
     my $extensionID = "1"; 
     my $intialURL = $hash_ref->{URL}; 
     my $initialID = $hash_ref->{ID}; 

    } 
相關問題