2013-07-10 3 views
0

Я новичок в ООП на PHP, и я пытаюсь понять, как это работает. Я пытаюсь реализовать PDO в своем классе.OOP PHP - методы передачи через функции

Это то, что я делаю:

class db { 

    private $options; 

    function __construct() { 
     $this->options = array(
      'database_host' => DATABASE_HOST, 
      'database_name' => DATABASE_NAME, 
      'database_user' => DATABASE_USER, 
      'database_pass' => DATABASE_PASS 
     ); 

    } 

    private function connect() { 
     try { 
      $pdo = new PDO('mysql:host=' . $this->options['database_host'] . ';dbname=' . $this->options['database_name'], $this->options['database_user'], $this->options['database_pass']); 
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $pdo->exec("set names utf8"); 
     } catch (PDOException $e) { 
      echo 'ERROR: ' . $e->getMessage(); 
     } 
    } 

    public function select($table, $what, $where, $custom) { 

     $query = "SELECT " . $what . " FROM " . $table; 
     $child = "1"; 
     $param = array(); 
     if ($where) 
      foreach ($where as $data => $value) { 
       if ($child == "1") { 
        $query .= " WHERE " . $data . " = '" . $value . "'"; 
        $param[":" . $data] = $value; 
        $child = "next"; 
       } else { 
        $query .= " AND " . $data . " = '" . $value . "'"; 
        $param[":" . $data] = $value; 
       } 
      } 

     if ($custom) 
      $query .= ' ' . $custom; 

     $statement = $pdo->prepare($query); 
     if ($statement->execute($param)) 
      return $statement->fetchAll(PDO::FETCH_ASSOC); 
     return false; 
    } 

} 

Проблема заключается в том, что я не знаю, как сделать функцию connect() связи с ниже один select() Когда я пытаюсь вызвать функцию select(), I получить эту ошибку:

Fatal error: Call to a member function prepare() on a non-object in /Applications/MAMP/htdocs/game/api/class.db.php on line 47 

Я хотел бы, что, когда я вызываю функцию select(), то connect() один подключается к БД и делает все его переменные availabl е для других функций класса ... но я потерян.

ответ

1

Хранить $pdo переменную как собственность. В настоящее время это всего лишь переменная, локальная для метода connect().

class db { 
    private $options; 
    private $pdo; 
} 

Затем используйте $this->pdo к нему доступ из любого из методов. Например, в вашей connect():

private function connect() { 
    try { 
     $this->pdo = new PDO('mysql:host=' . $this->options['database_host'] . ';dbname=' . $this->options['database_name'], $this->options['database_user'], $this->options['database_pass']); 
     $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $this->pdo->exec("set names utf8"); 
    } catch (PDOException $e) { 
     echo 'ERROR: ' . $e->getMessage(); 
    } 
} 

Сделайте то же самое для других методов, например:

$statement = $this->pdo->prepare($query); 

Вы можете предпочесть расширить класс PDO, вместо того, чтобы новый класс, который держит свойство объекта PDO. Разница заключается в том, что при его расширении ваш класс db будет вести себя так же, как класс PDO, за исключением того, что он будет иметь ваши дополнительные методы. В то время как с вашим текущим кодом класс db имеет только методы, которые вы явно определяете.

+0

, когда я называю выбор() один еще такая же ошибка –

+0

Вам нужно использовать '$ this-> pdo' по всему классу, а не только ВПодключение метод , – MrCode

+0

Спасибо. Я получу ваш ответ через 5 минут –

0

Попробуйте

class db { 

private $options; 
private $oPDO; 

function __construct() { 
    $this->options = array(
     'database_host' => DATABASE_HOST, 
     'database_name' => DATABASE_NAME, 
     'database_user' => DATABASE_USER, 
     'database_pass' => DATABASE_PASS 
    ); 

    $this->connect(); 
} 

private function connect() { 
    try { 
     $this->oPDO = new PDO('mysql:host=' . $this->options['database_host'] . ';dbname=' . $this->options['database_name'], $this->options['database_user'], $this->options['database_pass']); 
     $this->oPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $this->oPDO->exec("set names utf8"); 

    } catch (PDOException $e) { 
     echo 'ERROR: ' . $e->getMessage(); 
    } 
} 

public function select($table, $what, $where, $custom) { 

    $query = "SELECT " . $what . " FROM " . $table; 
    $child = "1"; 
    $param = array(); 
    if ($where) 
    foreach ($where as $data => $value) { 
     if ($child == "1") { 
      $query .= " WHERE " . $data . " = '" . $value . "'"; 
      $param[":" . $data] = $value; 
      $child = "next"; 
     } else { 
      $query .= " AND " . $data . " = '" . $value . "'"; 
      $param[":" . $data] = $value; 
     } 
    } 

    if ($custom) 
    $query .= ' ' . $custom; 

    $statement = $this->oPDO->prepare($query); 
    if ($statement->execute($param)) 
    return $statement->fetchAll(PDO::FETCH_ASSOC); 
    return false; 
} 

}

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