2013-07-26 2 views
0

У меня есть следующий запрос к базе данных, который отлично работает, но в другом вопросе ранее мне было доведено до сведения, что я использую глобальный, когда это не нужно. Причиной этого было то, что я попытался использовать защищенную переменную, но был новичком в ООП, не смог заставить его работать.Как использовать защищенную переменную вместо «global» в этом классе?

Возможно, кто-то может показать мне, как это должно быть сделано?

<? 
class DB { 

    public function __construct() { 

    global $dbh; 

    try { 
     $dbh = new PDO('mysql:host=localhost;dbname=main_db', 'my_user', 'my_pass'); 
     $dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
    } 

    public function getFAQCats2Array() { 

    global $dbh; 

    try { 
     $q = ' 
      SELECT 
       `id`  AS ci, 
       `name`  AS n 
      FROM 
       `faqcat`; 
     '; 

     $s = $dbh->query($q); 

     // initialise an array for the results 
     $A = array(); 

     while ($r = $s->fetch(PDO::FETCH_ASSOC)) { 
      $A[] = $r; 
     } 

     $s = null; 
     return $A; 
    } 

    catch(PDOException $e) { 
     echo "Something went wrong fetching the list of FAQ categories from the database.\n"; 
     file_put_contents(
      $_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt", 
      "\n\n\n\n".$e->__toString(), FILE_APPEND); 
    } 
    } 

    public function getFAQ($i, $f) { 

     global $dbh; 

     try { 
     $q = ' 
      SELECT 
       '.$f.' 
      FROM 
       faq 
      WHERE 
       id = ? 
     '; 

     $s = $dbh->prepare($q); 
     $s->execute(array($i)); 
     //$s->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
     $r = $s->fetch(); 

     return $r[$f]; 

     } 

     catch(PDOException $e) { 
     echo "Something went wrong fetching the FAQ answer from the database.\n"; 
     file_put_contents(
      $_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt", 
      "\n\n\n\n".$e->__toString(), FILE_APPEND); 

     } 

    } 

} 

(Были и другие функции в классе, используя ту же строку соединения в $dbh, но я удалил их ради простоты)

ответ

1

Вы можете просто ударить global $dbh! Глобалы - это очень плохая идея и сделать ваш код сложнее.

В этом случае я рекомендую использовать свойство класса (который является своим родом глобальным, но только в этом классе):

class DB 
{ 
    protected $dbh; 

    public function __construct() 
    { 
     $this->dbh = new PDO(); 
    } 

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

Я в раздел и simplifyed много кода здесь, но это должно дать вам идея о том, как свойства класса работают в целом. Вы также можете прочитать об этом в руководстве PHP.net.

+0

Это уже трюк. Я, конечно, много читал об этом на php.net, но, к сожалению, не смог получить достаточного понимания концепции там, для меня, чтобы реализовать ее. Ценю вашу помощь. –

+0

Я только что обнаружил, что '$ this-> dbh-> query ($ q);' отлично работает, но в другом запросе, который использует '$ this-> dbh-> prepare ($ q);' он дал ошибку , «Вызов функции-члена prepare() для не-объекта». Что я сделал неправильно? –

+0

Как вы называете метод 'prepare()'. Без какой-либо части кода я ничего не могу поделать. – DaGardner

0

Не используйте global $dbh.

Просто добавьте свойство в классе DB, например protected $db, а затем положить экземпляр PDO внутри $this->db для вы можете использовать $db вар только внутри объекта. Это основной способ использования своего рода «Database Model», где вы можете найти множество обучающих программ через Интернет :)

Например:

public __construct($db_type = 'mysql', $host = 'my_server', $database = 'db_name', $user = 'my_user', $pwd = 'password') { 
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; 

    $dsn = $db_type.':host=' . $host . ';dbname=' . $database . ''; 

    try { 
     $this->db = new PDO($dsn, $user, $pwd, $pdo_options); 
    } catch (Exception $e) { 
     'Unable to connect to database'; 
    } 
} 

А затем сделать экземпляр вашего объекта глобальный масштаб, где скрипт использует его:

$db_manager = new DB('mysql','localhost','my_db','root','password'); 

И тогда ваш $db_manager будет иметь возможность использовать открытые методы вашего DB класса

0

Там вы идете ..

class DB { 

    protected $dbh; 

    public function __construct() { 

    try { 
     $this->dbh = new PDO('mysql:host=localhost;dbname=main_db', 'my_user', 'my_pass'); 
     $this->dbh ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
    catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 
    } 

    public function getFAQCats2Array() { 

    try { 
     $q = ' 
      SELECT 
       `id`  AS ci, 
       `name`  AS n 
      FROM 
       `faqcat`; 
     '; 

     $s = $this->dbh->query($q); 

     // initialise an array for the results 
     $A = array(); 

     while ($r = $s->fetch(PDO::FETCH_ASSOC)) { 
      $A[] = $r; 
     } 

     $s = null; 
     return $A; 
    } 

    catch(PDOException $e) { 
     echo "Something went wrong fetching the list of FAQ categories from the database.\n"; 
     file_put_contents(
      $_SERVER['DOCUMENT_ROOT']."/PDOErrors.txt", 
      "\n\n\n\n".$e->__toString(), FILE_APPEND); 
    } 
    } 
} 
+0

Вы забыли добавить $ this-> dbh в метод запроса. – DaGardner

+0

Вот почему я не могу заставить его работать! –

+0

глупая ошибка, извините ..! – zahirdhada

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