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 由一个名称 name 组成,该名称映射到 php.ini 中的 pdo.dsn.name,用于定义 DSN 字符串。

注意:

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

username

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

password

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

options

一个键 => 值数组,包含特定于驱动程序的连接选项。

错误/异常

PDO::__construct() 在尝试连接到所请求数据库失败时会抛出 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);

?>

添加注释

用户贡献的注释 16 条注释

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

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

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

使用套接字时,您不能指定主机。
daviddlavier at gmail dot com
8 年前
我想指出,在 PHP 7.0 中,您不能在 dsn 参数中使用 'host=localhost',要解决这个问题,您可以使用 'host=127.0.0.1' 代替。
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\''));
?>
453034559 at qq dot com
2 年前
// 设置 DEFAULT_FETCH_MODE
<?php
try {
$p = new PDO("mysql:host=$db_host;port=$db_port;dbname=$db_dbname", $db_user, $db_pass,array(
PDO::ATTR_DEFAULT_FETCH_MODE =>PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', // 在 php5.3.6 之后
));
//$p->exec('SET NAMES utf8');
} catch (PDOException $e) {
print
"Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
Anonymous
11 年前
Sqlite

<?php
try{
$pdo = new PDO('sqlite:example.db');
}catch (
PDOException $e){
die (
'DB Error');
}
?>

如果 'example.db' 不存在,则不会抛出异常,但会创建 'example.db' 文件。
ohcc at 163 dot com
8 年前
如果您没有捕获 PDO 在无法连接到数据库服务器时抛出的异常,您将收到致命错误。

致命错误:在 xxx.php 的第 xx 行

此错误既不能由错误处理程序处理,也不能被 @ 符号删除,这会导致您的脚本无法控制。

<?php
$db
= new pdo('mysql:host=127.0.0.1;port=3306;dbname=mysql;charset=utf8','user','password',array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
));
?>

您应该始终使用 try ... catch ...

<?php
try{
$db = new pdo('mysql:host=127.0.0.1;port=3306;dbname=mysql;charset=utf8','user','password',array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
));
}catch(
PDOException $pe){
echo
$pe->getMessage();
}
?>
berk0081 at umn dot edu
9 年前
虽然没有明确说明,但 PDO $dsn 字符串中的参数在某些平台或驱动程序上可能是区分大小写的。

<?php
// dbname 将不会使用不正确的 casing 解析:
$pdo = new PDO("mysql:host=hostname;DBName=database", "user", "password");

// 正确的 dbname 是小写,如手册中所示:
$pdo = new PDO("mysql:host=hostname;dbname=database", "user", "password");
?>
srycroft at excelsystems dot com
8 年前
对于 IBM i / iSeries / AS400 DB2 连接,您可以为 php_pdo 模块 > 1.3.3-sg2 指定系统命名和库列表

<?php
$pdo
= new PDO(
'ibm:' . $host,
$user,
$password,
array(
PDO::I5_ATTR_DBC_SYS_NAMING => true,
PDO::I5_ATTR_DBC_LIBL => "QGPL QSYS"
)
);
?>

查看 http://yips.idevcloud.com/wiki/index.php/XMLSERVICE/PHPPDOChangeLog
max1josef
1 年前
SQLite3:默认情况下,如果数据库文件不存在,则在打开时创建它(PDO::SQLITE_OPEN_CREATE)。

<?php
$dsn
= 'sqlite:D:\Databases\non_existing.db'; // 文件不存在

try {
$dbh = new PDO($dsn);
}
catch(
PDOException $e) {
print
$e->getMessage();
}
?>

不会抛出异常,而是会创建 "non_existing.db" 文件。要避免这种情况,请使用

<?php
$dsn
= 'sqlite:D:\Databases\non_existing.db';
$options = [
PDO::SQLITE_ATTR_OPEN_FLAGS => PDO::SQLITE_OPEN_READWRITE,
];

try {
$dbh = new PDO('sqlite:D:\Databases\non_existing.db', null, null, $options);
}
catch(
PDOException $e) {
print
$e->getMessage();
}
?>
这将输出
SQLSTATE[HY000] [14] unable to open database file

如果您想以只读方式打开数据库,请使用 PDO::SQLITE_OPEN_READONLY。
olivernybroe at gmail dot com
8 年前
PDO 连接区分大小写,这意味着您不能写
`$PDO = new PDO("MySQL:DBName=dbname;host=localhost");`
您必须写成
`$PDO = new PDO("mysql:dbname=dbname;host=localhost");`

这里的区别是 `mysql` 和 `dbname` 都是小写。

一些 IDE,如 PHPStorm,如果 `dbname` 仅使用小写字母编写,则会在 `dbname` 上显示 `TYPO ERROR`,这只是被忽略,并且已向 PHPStorm 报告,以便他们进行修复。(当前版本 10.0.2)
To Top