область в классах PHP - PullRequest
1 голос
/ 02 февраля 2009

Я создаю объект подключения к базе данных, и я не уверен, что будет лучшим способом ...

Если я создаю класс dbConnection, который устанавливает соединение (используя mysql_connect), могу ли я затем вызвать mysql_query из любого места в основном скрипте?

как насчет ДРУГИХ классов? Нужно ли передавать объект или атрибут в качестве параметров?

По сути, я ищу лучший способ (с точки зрения скорости + память) для подключения к базе данных ОДИН РАЗ, используя простой класс ...

Я разместил свой конструктор для класса соединения с базой данных:

function __construct($database="") {
if (!empty($database)){ $this->db = $database; }
$this->dblink = mysql_connect($this->host,$this->username,$this->password);
if (!this->dblink) {
    //Fatal Error
}
mysql_select_db($this->db, $this->dblink);

}

Ответы [ 3 ]

1 голос
/ 03 февраля 2009

Ты почти у цели. Мой класс базы данных выглядит примерно так:

class DB {
  function __construct($host,$user,$pass,$db) {
    // error checking has been removed for brevity
    $this->mysql = mysql_connect($host,$user,$pass);
    mysql_select_db($this->mysql, $db);
  }
  function fetchRows($query) {
    // error checking removed again
    $result = mysql_query($this->mysql);
    $return = array();
    while($data = mysql_fetch_assoc($result))
      $return[] = $data;
    mysql_free_result($result);
    return $return;
  }
}

В моем основном включаемом файле у меня есть что-то вроде этого:

require 'DB.inc.php';
$GLOBALS['DB'] = new DB('localhost', 'root', '', 'my_database');

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

global $DB;
$query = 'SELECT UserID, UserName FROM users';
foreach($DB->fetchRows($query) as $user)
    echo "$user[UserID]: $user[UserName]\n";

Примечания: mysql_pconnect () не рекомендуется, см. Страницу руководства комментарии пользователей по некоторым причинам.

1 голос
/ 02 февраля 2009

Вместо того, чтобы создавать собственный класс абстракции базы данных, я бы рекомендовал попробовать ezSQL . Автор отлично поработал над тем, чтобы сделать его очень простым в использовании. Структуры данных, возвращаемые из запросов, выполненных классом, гораздо более гибкие, чем те, которые возвращаются mysql_query, и это сэкономит вам много работы.

0 голосов
/ 03 февраля 2009

Если вы хотите выполнить запрос, вы должны передать объект соединения в качестве параметра функции запроса. Вам нужен доступ к объекту соединения везде, где вы хотите выполнить запрос.

require_once DBConnection;
require_once SomeClass;

$con = new DBConnection();
$query = "Select * FROM Users";
mysql_query($query, $con->link);

// Use the connection in another class that takes a connection object in the constructor
$someclass = new SomeClass($con);
$someclass->executeQueryThree();

Тем не менее, я бы более склонен иметь mysql_query в вашем классе DBConnection как метод:

запрос публичной функции ($ query) { $ result = mysql_query ($ query, $ this-> link); вернуть $ результат; }

А затем выполните следующее:

$query = "Select * FROM Users";
$con = new DBConnection();
$result = $con->query($query);

// From within SomeClass
$someclass = new SomeClass();
$result = $con->query($someclass->getQuery3());
...