mikecao/sparrow

UTF8

fabiandev opened this issue · 4 comments

Hi,

I just noticed, that sparrow (i'm using pdo) doesn't display special characters correctly (noticed with äöü).
I fixed this by changing line 667 to:

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

By the way: I really appreciate your work and started using Flight as well on a project!

Update: I just made a pull request :)

You can declare your own PDO object with the correct charset and then pass it into sparrow.

See http://stackoverflow.com/questions/4361459/php-pdo-charset-set-names

kamov commented

Thanks for your reply.
Yes I understand this.
However I am trying to allow my application to work with different database engine.

So I initizialize the database in this way:

public function __construct($config)
{
    $this->db = new Sparrow();
    $this->db->setDb($config);
}

where $config is:

[
'type' => 'mysqli', // mysqli | mysql | pgsql | sqlite | sqlite3 | pdomysql | pdopgsql | pdosqlite
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'mydatabase'
'charset' => 'utf8'
]

So is only enough to change config in order to change database engine.

kamov commented

For example this is for mysqli, mysql and pdo:

switch ($db['type']) {
                case 'mysqli':
                    $this->db = new mysqli(
                        $db['hostname'],
                        $db['username'],
                        $db['password'],
                        $db['database']
                    );

                    if ($this->db->connect_error) {
                        throw new Exception('Connection error: '.$this->db->connect_error);
                    }

                    /* Change character set */
                    if (! $this->db->set_charset($db['charset'])) {
                        throw new Exception("Error loading character set utf8: %s\n", $this->db->error);
                    }

                    break;

                case 'mysql':
                    $this->db = mysql_connect(
                        $db['hostname'],
                        $db['username'],
                        $db['password']
                    );

                    if (!$this->db) {
                        throw new Exception('Connection error: '.mysql_error());
                    }

                    /* Change character set */
                    mysql_set_charset($db['charset'], $this->db);

                    mysql_select_db($db['database'], $this->db);

                    break;

                case 'pdomysql':
                    $dsn = sprintf(
                        'mysql:host=%s;port=%d;dbname=%s;charset=%s',  /* Change character set */
                        $db['hostname'],
                        isset($db['port']) ? $db['port'] : 3306,
                        $db['database'],
                        $db['charset']  /* Change character set */
                    );

                    $this->db = new PDO($dsn, $db['username'], $db['password']);
                    $db['type'] = 'pdo';

                    break;

            }
kamov commented

For pgsql, I think that is http://php.net/manual/en/function.pg-set-client-encoding.php
but I am not sure.

Not sure also for sqlite and sqlite3.

And in last, for pdomysql and pdosqlite, I think that only way is to run query:

$this->db->('SET NAMES UTF8');

I guess why not add this on sparrow?

thanks