Как установить соединение со схемой в БД Postgresql с PDO PHP

1

Если у меня есть Postgresql DB с несколькими схемами, и я хочу установить соединение с моим веб-приложением в одну из этих shemas (не общедоступной схемы по умолчанию) БД с использованием PDO, какой будет наиболее оптимальный способ?

Соединение с БД я делаю в настоящее время следующим образом:

public static function Conecction(){

        $dbname = "start";
        $host = "localhost";
        $username = "user";
        $password = "123";
        return new PDO("pgsql:dbname=$dbname;host=$host", $username, $password);
    }

Но здесь я просто указал имя БД не со схемой внутри БД

спасибо очень много!

Теги:
pdo

1 ответ

2
Лучший ответ

Чтобы установить схему по умолчанию, вам необходимо выполнить запрос, например:

$conn = Foo::Conecction();
$conn->exec('SET search_path TO yourschema');

или, если вы хотите сделать это более удобным для пользователя образом:

$conn->exec('ALTER USER user SET search_path TO yourschema');

В качестве примечания: Пожалуйста, не создавайте такие экземпляры PDO (как возвращаемое значение статического метода). PDO предлагает чистый API прямо из коробки. Вы не позволяете вызывающему абоненту определить, к какой базе данных подключиться, вместо этого вы жестко кодируете учетные данные. Это считается плохой практикой по любому стандарту. Рассмотрите возможность передачи соединения туда, где вам это нужно, или -if вы insist- создаете метод, который по меньшей мере требует, чтобы вызывающий пользователь сам передавал учетные данные БД.

Я также рекомендовал бы включить сортировку в строку DSN и, возможно, установить некоторые атрибуты, чтобы облегчить жизнь при отладке:

$pdo = new PDO(
    "pgsql:dbname=$dbname;host=$host;port=5432;charset=utf8",
    $user,
    $pass,
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,//set PDO to throw exceptions on error
        PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,//NULL values are returned as PHP null's
    ]
);

Проверьте другие атрибуты и используйте соответственно.

Последнее: некоторое время назад PDO иногда сталкивался с проблемой разрешения имени хоста localhost. Я подозреваю, что эта ошибка уже исправлена, но на всякий случай она появляется (или даже: не была исправлена), я бы рекомендовал вам использовать IP-адреса, когда это возможно. Если вы уже знаете IP-адрес, нет никакого смысла беспокоиться о том, что DNS-сервер может решить, что строка, которую вы знаете, решит до 127.0.0.1 любом случае.

  • 0
    WOW Thx! Еще две вещи: 1: как я определяю путь к своей схеме. 2: Не могли бы вы поделиться примером правильного способа установки соединения с БД с помощью PDO? СПАСИБО!
  • 0
    @ zgrizzly_7: Не уверен, что вы подразумеваете под 1. ALTER USER username SET search_path TO schema1, schema2, schema3 или ALTER ROLL some_role SET search_path или даже ALTER DATABASE start SET search_path TO schema1,schema2 на сервере PG напрямую позволяет вам это делать
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню