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)
但在这里我只是指定了数据库的名称而不是数据库内部的架构
非常感谢!
要设置默认架构,您必须执行如下查询:
$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 服务器。
| 归档时间: |
|
| 查看次数: |
5532 次 |
| 最近记录: |