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 — Crée une instance PDO qui représente une connexion à la base
$dsn
,$username
= null
,$password
= null
,$options
= null
Crée un objet PDO qui représente une connexion à la base.
dsn
Le Data Source Name
, ou DSN, qui contient les
informations requises pour se connecter à la base.
En général, un DSN est constitué du nom du pilote PDO, suivi d'une syntaxe spécifique au pilote. Plus de détails sont disponibles dans la documentation PDO de chaque pilote.
Le paramètre dsn
supporte trois méthodes différentes
pour spécifier les arguments nécessaires à la création de la base de données :
dsn
contient le DSN complet.
dsn
est constitué de uri:
suivi par une URI qui définit la localisation du fichier contenant
la chaîne de DSN. L'URI peut spécifier un fichier local ou distant.
uri:file:///path/to/dsnfile
dsn
est constitué d'un nom
name
qui correspond à
pdo.dsn.
dans le fichier php.ini,
et qui définit la chaîne DSN.
name
Note:
L'alias doit être défini dans le fichier php.ini, et non pas dans un fichier .htaccess ou httpd.conf
username
Le nom d'utilisateur pour la chaîne DSN. Ce paramètre est optionnel pour certains pilote PDO.
password
Le mot de passe de la chaîne DSN. Ce paramètre est optionnel pour certains pilote PDO.
options
Un tableau clé=>valeur avec les options spécifiques de connexion.
Une exception PDOException est levée si la tentative
de connexion à la base de données demandée échoue,
indépendamment du PDO::ATTR_ERRMODE
actuellement défini.
Exemple #1 Crée une instance PDO via une invocation de pilote
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
?>
Exemple #2 Crée une instance PDO via une invocation URI
L'exemple ci-dessous suppose que le fichier /usr/local/dbconnect existe avec des droits d'accès qui permettent à PHP d'y accéder. Le fichier contient alors le DSN de PDO, pour se connecter à une base de données DB2, avec le pilote PDO_ODBC :
odbc:DSN=SAMPLE;UID=john;PWD=mypass
Le script PHP peut alors créer une connexion de base de données, en passant
dans l'URL le paramètre uri:
et en pointant sur l'URI du fichier :
<?php
$dsn = 'uri:file:///usr/local/dbconnect';
$user = '';
$password = '';
$dbh = new PDO($dsn, $user, $password);
?>
Exemple #3 Crée une instance PDO avec un alias
L'exemple ci-dessous suppose que le fichier php.ini contient la directive
suivant pour activer une connexion à un serveur MySQL, avec l'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';
?>
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
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.
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 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);
}
}
?>