sophie sophie - 1 year ago 247
PHP Question

PDO and UTF-8 Special characters in PHP / MySQL?

This code I were try .I am using Mysql and php 5.3

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$con = mysql_connect("localhost","root","");
if (!$con)
die('Could not connect: ' . mysql_error());

mysql_select_db("kdict", $con);
$sql = "SELECT * FROM `en-kh` where english='a'";
echo $sql;
$result = mysql_query($sql);

while($row = mysql_fetch_array($result))
echo $row['english'] . " </br> " . $row['khmer'];
echo "<br />";

=> I got good utf-8 render display ,well done.

But for Now I create a class PDO to keep easy to extend and more easy

class crud {
public function conn()
if (!$this->db instanceof PDO)
$this->db = new PDO($this->dsn, $this->username, $this->password);
$this->db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

/*more code here*/

/*** a new crud object ***/
$crud = new crud();
/*** The DSN ***/
$crud->dsn = "mysql:dbname=kdict;host=localhost";

/*** MySQL username and password ***/
$crud->username = 'root';
$crud->password = '';
/*** select all records from table ***/
$records = $crud->rawSelect("SELECT * FROM `en-kh` where english='a'");

/*** fetch only associative array of values ***/
$rows = $records->fetchAll(PDO::FETCH_ASSOC);

/*** display the records ***/
foreach($rows as $row)
foreach($row as $fieldname=>$value)
echo $fieldname.' = '.$value.'<br />';
echo '<hr />';

But it display with my character something like this '????'

I found in stackoverflow this link it look the same problem i met
Special characters in PHP / MySQL

It look the same my problem => I try to fixed it .but I still not got it.
$this->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAME'utf8'");

Anyone can told me what is problem?How Can I correct it?


Answer Source

You're missing an S: it's SET NAMES and not SET NAME:

$this->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");

You also need to un-comment it of course. Also, PDO::MYSQL_ATTR_INIT_COMMAND can not be set with PDO::setAttribute() after you've established your database connection (the constant name says it all), you've to specify it in the constructor using the $driver_options argument, like this:

$this->db = new PDO($this->dsn, $this->username, $this->password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));

An alternative to this is to just execute that very same query immediately after connecting:

$this->db = new PDO($this->dsn, $this->username, $this->password);
$this->db->exec("SET NAMES 'utf8';");
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download