PHP 8.5.0 Alpha 1 available for testing

PDO::__construct

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

PDO::__construct Crea una instancia PDO que representa una conexión a la base de datos

Descripción

public PDO::__construct(
    string $dsn,
    ?string $username = null,
    #[\SensitiveParameter] ?string $password = null,
    ?array $options = null
)

Crea un objeto PDO que representa una conexión a la base de datos.

Parámetros

dsn

El Data Source Name, o DSN, que contiene las informaciones requeridas para conectarse a la base de datos.

Generalmente, un DSN está compuesto por el nombre del controlador PDO, seguido de una sintaxis específica del controlador. Más detalles están disponibles en la documentación PDO de cada controlador.

El parámetro dsn soporta tres métodos diferentes para especificar los argumentos necesarios para la creación de la base de datos:

Invocación de controlador

dsn contiene el DSN completo.

Invocación URI

dsn está compuesto por uri: seguido por una URI que define la localización del fichero que contiene la cadena DSN. La URI puede especificar un fichero local o remoto.

uri:file:///path/to/dsnfile

Aliasing

dsn está compuesto por un nombre name que corresponde a pdo.dsn.name en el fichero php.ini, y que define la cadena DSN.

Nota:

El alias debe ser definido en el fichero php.ini, y no en un fichero .htaccess o httpd.conf

username

El nombre de usuario para la cadena DSN. Este parámetro es opcional para algunos controladores PDO.

password

La contraseña de la cadena DSN. Este parámetro es opcional para algunos controladores PDO.

options

Un array clave=>valor con las opciones específicas de conexión.

Errores/Excepciones

Se lanza una excepción PDOException si el intento de conexión a la base de datos solicitada falla, independientemente del PDO::ATTR_ERRMODE actualmente definido.

Ejemplos

Ejemplo #1 Crea una instancia PDO mediante una invocación de controlador

<?php

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

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

?>

Ejemplo #2 Crea una instancia PDO mediante una invocación URI

El ejemplo siguiente supone que el fichero /usr/local/dbconnect existe con permisos de acceso que permiten a PHP acceder a él. El fichero contiene entonces el DSN de PDO, para conectarse a una base de datos DB2, con el controlador PDO_ODBC:

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

El script PHP puede entonces crear una conexión a la base de datos, pasando en la URL el parámetro uri: y apuntando a la URI del fichero:

<?php

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

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

?>

Ejemplo #3 Crea una instancia PDO con un alias

El ejemplo siguiente supone que el fichero php.ini contiene la directiva siguiente para activar una conexión a un servidor MySQL, con el alias mydb:

[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
123
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
28
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
7
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
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
5
theking2 at king dot ma
2 years 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
11
Francesco Montanari
5 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
13
Victor T.
15 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
-1
Michal Stefanak
2 years 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);
}
}
?>
To Top