2014-03-19 6 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

Что/Где 'gw2Database'? – samayo

+0

проверить это line. посмотрите на то, что вы вызываете 'query' on -> это объект' mysqli' в текущем классе ('Dummy'). Но это ничего не называется. поэтому его не существует. – Nanne

+0

Учитесь у этого репо (http://github.com/simon-eq/pdowrapper), потому что, я думаю, вы делаете это неправильно, если вы жестко задаете свои запросы внутри своего класса – samayo

ответ

3

Как насчет использования инъекции зависимостей, создайте объект базы данных, затем передайте это как параметр классу через конструкцию.

<?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; 
    } 
} 
?> 

...

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


$dummy->get_test_yada(); 
?> 

Непроверено, надеюсь, что это помогает

+2

fyi, переход на PDO позволит вам для создания суперкласса «База данных», который может делать любой тип базы данных, тогда вы можете передать тип db, который вы хотите для класса, через конструкцию, тогда ваша модель Dummy не будет заботиться об особенностях базы данных, просто имея в ней базу данных. –

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

При подключении не работает, вы не можете назвать что-нибудь на эту переменную-член. Проверьте, установлено ли ваше соединение.

И, если вы хотите иметь доступ к этой переменной, вы должны сделать ее общедоступной.

1

Ради всего святого, НЕ изучите их все сразу. Вы не получите никакого разумного результата.

Каждый из них представляет собой сложную и сложную тему, из которых ООП сложнее.

Для взаимодействия с базой данных PDO подготовленных операторов.

Как практика ООП, никогда не расширяйте класс из службы, а используйте ее как переменную класса.

class Dummy 
{ 
    protected $db; 

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

} 
Смежные вопросы