Почему не подключается к БД?

Есть код (на месте # у меня стоят правильные имена, проблема не из-за этого):
<?php
function connectDB() {
		try {
				$pdo = new PDO('mysql:host=localhost;dbname=#', 'root', '');
				$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		} catch (PDOException $e) {
			exit($e->getMessage());
		}
	}
	
	function closeDB() {
		$pdo = null;
	}
	
	function getA() {
		connectDB();
		
		$select = $pdo->query("SELECT * FROM # ORDER BY id DESC", PDO::FETCH_ASSOC);
		$result = $select->fetchAll();
		
		var_dump($result);
		
		closeDB();
	}
	
	getA();
?>


Выдает ошибку:

Fatal error: Uncaught Error: Call to a member function query() on null in /storage/emulated/legacy/htdocs/functions/functions.php:18 Stack trace: #0 /storage/emulated/legacy/htdocs/functions/functions.php(47): getA() #1 {main} thrown in /storage/emulated/legacy/htdocs/functions/functions.php on line 18
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
DarkRaven
@DarkRaven
разработка программного обеспечения
Вам нужно либо сделать $pdo глобальной, либо ее возвращать (так лучше).

<?php
function connectDB() {
    try {
        $pdo = new PDO('mysql:host=localhost;dbname=#', 'root', '');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    } catch (PDOException $e) {
      exit($e->getMessage());
    }
  }
  
  function getA() {
    $pdo = connectDB();
    
    $select = $pdo->query("SELECT * FROM # ORDER BY id DESC", PDO::FETCH_ASSOC);
    $result = $select->fetchAll();
    
    var_dump($result);
  }
  
  getA();
?>
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@artem78
$pdo у вас глобальная переменная. В таком случае при использовании её внутри фукции нужно использовать ключевое слово global.

function connectDB() {
   global $pdo;
   $pdo = new PDO('...');
}

function getA() {
   global $pdo;
   connectDB();
   $pdo->query('...');
}
Ответ написан
Комментировать
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Разбирайтесь с самым базисом языка: областями видимости и принципами работы переменных.
В методе getA() у вас не определена переменная, которая должна содержать объект PDO.
// Вот здесь ошибка:
$select = $pdo->query("SELECT * FROM # ORDER BY id DESC", PDO::FETCH_ASSOC);
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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