如果我有一个带有多个模式的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中的模式
非常感谢!答案 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服务器方面没有任何意义。