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

資料來源名稱 (Data Source Name,簡稱 DSN) 包含連線到資料庫所需的資訊。

一般來說,DSN 由 PDO 驅動程式名稱、冒號,以及 PDO 驅動程式特定的連線語法組成。更多資訊請參考 PDO 驅動程式特定文件

dsn 參數支援三種不同的方法來指定建立資料庫連線所需的引數

驅動程式呼叫

dsn 包含完整的 DSN。

URI 呼叫

dsnuri: 後面接著定義包含 DSN 字串之檔案位置的 URI 組成。URI 可以指定本機檔案或遠端 URL。

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

別名

dsn 由名稱 name 組成,該名稱對應到 php.ini 中定義 DSN 字串的 pdo.dsn.name

注意事項:

別名必須在 php.ini 中定義,而不是 .htaccesshttpd.conf

username (使用者名稱)

DSN 字串的使用者名稱。對於某些 PDO 驅動程式,此參數是可選的。

password (密碼)

DSN 字串的密碼。對於某些 PDO 驅動程式,此參數是可選的。

options (選項)

一個鍵值對 (key=>value) 陣列,包含驅動程式特定的連線選項。

錯誤/例外

如果嘗試連線到所請求的資料庫失敗,則會擲出 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 Socket 連線,您需要使用
<?php
$dsn
= 'mysql:dbname=testdb;unix_socket=/path/to/socket';
?>

使用 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 通過 socket 連線,這比 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
類別 PDO 延伸 \PDO
{
公用函式
__construct(字串 $dsn, ?字串 $username = null, ?字串 $password = null, ?陣列 $options = null)
{
//別名
如果 (!str_contains($dsn, ':')) {
$dsn = get_cfg_var('pdo.dsn.' . $dsn);
如果 (!
$dsn) {
拋出新的
PDOException('引數 #1 ($dsn) 必須是有效的資料來源名稱');
}
}

// 您的額外邏輯

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