@kr_ilya

PDO данные для подключения из стороннего файла?

Есть файл с классом подключения PDO и файл с классом конфига, в котором находятся данные для подключения (хост, пароль и др.)
Конфиг:
<?PHP
class config {
    public $host = "localhost";
    public $base = "1111";
    public $user = "root";
    public $pass = "1111";
    public $charset = "utf8";
}
?>

Подключение:
<?PHP
class db{
  public function __construct()
  {
  	$this->connect();
  }

  private function connect()
  {
        $host = $config->host;
  	$dbname = $config->base;
 	$charset = $config->charset;
 	$user = $config->user;
 	$pass = $config->pass;
  	$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
  	$opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_LAZY,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
  	$pdo = new PDO($dsn, $user, $pass, $opt);
  	return $this;
  }

  public function execute($sql)
  {
  	$sth = $pdo->prepare($sql);
  	return $sth->execute();
  }

  public function query($sql)
  {
  	$exe = $this->execute($sql);
  	$res = $exe->fetch(PDO::FETCH_LAZY);

  	return $res;
  }
}
?>

Если указать данные конфига прямо в файле с подключением, то все работает. Я так делать не хочу. Но опять же при попытке подключения с данными, которые берутся из файла, выводит ошибку:
Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2019] Unknown character set in E:\OSPanel\domains\test.ru\classes\_new.db.php:21 Stack trace: #0 
E:\OSPanel\domains\test.ru\classes\_new.db.php(21): PDO->__construct('mysql:host=;dbn...', NULL, NULL, Array) #1
 E:\OSPanel\domains\test.ru\classes\_new.db.php(5): db->connect() #2 
E:\OSPanel\domains\test.ru\index.php(40): db->__construct('localhost', 'root', '1111', '1111', 'utf8') #3 {main} thrown in E:\OSPanel\domains\test.ru\classes\_new.db.php on line 21

Еще есть автоподгрузка классов в индексовом файле:
$config = new config;
$db = new db($config->host, $config->user, $config->pass, $config->base, $config->charset);

Что делать?
  • Вопрос задан
  • 345 просмотров
Решения вопроса 2
uDenX
@uDenX
PHP Developer
Вы в конструктор передаёте данные для подключения, но нигде не используете их. Вместо этого вы используете переменную $config, которая не объявлена в контексте метода. Создайте свойства в классе db и в конструкторе присвойте этим свойствам полученные значения, а в других методах используйте их или например так:
class db {
    private $config;

    public function __construct(Config $config)
    {
         $this->config = $config;
  	 $this->connect();
    }

    private function connect()
    {
        $host = $this->config->host;
        ...
    }
}
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Чтобы передать в функцию параметр, надо - сюрприз! - заранее сказать ей об этом.

То есть если ты собираешься передать в функцию какое-то значение, которое потом будет использовано внутри, его надо описать при определении функции:
function foo($bar) {
    echo $bar;
}

А если этого не сделать, то функция не будет знать, откуда у нее вдруг должна взяться переменная $bar.

Соответственно, чтобы твой код заработал, надо сказать конструктору, что в нем будет переменная $config
public function __construct(Config $config)
И вызывать эту функцию в соответствии с данным определением. Это значит, что при определении функции указан 1 параметр, то при вызове надо писать тоже 1 параметр, а не 10.
То есть вместо
$db = new db($config->host, $config->user, $config->pass, $config->base, $config->charset);

должно быть
$db = new db($config);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы