Повторное использование соединения mysql в oop php

Решение взято из комментария, поэтому я не могу принять ответ, чтобы закрыть его. Но я опубликовал фактическое решение, которое работает для меня ниже

Я новичок в ООП и просто не могу понять, даже прочитав несколько примеров, как использовать одно и то же соединение mysql без использования $GLOBALS.

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

Это мой файл подключения.

$hostname = 'hostname';
$username = 'db';
$password = 'password';

try {
$dbh = new PDO("mysql:host=$hostname;dbname=db", $username, $password);
}
 catch(PDOException $e)
    {
    echo $e->getMessage();
 }

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

class basic {

function simple($id) {

$query = $GLOBALS['dbh']->query("SELECT * FROM table WHERE id = $id");
$row = $query->fetch(PDO::FETCH_OBJ);
$thing = $row->partoftable;
echo $thing;
 }
}

$first = new basic();
$first->simple(12);

Это, конечно, вернет то, что я ищу $thing с идентификатором 12. Но как мне это сделать без GLOBALS['dbh'] для подключения к БД?

Также не стесняйтесь разрывать что-либо еще, но просто имейте в виду, что это был самый простой пример того, о чем я говорю.

Заранее спасибо.

Это решение, которое работает для меня на основе комментария ниже.

class basic {

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

function simple($id) {

$query = $this->dbh->query("SELECT * FROM table WHERE id = $id");
$row = $query->fetch(PDO::FETCH_OBJ);
$thing = $row->partoftable;
echo $thing;
 }
}

$first = new basic($dbh);
$first->simple(12);

Спасибо. надеюсь, это поможет кому-то другому.


person mikescorelle    schedule 24.04.2015    source источник
comment
Базовый должен знать о $dbh, пройти через __constructor подробнее Dependecy Injection   -  person cske    schedule 24.04.2015
comment
@cske Спасибо! это было настолько просто, что я просто не мог сначала понять это. Мне просто нужно передать это в $first = new basic($dbh), а затем использовать __constructor, чтобы это произошло в классе. Просто пытаюсь быть более явным, если у кого-то еще есть эта проблема. Спасибо еще раз!   -  person mikescorelle    schedule 24.04.2015


Ответы (2)


Вы можете создать класс для подключения к базе данных:

class MysqlDB
{
    private $conn;
    public function __construct($hostName, $userName, $passWord, $databaseName)
    {
        $this->conn = new PDO("mysql:host=$hostName;dbname=$databaseName", $userName, $passWord);
    }

    public function query($id)
    {
        //This is just a sample query
        $this->conn->query("SELECT * FROM table WHERE id = $id");
        return $query->fetch(PDO::FETCH_OBJ);
    }
}

И тогда вы можете использовать в другом классе, например:

class basic {
  private $dbConn;
  function __construct(){
      $dbConn = new MysqlDB('hostName', 'username', 'password', 'database')
  }
  function simple($id) {

     $row = $dbConn->query($id);
     $thing = $row->partoftable;
     echo $thing;
 }
}

Вы также можете создать соединение с базой данных в общем классе и расширить его с помощью своего класса.

person Pathik Gandhi    schedule 24.04.2015
comment
Вы создаете новый экземпляр каждый раз при создании экземпляра класса. Это противоположно тому, что пытается сделать OP. - person PeeHaa; 24.04.2015

Мне нравится это решение:

class db_connection
{
    public static $sql_object = NULL;

    public function __construct()
    {
        if ($sql_object === NULL)
        {
            // Initialize self::$sql_object
        }
    }
}

Затем вы можете использовать его с:

$db = new db_connection();
// Do something with $db->sql_object

Поскольку $sql_object является статическим, он будет инициализирован только один раз, независимо от того, сколько раз вы используете new db_connection().

person bytesized    schedule 24.04.2015
comment
Наличие глобального db_connection на самом деле не ООП. - person PeeHaa; 24.04.2015
comment
$db_connection не является глобальным. Я полагаю, вы могли бы считать $sql_object глобальным в том смысле, что он статический, но я не думаю, что использование статических членов нарушает ООП. - person bytesized; 24.04.2015