XOOPS

Last-modified: 2007-12-31 (月) 12:41:20

MySQL4.1X対策 †

MySQLサーバのバージョン4.1以上でXOOPS 2.0.13a JPを使用する場合、MySQLのクライアント文字セットを明示的にMySQLサーバに通知する必要があります。現時点(2005/11)のXOOPSではこの機能がサポートされておらずXOOPSのソースコードを変更する必要があります。

D:\WWWRoot\xoops\class\database\mysqldatabase.php

※ D:\WWWRoot\xoopsはXOOPSのインストールフォルダです。

mysqldatabase.php
class XoopsMySQLDatabase extends XoopsDatabase
{
  /**
   * Database connection
   * @var resource
   */
  var $conn;
  /**
   * connect to the database
   *
   * @param bool $selectdb select the database now?
   * @return bool successful?
   */
  function connect($selectdb = true)
  {
    if (XOOPS_DB_PCONNECT == 1) {
      $this->conn = @mysql_pconnect(XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS);
    } else {
      $this->conn = @mysql_connect(XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS);
    }
  if (!$this->conn) {
      $this->logger->addQuery('', $this->error(), $this->errno());
      return false;
    }
    if($selectdb != false){
      if (!mysql_select_db(XOOPS_DB_NAME)) {
        $this->logger->addQuery('', $this->error(), $this->errno());
        return false;
      }
    }
    // MySql>=4.1 //////////////////////////////////////////////////////////////
    mysql_query("SET NAMES ujis", $this->conn);
    ////////////////////////////////////////////////////////////////////////////
    return true;
  }
  ・・・・・
}
追加するソースコードの以下の部分です。
    // MySql>=4.1 //////////////////////////////////////////////////////////////
    mysql_query("SET NAMES ujis", $this->conn);
    ////////////////////////////////////////////////////////////////////////////
より汎用的なコードを記述するには、MySQLのバージョンを取得して、MySQL4.1以上の場合のみ"SET NAME"するようにします。MySQLの文字セットに関しては「MySQL4.1/9.MySQLの実験/3.漢字の使用」を参照して下さい。

url(http://www.y2sunlight.com/ground/?XOOPS%2F2.%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%A4%CE%BD%E0%C8%F7#content_1_4):引用

MySQL4.1以降ではMySQLクライアントとMySQLサーバ間で文字コードの変換機能が追加され、それによって弊害(文字化け)が起きていた。

■対策方法■

phpMyAdmin等でデータベースの文字セットをujisに変更

XOOPS/class/database/mysqldatabase.phpに下記のコードを追加

/class/database/mysqldatabase.php
236行目付近の$result =& mysql_query($sql, $this->conn); の上に
mysql_query("SET CHARACTER SET ujis", $this->conn);
を追加

url(http://mynoah.net/archives/xoops.php):引用
せめて
mysqldatabase.php
にCHARACTER SET くらいいれてください

$rs = mysql_query("select version();", $this->conn);
if($rs <> FALSE) {
$col = mysql_fetch_row($rs);
if ($col[0] > "4.1.0") {
mysql_query("SET CHARACTER SET ujis", $this->conn);
}
mysql_free_result($rs);
}