PDO::__construct
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDO::__construct — データベースへの接続を表す PDO インスタンスを生成する
説明
string
$dsn
,?string
$username
= null
,#[\SensitiveParameter] ?string
$password
= null
,?array
$options
= null
)
指定されたデータベースへの接続を表す PDO インスタンスを生成します。
パラメータ
dsn
-
データソース名(Data Source Name)またはDSN。データベースに接続するために 必要な情報が含まれます。
一般に、DSNはPDOドライバ名の後にコロンが続き、 各PDOドライバに固有の接続構文が続きます。より多くの情報は PDO driver-specific documentation にあります。
dsn
パラメータは、データベースへの接続を生成する ために必要な引数を指定する方法として、3種類の方法をサポートします。- ドライバ呼び出し
-
dsn
に完全な DSN を指定します。 - URI 呼び出し
-
dsn
は、uri:
の後に DSN 文字列を含むファイルの位置を定義する URI が続く形式となります。 この URI には、ローカルファイルまたはリモート URL を指定することができます。uri:file:///path/to/dsnfile
- エイリアス
-
dsn
は、DSN 文字列を定義する php.ini のpdo.dsn.name
へマップする名前name
からなります。注意:
エイリアスは、.htaccess や httpd.conf ではなく、 php.ini で定義する必要があります。
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);
?>
User Contributed Notes 9 notes
To get UTF-8 charset you can specify that in the DSN.
$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
To specify a database connection port use the following DSN string
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3333';
?>
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
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.
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.
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"
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);
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`.
<?php
class 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);
}
}
?>