2011-08-17 2 views
1

제발 내가 몇 시간 동안 노력해 왔던이 코드로 문제를 추적하는 데 문제가 있습니다. 그것은 나에게 오류 DBD를 제공 :: mysql을 :: 번째 fetchrow_hashref 실패 :이 문제의 경우 15perl에서 DBD와 mysql에 문제가 발생했습니다

 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에서 :

는 다시 실행되거나 파괴하기 전에 을 처리 할 데이터가 더 이상이 문에서 가져온되지 않음을 나타냅니다. 거의 확실하게 이 메서드를 호출 할 필요가 없습니다. 캐치되지 않는 가져 오기 오류와 같은 모든 행을 가져옵니다 루프 후 마무리 호출을 추가

공통 실수, 그것을하지 않습니다, 그것은 진정한 문제를 마스크 할 수 있습니다.

문제가 발생하면 선택 호출에 대한 두 번째 명령문 처리기를 만들 수 있습니다.

+0

바보 같은 날. 그것은 일했다!! 다른 문장 처리기를 만들어야했습니다. 감사 – damola

1

$ labelString에 쿼리를 중단 시키거나 주입을 일으킬 수있는 내용이 포함되어있는 경우 귀찮아 긴 SQL 변수 이름 외에 $ SelectString에 "?"가 포함되어야합니다.

prepare()에는 반드시 "?"가 필요하지 않지만 execute 매개 변수가 있으면 일치하는 수의 "?"가 있어야합니다. 쿼리 문자열에.

첫 번째 $ sth-> finish()는 쿼리가 삽입이기 때문에 필요하지 않으며 행을 반환하지 않습니다.

두 번째로 '다이'는

참고 SQL 대회가 대문자로 모두를 작성하는 것입니다 $의 SelectString을 실행하기 때문에, "오류 실행 쿼리", 그리고 역 따옴표에 추가 안전 묶으 필드 이름에 대한합니다. 검색어는 세미콜론으로 끝나지 않습니다. 또한 "my"변수는 중괄호 사이의 변수 {{}에 국한되므로 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}; 

    } 
관련 문제