2014-01-13 2 views
1
require("classes/controller.class.php"); 

$db = new mysqli(__DBHOST, __DBUSER, __DBPASS, __DBDATA); 
if ($db->connect_errno) { 
    printf("Connect failed: %s\n", $db->connect_error); 
    exit(); 
} 

$controller = new Controller; 

Controller 클래스 내에서 $db MySQLi 연결을 사용하고 싶습니다. 그래서 공용 함수 내에서 내가 사용 :클래스 내에서 MySQLi 객체 사용

$result = $db->query("SELECT * FROM colors"); 

var_dump($result); 

그러나 나는이 오류를 얻을 :

Fatal error: Call to a member function query() on a non-object in /home/cloud/public/teamdresser/controllers/IndexController.php on line 8 

내가 뭔가 잘못하고 오전? $db을 먼저 연결해야합니까, 아니면 전역 또는 무엇인가를 사용해야합니까? $db 전역 변수 인 경우

답변

2

, 당신은 당신의 기능에 가져해야합니다 사전에

감사 :

public function YourFunction() 
    { 
    global $db; 

    $result = $db->query("SELECT * FROM colors"); 
    .. 
    } 

대신이 일을, 당신이 $의 DB를 캡슐화 고려하는 것이 좋습니다 데이터베이스 클래스를 만들고 싱글 톤으로 만들거나 틀림없이 컨트롤러의 생성자에 전달하는 것이 좋습니다. 그러나 그 발언은 디자인에 관한 새로운 토론으로 이어진다. 이제는 위에서 설명한 것처럼 전역 변수를 가져옵니다. ;)

+0

감사합니다. 매력처럼 일했습니다. 나는 너무 어려워서 생각하고 있었다. p –

2

당신은 당신이 연결을 생성하고 함수를 호출하여 실행 한이 방식

$result = Database::getInstance()->query("SELECT * FROM colors"); 

에서 호출

class Database { 

    private static $_instance; 

    public static function getInstance() { 

     //If the connection is not initialized, this creates it and store 
     if (empty(Database::$_instance)) 
      Database::$_instance = new Database(); 
     return Database::$_instance; 
    } 

    private $_db; 

    private function __construct() { 
     $this->_db = new mysqli(__DBHOST, __DBUSER, __DBPASS, __DBDATA); 

     if ($db->connect_errno) { 
      printf("Connect failed: %s\n", $db->connect_error); 
      exit(); 
     } 
    } 

    private function __destruct() { 
     $this->_db->close(); 
    } 

    public function query($query) { 
     return $this->_db->query($query); 
    } 

} 

싱글 인스턴스와 클래스를 사용할 수 있습니다. 스크립트가 종료되면 소멸자가 자동으로 연결을 해제합니다.

이것은 시작점 일뿐입니다. 원하는 모든 기능을 만들 수 있습니다 (예 : 이스케이프 매개 변수, 삽입, 업데이트, 삭제 등)

+0

루벤에게 감사의 말을 전한다. –

관련 문제