2014-10-23 4 views
5

데이터베이스를 연결할 수 있는지 여부에 따라 서버 상태를 표시하려고합니다. 예전 학교 mysql_connect()mysqli_connect()의 경우 쉽습니다. 현대적인 상태로 유지하려고하므로 PDO를 사용하고 있지만 기본 경고를 표시하지 않는 방법을 파악할 수는 없습니다. 내가 알 수 있듯이 PDO 경고를 인쇄하려면 getMessage() 함수를 사용해야하지만 사용하지는 않습니다.PDO 경고 억제

여기 내 코드입니다 :

8 $dbstatus = 1; 
9 try { 
10 $db = new PDO($dbms . ':host=' . $dbhost . ';port=' . $dbport . ';dbname=' . $dbname, $dbuser, $dbpasswd); 
11 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
12 } catch(PDOException $e) { 
13 $dbstatus = 0; 
14 } 
15 if($dbstatus == 1) { 
16 echo '<span style="color: green">DB Up</span>'; 
17 } else { 
18 echo '<span style="color: red">DB Down</span>'; 
19 exit; 
20 } 

모든 연결 변수가 의도적으로이 테스트 깨지는 $dbhost 제외하고, 공급 및 올바른된다. 지금, 그것은 원하는 결과를 얻을뿐만 아니라, 너무 경고 메시지를 출력한다 :

경고 : PDO :: __ 구조() : php_network_getaddresses : 실패한다 getaddrinfo : 그런 호스트는 알 수 없습니다. C에서 : \ XAMPP \ htdocs를 \ CD를 \ 줄에 dbconnect.php \를 포함 10

나는 $dbhost 변수를 수정하면 잘 작동, 그래서 문제가 PDO하지 알고 진술을 사용할 수 있습니다.

실종에 대한 아이디어가 있습니까?

솔루션

나는 제론에 의해 공급 된 것의 변형 사용 :

if(filter_var(gethostbyname($dbhost), FILTER_VALIDATE_IP)) { 
$dbstatus = 1; 
try { 
    $db = new PDO($dbms . ':host=' . $dbhost . ';port=' . $dbport . ';dbname=' . $dbname, $dbuser, $dbpasswd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
} catch(PDOException $e) { 
    $dbstatus = 0; 
} 
} else { 
$dbstatus = 0; 
} 
if($dbstatus == 1) { 
echo '<span style="color: green">DB Up</span>'; 
} else { 
echo '<span style="color: red">DB Down</span>'; 
exit; 
} 

이 도움을 주셔서 감사하고 나는이 다른 사람이 도움이되기를 바랍니다! ^^

+0

json을 반환하는 아약스 호출 내에서 경고 (잡히지 않는 것처럼 보임)는 내 마지막 두 일을 쓸모 없게 만듭니다. 이것은 –

답변

2

여기에서 볼 수있는 유일한 점은 이후에 연결을 열려고 시도한 후에 예외 을 발생 시키라는 것입니다. 너무 늦은 것 같습니다.

try { 
    $opts = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 
    $db = new PDO($dbms . ':host=' . $dbhost . ';port=' . $dbport . ';dbname=' . $dbname, 
       $dbuser, $dbpasswd, $opts); 
} catch(PDOException $e) { 
... 

아마 당신의 문제를 해결할 것입니다 :

은 당신이 대신 할 수있는 직접 4 매개 변수를 사용하여 생성자에 해당 옵션을 보낼 수 있습니다.

편집 : 호스트 이름이 사용자에 의해 제공되면 PDO 생성자로 보내기 전에 유효성을 검사 할 수 있습니다. 사용 예를 들어

: 도메인 이름, localhost 및 IP 주소에 대한 작동합니다

if (filter_var(gethostbyname($user_provided_host_name), FILTER_VALIDATE_IP)) { 
    // valid hostname/ip address 
} 

.

+0

을 괴롭혔습니다. 속성 선언을 변경해도 경고가로드되는 것을 방지하지 못했습니다. –

+0

@AoN Strange, 똑같은 것을 테스트하지는 않았지만 여기에 예외가 있습니다 (google.com의 IP 주소를 사용하여 ...). http://codepad.viper-7.com/dLZi8R – jeroen

+0

나는 생각합니다. 어디서 문제가 생겼는지. 주소 중간에 공백을 추가하여 연결을 끊고 오류가 발생합니다.적절한 도메인 (google.com) 또는 IP 주소를 입력하면 경고가 표시되지 않습니다. 잘못 입력 된 "localhost"또는 IP를 사용하면 경고 메시지가 나타납니다. 기술면에서는 좋지만 DB가 있는지 여부를 알고 자하는 사용자에게는 그다지 중요하지 않습니다. 어쨌든 이것을 보상 할 줄 아세요? '$ dbhost' 변수에'rawurlencode()'를 시도했지만 경고문에는 아무런 영향을 미치지 않았습니다. : S –