2011-08-17 159 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}; 

    } 
相关问题