Solar 连接数据库的编码问题和网页的编码问题?
这篇文章已同步发表到论坛:http://solarphp.org.cn/viewtopic.php?f=2&t=83 今天在群里面【普通人】问到数据库的编码问题和网页的编码问题,我在这里一并回答了。注:这里使用Acme作为默认vendor 8-) 。 首先,Solar并没有准备数据库编码的配置,不过这很容易完成,大家都知道, :lol: Solar是一个极易扩展的框架。下面说说解决方案: 方法一、修改/source /solar/Solar/Sql/Adapter/Mysql.php文件 注意:Solar在数据库上选择的是PDO。/source /solar/Solar/Sql/Adapter目录下所有的文件都继承自/source/solar/Solar/Sql/Adapter.php,数据库连接的代码在/source/solar/Solar/Sql/Adapter.php文件中(第456行):
public function connect() { // if we already have a PDO object, no need to re-connect. if ($this->_pdo) { return; } // start profile time $time = microtime(true); // attempt the connection $this->_pdo = new PDO( $this->_dsn, $this->_config['user'], $this->_config['pass'] ); // retain connection info $this->_pdo->solar_conn = array( 'dsn' => $this->_dsn, 'user' => $this->_config['user'], 'pass' => $this->_config['pass'], 'type' => 'single', 'key' => null, ); // post-connection tasks $this->_postConnect(); // retain the profile data? $this->_addProfile($time, '__CONNECT'); }
当然,我们不能直接修改这个文件,因为不同的数据库设置编码的方式不一样,我们应该在 /source/solar/Solar/Sql/Adapter/Mysql.php文件中覆盖父类的connect方法,因此只需在/source /solar/Solar/Sql/Adapter/Mysql.php文件中加入以下代码:
public function connect() { parent::connect(); if(isset($this->_config['charset'])) { $this->_pdo->exec('SET NAMES ' . $this->_config['charset']); } }
然后,在配置文件/config.php中加入数据库编码选项,如下:
$config['Solar_Sql_Adapter_Mysql'] = array( 'host' => 'localhost', // the database server host 'name' => 'pzblog', // the database name 'user' => 'root', // authenticate as this user 'pass' => '123456', // authenticate with this password 'charset' => 'utf8', //注意,此处是utf8,而不是utf-8 );
方法二、为了不改变官方的源码,方便升级,写一个自己的数据库类继承Solar\_Sql\_Adapter\_Mysql类即可。 在哪建文件呢,这里又存在linux和windows的区别了,先说linux:请建立文件/source/acme/Acme/Sql/Adapter/Mysql.php,再说windows:请建立文件 /include/Acme/Sql/Adapter/Mysql.php。(注:上面提到的目录如果不存在就新建该目录) 内容是:
class Acme_Sql_Adapter_Mysql extends Solar_Sql_Adapter_Mysql { /** * * Creates a PDO object and connects to the database. * Set the character collation, if defined. * * @return void * */ public function connect() { parent::connect(); if(isset($this->_config['charset'])) { $this->_pdo->exec('SET NAMES ' . $this->_config['charset']); } } }
我这里也提供一份,下载后解压放到 /include/Acme目录下即可。下载地址请移步到论坛 此时,配置文件要相应的改成:
$config['Solar_Sql']['adapter'] = 'Acme_Sql_Adapter_Mysql'; // configure the SQL adapter class $config['Acme_Sql_Adapter_Mysql'] = array( 'host' => 'localhost', // the database server host 'name' => 'pzblog', // the database name 'user' => 'root', // authenticate as this user 'pass' => '123456', // authenticate with this password 'charset' => 'utf8', //注意,此处是utf8,而不是utf-8 );
试一下,成功了吧?呵呵。。。
其次是网页编码问题,这个其实官方的文档中有,希望各位童鞋多查资料,打开/include/Acme/App /Blog/View/index.php文件,对应加入相关代码:
$this->head() ->setTitle($title) ->addStyleBase('Acme/style.css') ->addMetaHttp('Content-Type', 'text/html; charset=utf-8') ->fetch();
具体用法请参考:http://solarphp.com/class/Solar\_View\_Helper\_Head/addMetaHttp%28%29