Если у меня есть 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);
}
Но здесь я просто указал имя БД не со схемой внутри БД
спасибо очень много!
Чтобы установить схему по умолчанию, вам необходимо выполнить запрос, например:
$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
любом случае.
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 напрямую позволяет вам это делать