PDO::__construct

(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)

PDO::__construct データベースへの接続を表す PDO インスタンスを生成する

説明

public PDO::__construct ( string $dsn [, string $username [, string $password [, array $options ]]] )

指定されたデータベースへの接続を表す 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.inipdo.dsn.name へマップする名前 name からなります。

注意:

エイリアスは、.htaccesshttpd.conf ではなく、 php.ini で定義する必要があります。

username

DSN 文字列のユーザー名。このパラメータは、いくつかの PDO ドライバではオプションです。

password

パスワード。DSN 文字列で必要とされる場合に指定。

options

ドライバ固有の接続オプションを指定するキー=> 値の配列。

返り値

成功時に PDO オブジェクトを返します。

エラー / 例外

PDO::__construct() は、 指定されたデータベースへの接続に失敗した場合、 PDOException を投げます。

例1 ドライバ呼び出しにより PDO インスタンスを生成する

<?php
/* ドライバ呼び出しを使用して MySQL データベースに接続する */
$dsn 'mysql:dbname=testdb;host=127.0.0.1';
$user 'dbuser';
$password 'dbpass';

try {
    
$dbh = new PDO($dsn$user$password);
} catch (
PDOException $e) {
    echo 
'Connection failed: ' $e->getMessage();
}

?>

例2 URI 呼び出しにより PDO インスタンスを生成する

以下の例では、ファイル /usr/local/dbconnect が存在し、 PHP がこのファイルを読み込む権限を有していることを仮定します。 このファイルには、 PDO_ODBC により DB2 データベースに接続するための PDO DSN が含まれています。

odbc:DSN=SAMPLE;UID=john;PWD=mypass

これにより、PHP スクリプトでは、単に uri: パラメータを渡し、 ファイルの URI を示すだけでデータベース接続を作成することができるようになります。

<?php
/* ドライバ呼び出しを使用して ODBC データベースに接続する */
$dsn 'uri:file:///usr/local/dbconnect';
$user '';
$password '';

try {
    
$dbh = new PDO($dsn$user$password);
} catch (
PDOException $e) {
    echo 
'Connection failed: ' $e->getMessage();
}

?>

例3 エイリアスにより PDO インスタンスを生成する

以下の例では、php.ini にエイリアス mydb のみで MySQL データベースに接続できるようにするための以下のエントリが含まれることを 仮定します。

[PDO]
pdo.dsn.mydb="mysql:dbname=testdb;host=localhost"
<?php
/* エイリアスを使用して ODBC データベースに接続する */
$dsn 'mydb';
$user '';
$password '';

try {
    
$dbh = new PDO($dsn$user$password);
} catch (
PDOException $e) {
    echo 
'接続に失敗しました: ' $e->getMessage();
}

?>

注意:

PHP 5.3 より前のバージョンでは、PDO を継承してマジックメソッド __call を実装したクラスは、常に小文字の $method を受け取ります。

add a note add a note

User Contributed Notes 13 notes

up
110
Kiipa at live dot com
4 years ago
To get UTF-8 charset you can specify that in the DSN.

$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
up
3
tomolimo at gmail dot com
9 months ago
Just to give an odbc string connection example to MSSQL:

$odbc="odbc:Driver={SQL Server};Server=$server;Database=$database;";

$cnx = new PDO( $odbc , $user, $password);

$sql="SELECT field FROM Quotation_Header WHERE (field> 0)";

foreach ($cnx->query($sql) as $row) {
   echo $row['field'] . "\n";
}
up
25
subme at interia dot pl
9 years ago
To specify a database connection port use the following DSN string

<?php
$dsn
= 'mysql:dbname=testdb;host=127.0.0.1;port=3333';
?>
up
26
Victor T.
7 years ago
If you use the UTF-8 encoding, you have to use the fourth parameter :

<?php
$db
= new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
?>
up
12
daviddlavier at gmail dot com
2 years ago
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.
up
20
piotrekkr at o2 dot pl
7 years ago
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.
up
11
Anonymous
4 years ago
Sqlite:

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

If 'example.db' does not exist, no exception is thrown but the file 'example.db' is created.
up
7
berk0081 at umn dot edu
3 years ago
Although not explicitly stated, parameters in the PDO $dsn string may be case-sensitive on some platforms or drivers.

<?php
// The dbname will not be parsed with incorrect casing:
$pdo = new PDO("mysql:host=hostname;DBName=database", "user", "password");

// The correct dbname is lowercase, as displayed in the manual:
$pdo = new PDO("mysql:host=hostname;dbname=database", "user", "password");
?>
up
0
srycroft at excelsystems dot com
1 year ago
For IBM i / iSeries / AS400 DB2 connections, you can specify system naming and library lists for php_pdo modules > 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"
    
)
   );
?>

See http://yips.idevcloud.com/wiki/index.php/XMLSERVICE/PHPPDOChangeLog
up
0
ohcc at 163 dot com
2 years ago
You will get a fatal error if you don't catch the exception threw by PDO when it fails to connect to the database server like this.

Fatal error: in xxx.php on line xx

This error neither can be handled by error handlers nor can it be erased by the @ sign, which can make your script uncontrollable.

<?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,
    ));
?>

You should always 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();
    }   
?>
up
-1
Anonymous
3 years ago
To connect to the database via a function use this and call the getConnection function in the class constructor.

<?php
class Connection{

    protected
$db;

    public function
Connection(){

   
$conn = NULL;

        try{
           
$conn = new PDO("mysql:host=localhost;dbname=dbname", "dbuser", "dbpass");
           
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch(
PDOException $e){
                echo
'ERROR: ' . $e->getMessage();
                }   
           
$this->db = $conn;
    }
   
    public function
getConnection(){
        return
$this->db;
    }
}

?>
up
-6
info at salientdigital dot com
2 years ago
If you happen to create a dsn like this...

<?php
   
//wrong dsn
   
$db = new PDO('mysql:database=yourdb;host=127.0.0.1', 'user', 'password');
   
$stmt = $db->prepare('SELECT * FROM tbl WHERE id = :id');
   
$stmt->bindParam(':id', $user_id, PDO::PARAM_INT);
   
$result = $stmt->execute();
?>

... your result will be bool(false) and your $db->errorInfo() will be "0000" which isn't very helpful.

You have to look to the $stmt->errorInfo() to see "No database selected" which is even more confusing until you realize that it's not 'database' but 'dbname' in your DSN! You would think the error about a bad DSN would be in the $db errorInfo but it is not, it's not until you try the $stmt that the error is generated.

<?php
   
//correct dsn
   
$db = new PDO('mysql:dbname=yourdb;host=127.0.0.1', 'user', 'password');
?>

I wasted a half hour on that one.
up
-7
olivernybroe at gmail dot com
1 year ago
The PDO connection is case-sensitive, this means that you cannot write
`$PDO = new PDO("MySQL:DBName=dbname;host=localhost");`
You would have to write it
`$PDO = new PDO("mysql:dbname=dbname;host=localhost");`

The difference here is that `mysql` and `dbname` is with all lower-case.

Some IDE's like PHPStorm will show a `TYPO ERROR`, at `dbname` if it's written with lower-case only, this is just to be ignored and have been reported to PHPStorm for them to fix. (Currrent version 10.0.2)
To Top