Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PDO connection : UTF-8 declaration with SET NAMES / CHARACTER SET?

According to php.net, Stack Overflow and other sources of trust, I can find 4 different ways to set UTF-8 on PDO connection, but can't find which one is the better to choose:

$pdo_db = 'mysql:host=localhost;dbname=local_db;charset=utf8'; // METHOD #1
$pdo_login = 'root';
$pdo_pass = 'localpass';

$db = new PDO($pdo_db, $pdo_login, $pdo_pass, array(
    PDO::ATTR_ERRMODE => $localhost ? PDO::ERRMODE_EXCEPTION : PDO::ERRMODE_SILENT,
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', // METHOD #2
));
$db->exec('SET NAMES utf8'); // METHOD #3
$db->exec('SET CHARACTER SET utf8'); // METHOD #4

So, what I understood, is that method 1 only works with PHP 5.3+ (but it seems that it's a bit buggy), and method 2 is for MySQL only. Differences between method 3 and 4 is MySQL thing, but I still don't know which one is better. And is there a way to call SET NAMES in PDO attributes, but not for MySQL only?

like image 507
Joan Avatar asked Dec 26 '12 15:12

Joan


1 Answers

Setting it in DSN is the only proper way (although it is only supported since 5.3).
You can this one and SET NAMES at the same time.

All the other ways will make infamous half-fictional GBK injection possible.

Please note that your setting for error_reporting() is utterly wrong. it have to be unconditional -1. If you concerned about displaying errors - there is a proper ini setting for this, called display_errors, can be set at runtime.
While error_reporting sets level of the error and should be at max all the time.

like image 102
Your Common Sense Avatar answered Nov 09 '22 14:11

Your Common Sense