Программирование на PHP довольно ново для меня, поэтому я надеюсь, что не буду спрашивать что-то глупое. Однако я не смог найти ответа на мою проблему :-(

Я сохранил соединение с базой данных в отдельном файле .php. Допустим, "connection.inc.php"

Connection.inc.php выглядит следующим образом:

$host   = "name.server.com";
$dbname = "foo";
$user   = "bar";
$pass   = "PaSW0rd";

try
{
    $DBH = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass,
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

}
catch(PDOException $e)
{
   ...
}

В моем index.php я бы включил connection.inc.php с include_once «connection.inc.php»

Кроме того, у меня есть класс house.class.php, в котором у меня есть метод с SQL-запросом к моей базе данных. Я вызываю метод через getColor ($ id, $ DBH) из моего index.php

Есть ли способ использовать метод, не всегда помещая $ DBH в вызов?

Спасибо за вашу помощь!

0
Tobi 24 Апр 2017 в 21:30

3 ответа

Лучший ответ

Допустим, у вас есть класс с именем House с методом getColor() и в вашем index.php. Вы можете использовать ключевое слово global внутри своей функции / метода, но я категорически против этого. Пример:

public function getColor(int $id)
{
    global $dbh;
    //and use it as $dbh
    $dbh->prepare(....
 }

Или вы можете добавить его в конструктор. Пример того, как будет выглядеть ваш класс

class House
{

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

    public function getColor($id)
    {
       //$this refers to current object context
        $this->dbh->prepare.....
    }
}

И когда вы создаете экземпляр объекта House, вы передаете $DBH в конструктор. Пример для вашего index.php:

include_once "connection.inc.php";
$house = new House($DBH);
$house->getColor($id);

Тем не менее, я предлагаю вам ознакомиться с управляемым доменом дизайном, шаблоном фабрики и репозитория и ORM, например Doctrine или Eloquent, чтобы лучше понять, как отделить логику приложения / домена от базы данных.

0
frz3993 24 Апр 2017 в 19:31
class Database
{
    private $host = "localhost";
    private $dbname = "codeignitor";
    private $username = "root";
    private $password = "";
    public $conn;

    public function getConnection()
    {
        $this->conn = null;
        try {
            $this->conn = new PDO ("mysql:host=" . $this->host . ";dbname=" . $this->dbname, $this->username, $this->password);
            $this->conn->exec("set names utf8"); 
            // echo "MySqlConnected";
        } catch(PDOException $exception){ 
            echo "Connection error: " . $exception->getMessage(); 
        } 
            return $this->conn; 
    } 
}
0
xmaestro 8 Июл 2020 в 11:56

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

Пример этого будет выглядеть примерно так:

House.class.php

<?php
  class House{

      private $DBH;

      function __construct(){
        include_once "connection.inc.php";
        $this->DBH = $DBH;
      }

      function getColor($id){
        $this->DBH // <---- use it like this instead of your $DBH old variable.
      }
  }
?>
0
coderodour 24 Апр 2017 в 19:10