PDO::__construct

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

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

说明

public PDO::__construct(
    string $dsn,
    ?string $username = null,
    #[\SensitiveParameter] ?string $password = null,
    ?array $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 由映射到 php.ini 中定义 DSN 字符串的 pdo.dsn.namename 名组成。

注意:

别名必须得在 php.ini 中定义了,不能是在 .htaccesshttpd.conf 中 。

username

DSN字符串中的用户名。对于某些PDO驱动,此参数为可选项。

password

DSN字符串中的密码。对于某些PDO驱动,此参数为可选项。

options

一个具体驱动的连接选项的键=>值数组。

错误/异常

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

示例

示例 #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 notes

up
124
Kiipa at live dot com
11 years ago
To get UTF-8 charset you can specify that in the DSN.$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
up
40
subme at interia dot pl
16 years ago
To specify a database connection port use the following DSN string<?php$dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3333';?>
up
28
piotrekkr at o2 dot pl
14 years ago
To connect throught unix socket you need to use <?php$dsn = 'mysql:dbname=testdb;unix_socket=/path/to/socket';?>You musn't specify host when using socket.
up
7
Aymeric S
4 years ago
When trying to connect to a local database, it seems "uri:file:///" is no longer needed. Just write the PDO pilot name followed by the absolute path of the file.Example : sqlite:C:\VirtualHosts\phpliteadmin\dbs\surveillance_logeas.s3DB
up
19
daviddlavier at gmail dot com
9 years ago
I'd like to point out that in PHP 7.0 in the dsn parameter you can't use 'host=localhost' to solve this you can use 'host=127.0.0.1' instead.
up
10
Francesco Montanari
5 years ago
Most of the information in the comment here is outdated or wrong.You do can use host=localhost to connect via socket, which is faster than TCP, so setting 127.0.0.1 is a performance loss.To use proper utf you should use utf8mb4, for example:$db = new PDO('mysql:host=' . DATABASE_HOST . ';dbname='. DATABASE_NAME .';charset=utf8mb4', DATABASE_USER, DATABASE_PASSWORD);
up
3
theking2 at king dot ma
2 years ago
A generic pattern to connect to a mariadb or mysql database using a settings file<?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'"  ]);?>You might not need the options depicted here but I find them convenient. Works with a settings.ini file containing for instance:[db]host = "localhost"name = "dbname"user = "dbuser"pass = "dbpassword"
up
13
Victor T.
15 years ago
If you use the UTF-8 encoding, you have to use the fourth parameter :

<?php
$db = new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
?>
up
1
Michal Stefanak
2 years ago
If you override PDO with own class and you want to implement alias from php.ini, you have to get it with `get_cfg_var` instead of `ini_get`.<?phpclass PDO extends \PDO{    public function __construct(string $dsn, ?string $username = null, ?string $password = null, ?array $options = null)    {        //alias        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');            }        }        // your additional logic        parent::__construct($dsn, $username, $password, $options);    }}?>
To Top