要取得 UTF-8 字元集,您可以在 DSN 中指定。
$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::__construct — 建立一個 PDO 實例,表示與資料庫的連線
$dsn
,$username
= null
,$password
= null
,$options
= null
建立一個 PDO 實例來表示與所請求資料庫的連線。
dsn
資料來源名稱 (Data Source Name,簡稱 DSN) 包含連線到資料庫所需的資訊。
一般來說,DSN 由 PDO 驅動程式名稱、冒號,以及 PDO 驅動程式特定的連線語法組成。更多資訊請參考 PDO 驅動程式特定文件。
dsn
參數支援三種不同的方法來指定建立資料庫連線所需的引數
dsn
包含完整的 DSN。
dsn
由 uri:
後面接著定義包含 DSN 字串之檔案位置的 URI 組成。URI 可以指定本機檔案或遠端 URL。
uri:file:///path/to/dsnfile
dsn
由名稱 name
組成,該名稱對應到 php.ini 中定義 DSN 字串的 pdo.dsn.
。name
注意事項:
別名必須在 php.ini 中定義,而不是 .htaccess 或 httpd.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);
?>
要取得 UTF-8 字元集,您可以在 DSN 中指定。
$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
要指定資料庫連接埠,請使用以下 DSN 字串
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3333';
?>
當嘗試連線到本地資料庫時,似乎不再需要 "uri:file:/// "。只需寫入 PDO 驅動程式名稱,後接檔案的絕對路徑。
範例:sqlite:C:\VirtualHosts\phpliteadmin\dbs\surveillance_logeas.s3DB
要透過 Unix Socket 連線,您需要使用
<?php
$dsn = 'mysql:dbname=testdb;unix_socket=/path/to/socket';
?>
使用 Socket 時,不能指定主機。
我想要指出,在 PHP 7.0 中,dsn 參數不能使用 'host=localhost',要解決這個問題,可以使用 'host=127.0.0.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"
這裡的註釋中的大部分資訊都已過時或錯誤。
您可以使用 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);
如果您使用自己的類別覆蓋 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);
}
}
?>