To get UTF-8 charset you can specify that in the DSN.
$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
(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
$dsn
,$username
= null
,$password
= null
,$options
= null
Crea un objeto PDO que representa una conexión a la base de datos.
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:
dsn
contiene el DSN completo.
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
dsn
está compuesto por un nombre
name
que corresponde a
pdo.dsn.
en el fichero php.ini,
y que define la cadena DSN.
name
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.
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.
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);
?>
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';
?>
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.
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
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 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\''));
?>
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);
}
}
?>