2013-03-11 2 views
0
$DB_HOST = "localhost"; 
$DB_NAME = "rawr"; 
$DB_USER = "rawr"; 
$DB_PASS = "hunter2!"; 
$tableprefix = "hunter_"; 
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 
    class ACL 
{.... 

У меня это есть, но я не могу использовать это соединение db во всех своих командах ACL. Как я могу получить возможность использовать это соединение db внутри моего класса?Как ссылаться на базу данных в php-классе

+0

Приятный пароль ;-)). –

+0

@BartFriederichs, это честно не реально. – 2013-03-11 21:41:57

+0

Я получил это, я тоже прочитал bash.org –

ответ

1

Ваш $ mysqli просто выходит из сферы действия. У вас есть варианты:

1) Используйте глобальные переменные.

function XXXX() { 
    global $mysqli; 
    ... 
} 

2) Передать его в конструктор (это лучше)

public function __construct($mysqli) { 
    $this->_mysqli = $mysqli; 
} 

А потом обратиться к нему из вашего класса только с $this->_mysqli

+0

неожиданный T_OBJECT_OPERATOR – 2013-03-11 21:47:56

+0

какая версия PHP вы используете? – bgusach

+0

Ах да, извините, я положил знак $ в неправильном месте. Попробуйте с '$ this -> _ mysqli = $ mysqli;' – bgusach

0

Вам необходимо передать этот экземпляр mysqli в ваш класс ACL при его создании. Он не знает автоматически о локальных переменных, объявленных вне объявления класса.

+0

Буду ли я это делать в конструкции? Как мне это сделать? – 2013-03-11 21:43:57

+0

Да. Просто примите параметр '$ db' или что-то в вашей функции' __construct() 'и передайте это при создании нового' ACL'. – Brad

0

Убедитесь, что соединение вы используете в правильной среде. Вы можете сделать это, например. с global:

class ACL { 
    function DoSomething() { 
     global $mysqli; 
     ... 
    } 
} 
0
class ACL { 

     public function __construct() { 
      $DB_HOST = "localhost"; 
      $DB_NAME = "rawr"; 
      $DB_USER = "rawr"; 
      $DB_PASS = "hunter2!"; 
      $tableprefix = "hunter_"; 
      $conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
      if (mysqli_connect_errno()) { 
        printf("Connect failed: %s\n", mysqli_connect_error()); 
        exit(); 
      } else {  
        $this->conn = $conn; 
      } 
     } 

     public function command1() 
     { 
      //use connection object as $this->conn 
      ///your code 
     } 
} 
+0

Не приведет ли это к более чем одному соединению на загрузку php-страницы? – 2013-03-11 21:58:07

+0

да ...вы можете написать еще одну закрытую функцию, чтобы закрыть соединение, а затем вызвать его во всех ваших командах или изменить частную функцию connect() на публичную функцию __construct() – Girish

0

вы можете обернуть MySQLi в классе, таких как:

class database { 
    // do database stuff here 
} 

и расширить ACL

class ACL extends database { 
    // do acl stuff here with all your database stuff available 
} 
+1

Хотя это работает, это против ООП. ACL не является базой данных. – bgusach

0

Вот другой подход. Аннотация подключение вашей базы данных в отдельный служебный класс:

<?php 
class DB 
{ 
    const DB_HOST = "localhost"; 
    const DB_NAME = "rawr"; 
    const DB_USER = "rawr"; 
    const DB_PASS = "hunter2!"; 

    protected static $instance; 
    public static function instance() 
    { 
     if (empty(self::$instance)) 
     { 
      self::$instance = new mysqli(self::DB_HOST, self::DB_USER, self::DB_PASS, self::DB_NAME); 
     } 

     return self::$instance; 
    } 
} 

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

<?php 

// Note: make sure DB class is loaded! 

class ACL // Note: this doesn't extend DB! 
{ 
    public function __construct() 
    { 
     // you can now access your $mysqli object with DB::instance() 
    } 
} 
Смежные вопросы