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 — Erzeugt eine PDO-Instanz, die eine Datenbankverbindung darstellt
$dsn
,$username
= null
,$password
= null
,$options
= null
Erzeugt eine PDO-Instanz, die eine Verbindung zur angegebenen Datenbank darstellt.
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:
dsn
enthält den vollständigen DSN.
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
dsn
besteht aus einem Namen
name
, der auf
pdo.dsn.
in der php.ini
abgebildet wird, das die DSN-Zeichenkette definiert.
name
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.
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.
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);
?>
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.
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);
}
}
?>
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\''));
?>
// 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();
}
?>
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.
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();
}
?>
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");
?>
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.