PHP Conference Japan 2024

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,
    #[\SensitiveParameter] ?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 9 notes

up
126
Kiipa at live dot com
11 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
41
subme at interia dot pl
16 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
4 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
29
piotrekkr at o2 dot pl
14 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
20
daviddlavier at gmail dot com
9 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
4
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
10
Francesco Montanari
4 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
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
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\''));
?>
To Top