如何使用 PDO PHP 在 Postgresql DB 中设置与模式的连接

zgr*_*y_7 3 php postgresql pdo

如果我有一个带有多个架构的 Postgresql 数据库,并且我想使用 PDO 将与我的 Web 应用程序的连接设置为数据库的这个架构之一(默认情况下不是公共架构),那么最佳方式是什么?

与数据库的连接我目前是这样的:

public static function Conecction(){

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

但在这里我只是指定了数据库的名称而不是数据库内部的架构

非常感谢!

Eli*_*gem 6

要设置默认架构,您必须执行如下查询:

$conn = Foo::Conecction();
$conn->exec('SET search_path TO yourschema');
Run Code Online (Sandbox Code Playgroud)

或者,如果您想以更特定于用户的方式进行操作:

$conn->exec('ALTER USER user SET search_path TO yourschema');
Run Code Online (Sandbox Code Playgroud)

作为旁注:请不要像那样创建您的 PDO 实例(作为静态方法的返回值)。PDO提供开箱即用的干净 API。您不允许调用者确定要连接到哪个数据库,而是对凭据进行硬编码。按照任何标准,这都被认为是不好的做法。考虑将连接传递到您需要的任何地方,或者 - 如果您坚持 - 创建一个至少需要调用者自己传递数据库凭据的方法。

我还建议您在 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
    ]
);
Run Code Online (Sandbox Code Playgroud)

检查其他属性并相应地使用。

最后一件事:前段时间PDO有时会在解析localhost主机名时遇到麻烦。我怀疑这个错误已经被修复了,但以防万一它突然出现(甚至:还没有被修复),我建议你尽可能使用 IP 地址。如果您已经知道IP,那么不必费心去解析一个您知道127.0.0.1无论如何都会解析的字符串来打扰 DNS 服务器。