We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 33014 ☆ A M B ☆
    • 1,231 Posts
    何か試せそうなことが分かってきたのですが少しピンとこないので、とりあえず書き込み。以下、どうでしょう?

    @mysql_query("{$database_connection_method} {$database_connection_charset}");

    processors/login.processor.phpのコレと

    @mysql_query("{$connection_method} {$charset}", $this->conn);

    includes/extenders/dbapi.mysql.class.inc.phpのコレ。の違い?でしょうか。
    で、前者のアプローチの話をしてるわけですよね。

    僕が試してうまくいったのは、後者のDBAPIアプローチですが、違うのは$this->connってヤツ?
    if (!$this->conn = ($persist ? mysql_pconnect($host, $uid, $pwd) : mysql_connect($host, $uid, $pwd, true)))

    このような三項演算子を判定条件に持つif文が少し前にあるんですが。

    追記。追記ばかりですが・・
    login.processor.phpじゃなくてmanager/index.phpのほうかな。ここにも同じく
    @mysql_query("{$database_connection_method} {$database_connection_charset}");

    これがあります。
      • 36592
      • 970 Posts
      以下、私のかなり限られた知識での理解です。プログラミングエキスパートの方のフォローをお願いしま~す!

      基本的に、管理画面の1処理(≒クリック)毎に必ずMySQLのDBにコネクトしてコネクションを開きます(これは $modxDBConn)。login.processor.php と index.php の奴がこの処理で、これらは同じことをしていますが、ログイン時のみ login.processor.php が実行され、一旦ログインした後は index.php の方が実行されます。その直後に必ず SET NAMES/SET CHARACTER SET が実行されています。これが yama さんご指摘の部分です。Jasonに言わせれば、ここでちゃんと SET NAMES/SET CHARACTER SET してるから問題ないはずだ… ということになります。

      mysql_query()関数は2つの引数を取ります。1つはSQL文で2つ目はDBコネクションの指定です。管理画面のほとんどの処理は基本的に上記の1つのDBコネクションしか想定していないので、第2引数であるDBコネクションは記述されていません(ZeRoさんご指摘のように、記述されない時は直前に開かれたDBコネクションが使われます)。

      一方でDBAPIも独自でDBコネクションを確立しますが、こちらはDBへのアクセスが必要になるとオープンされますので、DBAPIが使われていない処理だけで済んでいる場合は、こちらのDBコネクションは開かれません。しかし、DBAPIで記載された処理が行われると、新たにもう1つのDBコネクションを開きます(これが $this->conn)。私が2つのDBコネクションが開かれていると書いたのはこういうことです。DBAPI内のquery関数( $modx->db->query() )では、第2引数として必ずDBAPI内で開かれた方のDBコネクションを指定していますので、こちらのコネクションが使われます。

      1つ前の投稿で私が書いたのは、このようにDBAPIが呼び出された後の処理に $modxDBConn の方のコネクションを想定して書いたmysql_query() とかが存在した場合、DBAPIの方のコネクションを使って処理されてしまうので、何かそこに違いがあるのかも? という話です。

      $modxDBConn を使うはずのmysql_query()等に、第2引数( $modxDBConn )を指定すると直ったりするのかなぁ~?
        • 33014 ☆ A M B ☆
        • 1,231 Posts
        なるほど。$this->connというのは、そういう感じの・・ちょっとニュアンスつかめました。
        (connというのはconnectのconnか、そういや)
        Quote from: tkfm at Nov 13, 2008, 08:10 PM

        $modxDBConn を使うはずのmysql_query()等に、第2引数( $modxDBConn )を指定すると直ったりするのかなぁ~?
        それも変な話ですけど、試してみる必要はありそうですね。ソース内に決め打ちでいいから値を何か入れてみるといいかな・・

        ちなみに文字化けの再現環境を確保してるのはこのトピでは僕だけのようですが、
        mixi経由でたまたま相談を受けて試用しているチカッパのサーバを利用してます。
        最新のDBサーバは僕がチカッパさんに指摘を入れてから改善されたとのことで、
        ひとつ古いmysql16サーバで文字化けを確認してます。興味のある方は試用どうぞ。(って、乱暴ですが・・汗)

        レンサバさんの問題であることには違いないですが、現実問題として想定する必要はあるかなと。
        チカッパさんはたまたま対応いただけましたが、指摘されても事情がよく分からず足踏みするレンサバも多いと思います。
          • 36592
          • 970 Posts
          Quote from: yama at Nov 13, 2008, 09:00 PM

          ソース内に決め打ちでいいから値を何か入れてみるといいかな・・
          単に、
          mysql_query( "SQL文" );

          となっているのを、
          mysql_query( "SQL文", $modxDBConn );

          にするだけですけどね。

          ちなみに文字化けの再現環境を確保してるのはこのトピでは僕だけのようですが...
          XAMPPは確かデフォルトインストール状態だと、MySQLサーバーのデフォルトエンコーディングが指定されないので、初期値であるlatin1_swedish_ci(でしたっけ?)が使われるはずです。なので、比較的簡単に文字化け環境が作れるのかも?
            • 33014 ☆ A M B ☆
            • 1,231 Posts
            index.phpの
            @mysql_query("{$database_connection_method} {$database_connection_charset}");

            を
            @mysql_query("{$database_connection_method} {$database_connection_charset}", "{$modxDBConn}");

            としてみました。この状態でMODx設定の「サイト名」を日本語で入力してみると、変化がありました。
            が、MODx設定内の入力値は化けずに「テストサイト」などと表示されていますが、左側のツリーペインなど
            各部は化けてます。今度は「??????」などではなく「テスト」などになってます。
            ついでに、日本語のドキュメント名が「??????」などに化けてます。
            化けた状態で更新されたわけではなく、出力が化けているだけのようですが。

            もう少し、mysql_connect及びmysql_pconnectの使い方を調べてみます。
            DBAPIのmysql_connectでは「true」なんてのが入ってたりして微妙に違うし。

            ちなみにチカッパのmysql16サーバのグローバル値は、collationのみutf8_general_ciに設定されていて、
            他はlatin1_swedish_ciになってます。collationをutf8_general_ciに変更したのもユーザからの指摘に
            よるものらしいけど、それだけではまだ足りないんですね。
              • 15497
              • 117 Posts
              ちょっとはずしているかもしれませんが、
              2つのコネクションで設定が違っていることが問題なんですよね?

              私の乏しい経験で考えられるのは、
              manager/index.phpの140行目
              mysql_select_db($dbase);

              が問題で、
              mysql_select_db(str_replace('`', '', $dbase));

              のように、データベース名の両側の「`」を取ってやれば、
              2つのコネクションは同じになる(近づく?)かと思います。

              私が使っている環境(PHP 5.1.6/MySQL 5.0.22)で検証した限り、
              mysql_select_dbには正味の(「`」等をつけずに)データベース名を渡さないと、誤動作するようです。
                ★日本公式フォーラム2009年9月1日本格始動!★
                http://modxcms-jp.com/bb/

                ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
                http://d.hatena.ne.jp/hikidas_ikeda/
                ▼制作済みHTMLページをmodxで更新するデモ
                http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
                • 33014 ☆ A M B ☆
                • 1,231 Posts
                情報ありがとうございます。
                正しく動作することを確認したDBAPIのほうを見てみると、たしかに
                $dbase = str_replace('`', '', $dbase); // remove the `` chars

                93行目にこのような記述があるようです。

                追記
                どういう組み合わせパターンで順に試していこう・・と考えつつ外出するつもりでしたが、
                とりあえず上記の一行を追加するだけしてみました。

                すると。今度は文字化けしませんでした。いくつものファイルにDBAPIを仕込んだりしたけど、今回は一行追記しただけ。
                時間がないのでひととおりは試してませんが、「MODx設定」以外ではスニペット管理画面の「説明」の欄も化けませんでした。

                解決?(理論の裏付けは必要でしょうけど)

                http://modxcms.com/forums/index.php/topic,24564.msg173310.html#msg173310
                こちらの話とも絡んできますよね
                  • 15497
                  • 117 Posts
                  このmysql_select_dbの仕様(バグ?)を知ったとき、
                  最初はconfig.inc.phpの「`」を削ったら良いかとも考えましたが、
                  データベース名のつけ方によっては、queryを発行する際に「`」が必要なので、
                  私の結論としては、mysql_select_dbに渡すデータベース名だけ、「`」を削って渡す。
                  ということが汎用的で、バージョンアップとしては妥当な方法かと思います。

                  #
                  個人的には、「`」で囲まないと問題がおこるようなデータベース名にしないので、
                  config.inc.phpのデータベース名から「`」を削って使っています。 wink
                    ★日本公式フォーラム2009年9月1日本格始動!★
                    http://modxcms-jp.com/bb/

                    ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
                    http://d.hatena.ne.jp/hikidas_ikeda/
                    ▼制作済みHTMLページをmodxで更新するデモ
                    http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
                    • 36592
                    • 970 Posts
                    すご~い! あっという間に解決ですね~
                    kazuikeさん、もう少し早く投稿してくれなくちゃ!
                    無駄にスレッドが伸びちゃいました… tongue

                    kazuikeさんのこの件の指摘は以前目にしてましたが、
                    私にはちんぷんかんぷんな領域でした…
                    原因がPHPの「バグ」ってことでは、私には手におえません~ :’(
                      • 27690
                      • 98 Posts
                      にっくです。Jiraに諸問題を投稿しました。

                      http://svn.modxcms.com/jira/browse/MODX-493
                      http://svn.modxcms.com/jira/browse/MODX-494
                      http://svn.modxcms.com/jira/browse/MODX-465

                      tkfmさんのファイルマネージャーの件は、Jiraへのコメントという形をとりましたが、反応してくれるかどうか少々心配。
                      もし何も反応がなかったらもう一度Jiraにあげなおします。