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

时间:2016-01-04 12:05:08

标签: php postgresql pdo

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

我与DB的连接目前我喜欢这样:

public static function Conecction(){

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

但是在这里我只是指定了DB的名称而不是DB中的模式

非常感谢!

1 个答案:

答案 0 :(得分:2)

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

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

或者,如果您想以更具针对用户的方式进行讨论:

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

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

我还建议您在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
    ]
);

查看其他attributes并相应地使用。

最后一件事: 前一段时间PDO偶尔会遇到解决localhost主机名的问题。我怀疑这个bug已经修复了,但是为了防止它出现(甚至还没有修复),我建议你尽可能使用ip地址。如果您已经知道 IP,那么在解析您知道将会解析为127.0.0.1的字符串的DNS服务器方面没有任何意义。