2014-03-19 4 views
-1

나는 PHP, OOP 및 MySQLI를 더 배우려고 노력하고 있지만 막혀있다. Google이 나를 도와주지 않았고이 웹 사이트에서 검색 한 결과 나도 결과를 얻지 못했습니다. 나는 데이터베이스에 연결하는 설정 클래스를 가지고 있고, 다른 클래스에 좀 쿼리를 실행하려면,하지만 난 노력하고 무엇 이건이 오류를 얻고있다 :간단한 PHP OOP 및 MySQLI

Fatal error: Call to a member function query() on a non-object in test.php on line 9

는 누군가가 저를 도와 주실 수 있습니까?

의 config.php :

<?php 

class Database 
{ 
    private $host; 
    private $user; 
    private $password; 
    private $db; 
    private $mysqli; 


    function __construct() { 

     $this->host  = "private"; 
     $this->user  = "private"; 
     $this->pass  = "private"; 
     $this->data  = "private"; 

     $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->data); 
    } 


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

test.php :

<?php 
class Dummy 
{ 
    private $Database; 

     function __construct() 
    { 
     $this->Database = new Database(); 
     $this->Database->test = $this->mysqli->query("SELECT test FROM test")->fetch_object()->test; 
     } 
} 
?> 

의 index.php :

<?php 

require 'config.php'; 
require 'test.php'; 

$test = new Database(); 
$test = new Dummy(); 

echo $this->Database->test; 
?> 
+0

도움이되기를 바랍니다? – samayo

+0

그 라인을 확인하십시오. 당신이'query'라고 부르는 것을보세요 -> 현재 ('Dummy') 클래스의'mysqli' 객체입니다. 하지만 그걸로 불리는 것은 아무것도 없습니다. 그래서 그것은 존재하지 않습니다. – Nanne

+0

자세히 알아보기 [이 repo] (http://github.com/simon-eq/pdowrapper) 당신이 그것을 잘못하고 있다고 생각하기 때문에, 당신이 클래스 – samayo

답변

3

종속성 삽입을 사용하는 방법에 대해 Database 객체를 만든 다음이를 통해 매개 변수로 전달합니다.

<?php 
$db = new Database('127.0.0.1','root','pass','database'); 
$dummy = new Dummy($db); 


$dummy->get_test_yada(); 
?> 

안된

<?php 
class Database 
{ 
    private $host; 
    private $user; 
    private $password; 
    private $db; 
    private $mysqli; 


    function __construct($host,$user,$pass,$data) { 

     $this->host  = $host; 
     $this->user  = $user; 
     $this->pass  = $pass; 
     $this->data  = $data; 
     $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->data); 
    } 

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

...

<?php 
class Dummy 
{ 

    function __construct(Database $db) 
    { 
     $this->db = $db; 
    } 

    function get_test_yada(){ 
     return $this->db->mysqli->query("SELECT test FROM test")->fetch_object()->test; 
    } 
} 
?> 

는 ..., 그것은 /`gw2Database` 무엇

+2

fyi 내에서 귀하의 질문을 hardcodding하는 경우, PDO로 전환하면 데이터베이스의 모든 유형을 수행 할 수있는'Database' 수퍼 클래스를 빌드하려면 클래스를 통해 원하는 DB 유형을 전달할 수 있습니다. 그런 다음 Dummy 모델은 Database를 가졌습니다. –

0
$this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->data); 

연결이 실패하면, 당신은 아무것도 호출 할 수 없습니다 해당 멤버 변수에. 먼저 연결이 설정되었는지 확인하십시오.

그리고 변수에 액세스하려면 공개로 설정해야합니다.

1

세상에, 한번에 모두 배우지 마십시오. 너는 합리적인 결과를 얻지 못할 것이다.

각각은 어렵고 복잡한 주제이며 OOP는 가장 어렵습니다.

데이터베이스 상호 작용의 경우 PDO 준비 문을 사용하십시오.

OOP 연습으로 클래스를 서비스에서 확장하지 말고 클래스 변수로 사용하십시오.

class Dummy 
{ 
    protected $db; 

    function __construct($pdo) 
    { 
     $this->db = $pdo; 
    } 

}