2012-11-08 10 views
3

쿼리를 대화식으로 확인할 때 하나의 행과 열만 생성하는 mysql- 쿼리를 사용하면 원하는 결과를 볼 수 있습니다. 그러나 내가 사용할 때 $sth->fetchrow_hashref; 나는 undef를 얻는다. 여기에 무엇이 잘못 되었을지 모르는 사람이 있습니까? 어떤 방향 으로든 어떤 점에 대해서 감사드립니다 .y 결과가 나타납니다.dbi는 비어있는 것처럼 undef를 제공하지만 쿼리 결과는 mysql에서 결과를 산출합니다.

sub _get_next_hashref 
{ 
    my $self = shift; 
    if($self->{sth} ne '') { 
    if(my $hash_ref = $self->{sth}->fetchrow_hashref) 
    { 
     return $hash_ref; 
    } else { 
     $self->{sth} = ''; 
     return undef; 
     } 
    } else { 
    return undef; 
    }  
} 

몇 가지 추가 정보 :

이 직접 실행 후에 완료됩니다 limit 1
쿼리 실행 끝, 그렇게 만 항상 하나 개의 행이 있어야합니다. 어떤 이유로 든 더 많은 행이 완벽하게 작동하지만 in-data는 한 행 결과 만 생성하는 데이터가 작동하지 않습니다.

$sql = "select sort_order from forum.metatag_sort where metatag=? order by id desc limit 1"; 
$self->{sth} = $self->{dbh}->prepare($sql); 
if($self->{sth}->execute(@args)) { 
    return _get_next_hashref(); 
} 

이내 @args는 메타 태그, int입니다.
select count(sort_order) from forum.metatag_sort where metatag=? 이 1보다 큰 답변을 반환하는 경우는 완벽하게 작동하지만이 경우 정확히 1을 반환하는 경우 오류가 발생합니다.

+0

결과를 실제로 생성하는 코드 전체를 보여주십시오. 우리는 보통 투시력이 없습니다. –

+0

우리에게 쿼리와 실행 방법을 보여줍니다. – simbabque

+1

이제'_get_next_hashref' 함수를 실제로 호출하는 코드를 보여줍니다. 또한'$ self -> {sth}'과'ne'를 비교할 필요가 없습니다. '$ self -> {sth}'가 존재하면 true가 될'if ($ self -> {sth})'를 간단히 수행하고 Perl을 정의하고 일반적으로 trueish로 만듭니다. 의미있는 것은 저장된 문장 핸들이 있다면 사실입니다. 빈 문자열은 거짓입니다. –

답변

0

당신은 SQL 문자열에 $sql을 설정하는 잊어 버린 것 같습니다 :

"select sort_order from forum.metatag_sort where metatag=? order by id desc limit 1" 
$self->{sth} = $self->{dbh}->prepare($sql); 

당신이 strictwarnings를 사용하고 있습니까? 이것을 고려하십시오 : 다음

"some code"; 
print "bar"; 

use warnings는 당신에게이 줄을 말해야한다 : scratch.pl 라인에서 무효 컨텍스트에서 상수 (일부 코드)의

쓸모없는 사용을 5318.


코드를 약간 자유롭게 변경할 수있었습니다.

  • @모 츠츠 쿠커 스는 말했다. $self->{sth}과 비교할 필요는 없습니다. 명령문 핸들이 있으면 true입니다. 그렇지 않은 경우 거짓입니다.
  • 'then'블록에 return이 있으면 else 블록에 return을 넣지 마십시오. else은 필요하지 않습니다. if- 문구 아래에 넣으십시오.
  • return은 항상 undef을 반환합니다. ProhibitExplicitReturnUndef을 참조하십시오.여기

내가 그것을 할 거라고 방법은 다음과 같습니다

sub _get_next_hashref { 
    my ($self) = @_; 
    if ($self->{sth}) { 
    if(my $hash_ref = $self->{sth}->fetchrow_hashref) { 
     return $hash_ref; 
    } 
    # this will only be called if there was no result, thus no else needed 
    undef $self->{sth}; # set to undef (or = '') if you must 
    } 
    # see above 
    return; # returns undef if no param is given 
} 
+0

변수 $ sql은 다른 장소에 있지만 내가 게시 한 정확한 문자열로 설정됩니다. 그것은 코드를 줄이고 가독성을 높이 겠지만 불행히도 내 문제를 해결하지 못한다.'fetchrow_hashref'는 undef를 반환하고 응답을 리턴해야한다. – user1808687

1

귀하의 _get_next_hashref - 정의는 어떤 클래스의 방법처럼 보이지만 당신은 함수처럼 호출 :

if($self->{sth}->execute(@args)) { 
    return _get_next_hashref(); 
} 

은 그래서 더를 얻을 수 객체 정보이며 undef 이외의 어떤 것도 반환 할 수 없습니다.

+0

'_get_next_hashref'는 대부분의 경우에 잘 작동합니다. 설명 된 작업 시나리오에 대한 해시 값을 반환합니다. – user1808687

+1

@ user1808687 : 그 외에도 당신은 그것을 기능적이라고 부릅니다. 확실히'$ my_object -> _ get_next_hashref'를 좋아하지 않을까요? 그렇다면 '내 $ 자기 = 교대;'는 효과가있을 수 있습니까? –