PHP Conference Japan 2024

PDO::__construct

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::__construct 创建一个 PDO 实例,表示与数据库的连接

描述

public PDO::__construct(
    字符串 $dsn,
    ?字符串 $username = null,
    #[\SensitiveParameter] ?字符串 $password = null,
    ?数组 $options = null
)

创建一个 PDO 实例以表示与请求的数据库的连接。

参数

dsn

数据源名称 (DSN) 包含连接到数据库所需的信息。

通常,DSN 由 PDO 驱动程序名称、冒号、然后是 PDO 驱动程序特定的连接语法组成。更多信息可从 PDO 驱动程序特定文档 获取。

dsn 参数支持三种不同的方法来指定创建数据库连接所需的参数

驱动程序调用

dsn 包含完整的 DSN。

URI 调用

dsnuri: 后跟一个 URI 组成,该 URI 定义包含 DSN 字符串的文件的位置。URI 可以指定本地文件或远程 URL。

uri:file:///path/to/dsnfile

别名

dsn 由一个名称 name 组成,该名称映射到 php.ini 中的 pdo.dsn.name,以定义 DSN 字符串。

注意:

别名必须在 php.ini 中定义,而不是在 .htaccesshttpd.conf 中定义

username

DSN 字符串的用户名称。此参数对于某些 PDO 驱动程序是可选的。

password

DSN 字符串的密码。此参数对于某些 PDO 驱动程序是可选的。

options

驱动程序特定的连接选项的键=>值数组。

错误/异常

如果尝试连接到请求的数据库失败,则会抛出 PDOException,无论当前设置了哪个 PDO::ATTR_ERRMODE

示例

示例 #1 通过驱动程序调用创建 PDO 实例

<?php

$dsn
= 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);

?>

示例 #2 通过 URI 调用创建 PDO 实例

以下示例假设文件 /usr/local/dbconnect 存在,并且文件权限允许 PHP 读取该文件。该文件包含通过 PDO_ODBC 驱动程序连接到 DB2 数据库的 PDO DSN

odbc:DSN=SAMPLE;UID=john;PWD=mypass

然后,PHP 脚本可以通过简单地传递 uri: 参数并指向文件 URI 来创建数据库连接

<?php

$dsn
= 'uri:file:///usr/local/dbconnect';
$user = '';
$password = '';

$dbh = new PDO($dsn, $user, $password);

?>

示例 #3 使用别名创建 PDO 实例

以下示例假设 php.ini 包含以下条目,以启用仅使用别名 mydb 连接到 MySQL 数据库

[PDO]
pdo.dsn.mydb="mysql:dbname=testdb;host=localhost"
<?php

$dsn
= 'mydb';
$user = '';
$password = '';

$dbh = new PDO($dsn, $user, $password);

?>

添加注释

用户贡献的注释 9 条注释

Kiipa at live dot com
11 年前
要获得 UTF-8 字符集,您可以在 DSN 中指定它。

$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
subme at interia dot pl
16 年前
要指定数据库连接端口,请使用以下 DSN 字符串

<?php
$dsn
= 'mysql:dbname=testdb;host=127.0.0.1;port=3333';
?>
Aymeric S
4 年前
尝试连接到本地数据库时,似乎不再需要 "uri:file:///"。只需编写 PDO 飞行员名称,后跟文件的绝对路径。
示例:sqlite:C:\VirtualHosts\phpliteadmin\dbs\surveillance_logeas.s3DB
piotrekkr at o2 dot pl
14 年前
要通过 unix 套接字连接,您需要使用
<?php
$dsn
= 'mysql:dbname=testdb;unix_socket=/path/to/socket';
?>

使用套接字时,您不得指定主机。
daviddlavier at gmail dot com
9 年前
我想指出,在 PHP 7.0 中,在 dsn 参数中您不能使用 'host=localhost' 来解决这个问题,您可以改为使用 'host=127.0.0.1'。
theking2 at king dot ma
1 年前
使用设置文件连接到 mariadb 或 mysql 数据库的通用模式



<?php
$_SETTINGS
= parse_ini_file('./settings.ini', true);

$db = new \PDO(
"mysql:hostname={$_SETTINGS['db']['host']};dbname={$_SETTINGS['db']['name']}",
$_SETTINGS['db']['user'],
$_SETTINGS['db']['pass'],
[
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'"
]
);
?>
您可能不需要此处显示的选项,但我发现它们很方便。

适用于包含例如以下内容的 settings.ini 文件
[db]
host = "localhost"
name = "dbname"
user = "dbuser"
pass = "dbpassword"
Francesco Montanari
4 年前
此处注释中的大部分信息已过时或错误。

您可以使用 host=localhost 通过套接字连接,这比 TCP 更快,因此设置 127.0.0.1 会导致性能下降。

要使用正确的 utf,您应该使用 utf8mb4,例如

$db = new PDO('mysql:host=' . DATABASE_HOST . ';dbname='. DATABASE_NAME .';charset=utf8mb4', DATABASE_USER, DATABASE_PASSWORD);
Michal Stefanak
1 年前
如果您使用自己的类覆盖 PDO,并且想要实现 php.ini 中的别名,则必须使用 `get_cfg_var` 而不是 `ini_get` 来获取它。

<?php
class PDO extends \PDO
{
public function
__construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)
{
//别名
if (!str_contains($dsn, ':')) {
$dsn = get_cfg_var('pdo.dsn.' . $dsn);
if (!
$dsn) {
throw new
PDOException('Argument #1 ($dsn) must be a valid data source name');
}
}

//您的其他逻辑

parent::__construct($dsn, $username, $password, $options);
}
}
?>
Victor T.
14 年前
如果您使用 UTF-8 编码,则必须使用第四个参数

<?php
$db
= new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
?>
To Top