ZetCode

PHP PDO::__construct 方法

最后修改于 2025 年 4 月 19 日

PDO::__construct 方法创建一个新的 PDO 实例,表示与数据库的连接。这是使用 PDO 在 PHP 中建立数据库连接的主要方式。

基本定义

PDO::__construct 创建一个新的 PHP Data Objects (PDO) 实例。这表示 PHP 与数据库服务器之间的连接。该方法接受一个 DSN (Data Source Name) 参数。

语法:public PDO::__construct(string $dsn, string $username = null, string $password = null, array $options = null)。DSN 包含数据库类型、主机和数据库名称。

MySQL 连接示例

这展示了如何使用 PDO::__construct 连接到 MySQL 数据库。

pdo_mysql_connect.php
<?php

declare(strict_types=1);

$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$username = 'dbuser';
$password = 'dbpass';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected to MySQL successfully";
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

这创建了一个到 MySQL 数据库的连接。DSN 指定了主机、数据库名称和字符集。我们设置错误模式为异常,以获得更好的错误处理。

SQLite 连接示例

这演示了如何使用 PDO 连接到 SQLite 数据库文件。

pdo_sqlite_connect.php
<?php

declare(strict_types=1);

$databaseFile = 'example.db';

try {
    $pdo = new PDO("sqlite:$databaseFile");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected to SQLite database successfully";
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

对于 SQLite,DSN 更简单——只需驱动程序和数据库文件路径。对于 SQLite 文件数据库,不需要用户名或密码。

PostgreSQL 连接示例

这展示了如何使用 PDO 连接到 PostgreSQL 数据库。

pdo_pgsql_connect.php
<?php

declare(strict_types=1);

$dsn = 'pgsql:host=localhost;port=5432;dbname=testdb';
$username = 'pguser';
$password = 'pgpass';

try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected to PostgreSQL successfully";
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

PostgreSQL DSN 包括主机、端口和数据库名称。PostgreSQL 需要通过用户名和密码进行身份验证。

带选项的连接

这演示了将连接选项传递给 PDO 构造函数。

pdo_options_connect.php
<?php

declare(strict_types=1);

$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'dbuser';
$password = 'dbpass';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
];

try {
    $pdo = new PDO($dsn, $username, $password, $options);
    echo "Connected with custom options successfully";
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

options 数组配置 PDO 的行为。我们设置了错误模式、获取模式,并禁用了预处理语句的模拟。选项也可以稍后使用 setAttribute 设置。

持久连接

这展示了如何使用 PDO 创建持久的数据库连接。

pdo_persistent_connect.php
<?php

declare(strict_types=1);

$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'dbuser';
$password = 'dbpass';
$options = [
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];

try {
    $pdo = new PDO($dsn, $username, $password, $options);
    echo "Persistent connection established successfully";
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

持久连接在脚本执行后保持打开状态,从而减少了开销。谨慎使用它们,因为它们可能导致过多的打开连接。

带 SSL 的连接

这演示了如何建立安全的 MySQL 连接(使用 SSL)。

pdo_ssl_connect.php
<?php

declare(strict_types=1);

$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'dbuser';
$password = 'dbpass';
$options = [
    PDO::MYSQL_ATTR_SSL_CA => '/path/to/ca-cert.pem',
    PDO::MYSQL_ATTR_SSL_CERT => '/path/to/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_KEY => '/path/to/client-key.pem',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];

try {
    $pdo = new PDO($dsn, $username, $password, $options);
    echo "Secure SSL connection established successfully";
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

这配置了 MySQL 连接的 SSL。选项指定了证书文件,并禁用服务器证书验证(不推荐在生产环境中使用)。

带自定义属性的连接

这展示了在连接期间设置自定义的、特定于驱动程序的属性。

pdo_custom_attrs.php
<?php

declare(strict_types=1);

$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'dbuser';
$password = 'dbpass';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4",
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
    PDO::ATTR_TIMEOUT => 5
];

try {
    $pdo = new PDO($dsn, $username, $password, $options);
    echo "Connection with custom attributes established";
} catch (PDOException $e) {
    die("Connection failed: " . $e->getMessage());
}

这设置了特定于 MySQL 的属性,如 INIT_COMMAND 和 USE_BUFFERED_QUERY。ATTR_TIMEOUT 设置了连接超时。不同的驱动程序支持不同的自定义属性。

最佳实践

来源

PHP PDO::__construct 文档

本教程涵盖了 PDO::__construct 方法,并提供了实用的示例,展示了不同的数据库连接和配置选项。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 PHP PDO 函数