2015-01-14 1 views
2

네임 스페이스 및 PDO는 지금 경험하고 있으므로 지옥으로 간주됩니다.올바르게 수행하는 동안 PDO 네임 스페이스를 찾을 수 없습니다.

public static function init() 
    { 
     global $_CONFIG; 
     try 
     { 
      self::$conn = new \PDO('mysql:hostname=127.0.0.1;dbname=c_red,root,123',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
     } 
      catch(PDOException $e) 
     { 
      throw new PDOException ($e->getMessage); 
     } 
     date_default_timezone_set('Europe/Amsterdam'); 
    } 

는 난 네임 스페이스에없는 것을 설정하는 PDO의 앞에 \ 아닌 작업 그 것이다 :이처럼 연결하고있어 경우

Warning: include_once(C:/xampp2/htdocs\application\classes\class.pdo.php): failed to open stream: No such file or directory in C:\xampp2\htdocs\application\bootstrap.php on line 18 

Warning: include_once(): Failed opening 'C:/xampp2/htdocs\application\classes\class.pdo.php' for inclusion (include_path='.;C:\xampp2\php\PEAR') in C:\xampp2\htdocs\application\bootstrap.php on line 18 

Fatal error: Class 'C_Red\Storage\PDO' not found in C:\xampp2\htdocs\application\classes\class.database.php on line 13 

어떻게 이런 일이있다 일하는거야?

이 오류는 어떻게 가능합니까?

감사합니다.

+1

내가 포함 선언에 백 슬래시/슬래시를 사용하여 검사를 시작할 것입니다. 나는 $ _CONFIG [ 'database'] [ 'hostname']이 시스템에 어떤 슬래시를 사용해야 하는지를 확신하지 못했습니다. –

답변

2

단지 new \PDO() 생성자가 네임 스페이스이어야하며 그 상수 및 예외에 대한 참조도 아닙니다. 당신은 PDO 생성자에서 나중에 속성을 선언하지만, 백 슬래시를 네임 스페이스하지 않습니다

// First fix the namespacing... 
self::$conn = new \PDO('mysql:hostname=127.0.0.1;dbname=c_red,root,123',array(\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION)); 
//--------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

그래서 오류 메시지가 당신이 new PDO()에보고하지만 PHP는 실제로 같은 라인에 대한 PDO::ATTR_ERRMODE을 불평 이어집니다. 같은

catch 블록에 간다 :

catch(\PDOException $e) 
{ 
    throw new \PDOException ($e->getMessage); 
} 

둘째, 당신은 사용자 이름과 암호 전에 DSN 문자열에 닫는 따옴표가 누락되었습니다. 생성자는 완전히 같아야 다음 DSN 문자열의 'root''123' 생성자에 별도의 인수입니다

// user, password are 2nd, 3rd arguments to constructor! 
self::$conn = new \PDO('mysql:hostname=127.0.0.1;dbname=c_red', 'root', '123', array(\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION)); 

... 하지 부분. 댓글 후 the use keyword 사용에 대한

참고 :

use \PDO; 

와 네임 스페이스에 PDO를 가져올 수

당신이 백 슬래시를 접두사없이 PDO와 상수를 이용 할 수있다. 그러나 은 네임 스페이스 내에 예외가 없으므로 use \PDOException이어야합니다 (그러한 네임 스페이스가 없음). 둘 다 전역 네임 스페이스에 있으므로 use을 사용하여 가져올 수는 없습니다. 내 의견으로 설정하고 접두어를 계속 사용하려면 \PDO\PDOException으로 처리하는 것이 좋습니다.

+0

파일 상단에'use \ PDO; '를 넣는 것은 어떨까요? 그게 싫은가? (네임 스페이스에 상당히 새로운 사람으로 말하면서)? –

+0

@JesseKernaghan 그것은 정말로 의견의 문제입니다. 글로벌 네임 스페이스 (예 : PDO)의 경우 일반적으로 '사용'하지 않습니다. 그렇게 할 수는 있지만'PDOException'도'use PDOException'으로 선언해야합니다. PDO가 자체 네임 스페이스를 갖고 있다면, '사용'하는 것이 편리 할 것입니다. 여기서도 예외에 액세스 할 수 있습니다. –

관련 문제