PHP 8.3.6 Released!

PDO::__construct

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

PDO::__construct Erzeugt eine PDO-Instanz, die eine Datenbankverbindung darstellt

Beschreibung

public PDO::__construct(
    string $dsn,
    ?string $username = null,
    ?string $password = null,
    ?array $options = null
)

Erzeugt eine PDO-Instanz, die eine Verbindung zur angegebenen Datenbank darstellt.

Parameter-Liste

dsn

Der Name der Datenquelle (Data Source Name oder DSN) enthält die Informationen, die für die Verbindung mit der Datenbank erforderlich sind.

Im Allgemeinen besteht ein DSN aus dem Namen des PDO-Treibers, gefolgt von einem Doppelpunkt, gefolgt von der treiberspezifischen PDO-Verbindungssyntax. Weitere Informationen sind in der Dokumentation des betreffenden PDO-Treibers zu finden.

Der Parameter dsn unterstützt drei verschiedene Methoden, die für eine Datenbankverbindung benötigten Argumente anzugeben:

Aufrufen eines Treibers

dsn enthält den vollständigen DSN.

Aufrufen eines URIs

dsn besteht aus uri:, gefolgt von einem URI, der den Ort der Datei mit der DSN-Zeichenkette definiert. Der URI kann eine lokale Datei oder eine entfernte URL angeben.

uri:file:///pfad/zur/dsndatei

Über einen Alias

dsn besteht aus einem Namen name, der auf pdo.dsn.name in der php.ini abgebildet wird, das die DSN-Zeichenkette definiert.

Hinweis:

Der Alias muss in der php.ini definiert werden, nicht in der .htaccess oder der httpd.conf

username

Der Benutzername für die DSN-Zeichenkette. Dieser Parameter ist bei einigen PDO-Treibern optional.

password

Das Passwort für die DSN-Zeichenkette. Dieser Parameter ist bei einigen PDO-Treibern optional.

options

Ein Schlüssel=>Wert-Array mit treiberspezifischen Verbindungsoptionen.

Fehler/Exceptions

Wenn der Versuch, sich mit der angeforderten Datenbank zu verbinden, fehlschlägt, löst PDO::__construct() eine PDOException aus, unabhängig davon, welchen Wert PDO::ATTR_ERRMODE aktuell hat.

Beispiele

Beispiel #1 Erstellen einer PDO-Instanz über den Aufruf eines Treibers

<?php

$dsn
= 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

$dbh = new PDO($dsn, $user, $password);

?>

Beispiel #2 Erstellen einer PDO-Instanz über den Aufruf eines URIs

Im folgenden Beispiel wird davon ausgegangen, dass die Datei /usr/local/dbconnect existiert und entsprechende Zugriffsrechte hat, sodass sie von PHP gelesen werden kann. Sie enthält den PDO-DSN für die Verbindung zu einer DB2-Datenbank über den PDO_ODBC-Treiber:

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

Das PHP-Skript kann dann eine Verbindung zur Datenbank aufbauen, indem es einfach den Parameter uri: übergibt und auf die URI-Datei verweist:

<?php

$dsn
= 'uri:file:///usr/local/dbconnect';
$user = '';
$password = '';

$dbh = new PDO($dsn, $user, $password);

?>

Beispiel #3 Erstellen einer PDO-Instanz über einen Alias

Im folgenden Beispiel wird davon ausgegangen, dass die php.ini den folgenden Eintrag enthält, um mit nur dem Alias mydb eine Verbindung zu einer MySQL-Datenbank herzustellen:

[PDO]
pdo.dsn.mydb="mysql:dbname=testdb;host=localhost"
<?php

$dsn
= 'mydb';
$user = '';
$password = '';

$dbh = new PDO($dsn, $user, $password);

?>

add a note

User Contributed Notes 16 notes

up
123
Kiipa at live dot com
10 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
5
theking2 at king dot ma
1 year ago
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"
up
41
subme at interia dot pl
15 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
8
Aymeric S
3 years ago
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
up
28
piotrekkr at o2 dot pl
13 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
21
daviddlavier at gmail dot com
8 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
2
Michal Stefanak
1 year ago
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);
}
}
?>
up
8
Francesco Montanari
3 years ago
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);
up
14
Victor T.
14 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
0
max1josef
11 months ago
SQLite3: by default, the database file is created on opening if it does not exist (PDO::SQLITE_OPEN_CREATE).

<?php
$dsn
= 'sqlite:D:\Databases\non_existing.db'; // file does not exist

try {
$dbh = new PDO($dsn);
}
catch(
PDOException $e) {
print
$e->getMessage();
}
?>

No Exception is thrown, instead file "non_existing.db" will be created. To avoid this, use:

<?php
$dsn
= 'sqlite:D:\Databases\non_existing.db';
$options = [
PDO::SQLITE_ATTR_OPEN_FLAGS => PDO::SQLITE_OPEN_READWRITE,
];

try {
$dbh = new PDO('sqlite:D:\Databases\non_existing.db', null, null, $options);
}
catch(
PDOException $e) {
print
$e->getMessage();
}
?>
This will ouput:
SQLSTATE[HY000] [14] unable to open database file

If you want to open the database read-only, use PDO::SQLITE_OPEN_READONLY.
up
0
453034559 at qq dot com
2 years ago
// set DEFAULT_FETCH_MODE
<?php
try {
$p = new PDO("mysql:host=$db_host;port=$db_port;dbname=$db_dbname", $db_user, $db_pass,array(
PDO::ATTR_DEFAULT_FETCH_MODE =>PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', //after php5.3.6
));
//$p->exec('SET NAMES utf8');
} catch (PDOException $e) {
print
"Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
up
0
Anonymous
10 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
-2
ohcc at 163 dot com
8 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
-3
berk0081 at umn dot edu
9 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
-9
srycroft at excelsystems dot com
7 years 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
-31
olivernybroe at gmail dot com
7 years 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