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, PECL pdo >= 0.1.0)
PDO::__construct — Creates a PDO instance representing a connection to a database
$dsn
[, string $username
[, string $password
[, array $options
]]] )Creates a PDO instance to represent a connection to the requested database.
The Data Source Name, or DSN, contains the information required to connect to the database.
In general, a DSN consists of the PDO driver name, followed by a colon, followed by the PDO driver-specific connection syntax. Further information is available from the PDO driver-specific documentation.
The dsn
parameter supports three
different methods of specifying the arguments required to create
a database connection:
dsn
contains the full DSN.
dsn
consists of uri:
followed by a URI that defines the location of a file containing
the DSN string. The URI can specify a local file or a remote URL.
uri:file:///path/to/dsnfile
dsn
consists of a name
name
that maps to
pdo.dsn.
in php.ini
defining the DSN string.
name
Note:
The alias must be defined in php.ini, and not .htaccess or httpd.conf
The user name for the DSN string. This parameter is optional for some PDO drivers.
The password for the DSN string. This parameter is optional for some PDO drivers.
A key=>value array of driver-specific connection options.
Returns a PDO object on success.
PDO::__construct() throws a PDOException if the attempt to connect to the requested database fails.
Example #1 Create a PDO instance via driver invocation
<?php
/* Connect to an ODBC database using driver invocation */
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>
Example #2 Create a PDO instance via URI invocation
The following example assumes that the file /usr/local/dbconnect exists with file permissions that enable PHP to read the file. The file contains the PDO DSN to connect to a DB2 database through the PDO_ODBC driver:
odbc:DSN=SAMPLE;UID=john;PWD=mypass
The PHP script can then create a database connection by simply passing the uri: parameter and pointing to the file URI:
<?php
/* Connect to an ODBC database using driver invocation */
$dsn = 'uri:file:///usr/local/dbconnect';
$user = '';
$password = '';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>
Example #3 Create a PDO instance using an alias
The following example assumes that php.ini contains the following entry to enable a connection to a MySQL database using only the alias mydb:
[PDO] pdo.dsn.mydb="mysql:dbname=testdb;host=localhost"
<?php
/* Connect to an ODBC database using an alias */
$dsn = 'mydb';
$user = '';
$password = '';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>
Note:
Before PHP5.3, a class which extends PDO and implements __call magic will always receive lower case
$method
.
To get UTF-8 charset you can specify that in the DSN.
$link = new PDO("mysql:host=localhost;dbname=DB;charset=UTF8");
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.
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 specify a database connection port use the following DSN string
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1;port=3333';
?>
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.
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.
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");
?>
To connect to the database via a function use this and call the getConnection function in the class constructor.
<?php
class Connection{
protected $db;
public function Connection(){
$conn = NULL;
try{
$conn = new PDO("mysql:host=localhost;dbname=dbname", "dbuser", "dbpass");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e){
echo 'ERROR: ' . $e->getMessage();
}
$this->db = $conn;
}
public function getConnection(){
return $this->db;
}
}
?>
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();
}
?>
The PDO connection is case-sensitive, this means that you cannot write
`$PDO = new PDO("MySQL:DBName=dbname;host=localhost");`
You would have to write it
`$PDO = new PDO("mysql:dbname=dbname;host=localhost");`
The difference here is that `mysql` and `dbname` is with all lower-case.
Some IDE's like PHPStorm will show a `TYPO ERROR`, at `dbname` if it's written with lower-case only, this is just to be ignored and have been reported to PHPStorm for them to fix. (Currrent version 10.0.2)
<?php
// PDO::__construct can end up with a fatal error rather than throw an exception even if you try ... catch ... .
try{
$db = new PDO(
// a database to which connection may fail
'mysql:host=www.wuxiancheng.cn; dbname=php; port=3306; charset=utf8',
'root',
'rx00t',
array(
PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,
PDO::ATTR_TIMEOUT=>1,
)
);
}catch(PDOException $pe){
// test the following lines of code respectively, and you will find the first line and the second line will end up with a fatal error.
throw $pe; // Fatal error: in path\file.php on line n, script ends, no exception thrown
throw new PDOException($pe->getMessage()); //Fatal error: in path\file.php on line n, script ends, no exception thrown
throw new PDOException ('cannot connect to the database'); // an exception is thrown as expected
throw new PDOException('error: '.$pe->getMessage()); //Fatal error: in path\file.php on line n, script ends, no exception thrown
throw new PDOException($pe->getLine()); // an exception is thrown as expected
throw new PDOException($pe->getFile()); // an exception is thrown as expected
throw new PDOException($pe->getCode()); // an exception is thrown as expected
throw new PDOException($pe->getTraceAsString()); // an exception is thrown as expected
}
?>
If you happen to create a dsn like this...
<?php
//wrong dsn
$db = new PDO('mysql:database=yourdb;host=127.0.0.1', 'user', 'password');
$stmt = $db->prepare('SELECT * FROM tbl WHERE id = :id');
$stmt->bindParam(':id', $user_id, PDO::PARAM_INT);
$result = $stmt->execute();
?>
... your result will be bool(false) and your $db->errorInfo() will be "0000" which isn't very helpful.
You have to look to the $stmt->errorInfo() to see "No database selected" which is even more confusing until you realize that it's not 'database' but 'dbname' in your DSN! You would think the error about a bad DSN would be in the $db errorInfo but it is not, it's not until you try the $stmt that the error is generated.
<?php
//correct dsn
$db = new PDO('mysql:dbname=yourdb;host=127.0.0.1', 'user', 'password');
?>
I wasted a half hour on that one.