2010-01-10 3 views
2

이 코드가 자동으로 실패하는 이유는 무엇입니까? SQL 오류가 무엇인지 정확하게 알려주려면 어떻게해야합니까? Perl의 DBI -> connect 사용이 자동으로 실패하는 이유는 무엇입니까?

$dbh=DBI->connect($db_name,$db_user,$db_pass); 

나는 같이하는 코드를 수정 : 나 대신이 지정되지 않은 $dbh을 사용할 수 있도록의, 예상대로 실패 할 것이다, 그러나 그것은 실패 정확히 이유를 말하지 않는

$dbh=DBI->connect($db_name,$db_user,$db_pass) 
    or die("could not connect to db: $db_name"); 

. $db_name 등의 값은 모두 내가 볼 수있는 한 유효한 값으로 설정됩니다.

나는 실제 오류 (MySQL 서버가 실제로 실행되고 있지 않음)를 알고 있지만 나중에 참조 할 경우 예를 들어 인증 실패의 원인이되는 경우 진정한 오류를보고 싶습니다.

+0

다시 말하지만, 우리에게 완전한 스크립트를 제시해주십시오 (사용자 이름과 암호를 마스킹 있지만!). 마지막 몇 가지 질문에 대한 답은 나와 있지 않은 내용과 관련이 있습니다. –

+0

@brian 죄송합니다. 나는이 실수를 다시하지 않을 것이다. –

답변

8

connect이 실패한 이유는 보이지 않습니다. DBI에 표시 할 작업을 수행하고 있지 않기 때문입니다. 이 오류는 $DBI::errstr 변수에있을 것입니다 :

$dbh = DBI->connect($data_source, $username, $password) 
    or die $DBI::errstr; 

하면 사용하려는 어떤 기능이나 방법에 대한 설명서를 참조하십시오. :)

+0

Okie dokes, 지금부터 사용하겠습니다. –

+0

이제 나 자신의 답변을 볼 수 있습니다. 나는 당신이 나의 앞에 약간 대답을 제출했다고 생각하기 때문에 그것을 쓰는 동시에 그것을 발견했다고 생각한다. 올바른 대답이라면 (내가 불평하는 것이 아니라면) 대답을 수락하는 것에 대해 나쁘게 생각하지 마십시오. –

+0

하하, 걱정하지 마세요, 나는 당신의 코드를 더 좋아합니다. –

2

아하는 오류가 $DBI::errstr에 저장됩니다, 그래서 나는 그렇게처럼 내 코드를 수정할 수 있습니다

$dbh=DBI->connect($db_name,$db_user,$db_pass) 
    or die("could not connect to db: $DBI::errstr"); 

이 문서에 따르면,이 디자인에 의해 자동으로 실패합니다.

+1

당신은 추측 할 필요가 없습니다. 그것은 DBI 문서에 설명되어 있습니다. :) 물론 –

+0

@ 브라이언 아. 내가 얼마나 어리석은 지, 나는 항상 내가 무엇을 놓치지 않도록 문서를 다시 읽어야한다. –

1

연결시 옵션으로 RaiseError => 1을 전달하면 오류가 발생하면 스크립트가 종료됩니다. 내 Perl 상점의 표준 구성은 다음과 같습니다.

{ 
    RaiseError => 1, 
    PrintError => 0, 
    AutoCommit => 1, 
    mysql_auto_reconnect => 1, 
} 
+0

니스. 표준 구성은 어떻게 설정합니까? –

+1

공식적인 방법이있을 수 있습니다. DBI를 서브 클래스 화하고 connect 메소드를 대체 할 수 있습니다. 우리 프로젝트에는 YAML의 구성을로드하는 고유 한 DBH 분배 모듈이 있습니다. – rjh

+0

문제 없습니다, 팁 주셔서 감사합니다. –

0

'or'은 구문 오류입니다. 나열된 코드가 전혀 실행되지 않아야합니다.

당신이 원하는 : or die... 원래 문으로 새 문장의 일부입니다

$dbh=DBI->connect($db_name,$db_user,$db_pass) 
    or die("could not connect to db: $db_name"); 

하는 것으로.

+0

죄송합니다. 잘 보였다. 나는 지금 이것을 바로 잡았다. 하지만 어쩌면 당신의 대답은 코멘트 였을까요? –

+0

코드를 입력하지 마십시오. 사용중인 실제 코드를 잘라내어 붙여 넣습니다. 지금까지 몇 번 언급 했었지만 사용중인 실제 코드를 표시하는 대신 문법 오류와 같이 사용자가 제시 한 문제에 답하기 위해 사람들의 시간을 악용하는 경우가 있습니다. 더 나은 답변을 얻을 수 있고 사람들에게 부담을 덜어 주어 무료로 도움을 줄 수 있습니다. 그렇게하십시오. :) –

+0

@brian 네, 네가 완전히 옳다. 너의 시간을 낭비하게되어 너무 유감이다. 나는 이것에 관해 당신이 잔소리하는 것을 얼마나 싫어하는지 상상할 수 있습니다. ;) –

0

$ 값을 포함 해보세요! 너의 죽음의 메시지에.

$dbh = DBI->connect($db_name, $db_user, $db_pass) 
    or die("could not connect to db ($db_name): $!"); 

$! in perldoc perlvar을 참조하십시오.

+0

아, 흥미 롭습니다. –

+1

DBI가'$! '을 설정하지 않았으므로 도움이되지 않습니다. "undef"를 반환하고'$ DBI :: err'와'$ DBI :: errstr'를 설정합니다 (명시 적으로'$!'를 설정하지 않았습니다.) "문서 참조 :"연결이 실패하면 (아래 참조) – bazzilic

1

여기 내 용도는 rjh's answer입니다. 나는 내가 die 접근 방식을 통해이 선호 생각하지만, 확실하지 아직 ...

$dbh = DBI->connect($data_source, $username, $password, { RaiseError => 1 }); 
관련 문제