We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 23276
    • 85 Posts
    Quote from: sama55 at Nov 11, 2008, 09:50 PM

    1.現象
     0963-RC2でphiEditedonのカレンダーボタンが動かない。
    よろしくお願いします。
    3.直接原因
     編集画面のpe_editedonのinputタグおよびスクリプトを調べたところ、アンダースコア("_")がURLエンコーディングされていることに気がつきました。
     HTML上では、"tvpe_editedon"といったシンボルが"tvpe%5Feditedon"に置き換えられています。

    samaさん、こんにちは。ご報告ありがとうございました smiley

    0963からは、TV名に記号を含むTVも正しく扱えるように修正されたので、その影響っぽいですね…
    入力タイプがdateのTVで、TV名に記号を含んでいる場合には全てカレンダーが表示されませんでした。
    (JavaScriptのメソッド名までエンコードされてしまってるため)

    にっくさん、よろしくお願いします。
      • 33014 ☆ A M B ☆
      • 1,231 Posts
      Quote from: tkfm at Nov 13, 2008, 12:43 AM

      確かに manager/processors/login.processor.php で mysql_connect()した後 SET NAMES/SET CHARACTER SET してますね(20行目~25行目)。このファイルはおそらく管理画面にログインする時必ず実行されるので、以降の管理画面での操作に伴うDBとのやり取りでは、ちゃんと SET NAMES/SET CHARACTER SET が適用されているってことになるわけですね。

      何かのきっかけでこれがリセット(あるいは変更)されてしまうことってあるんでしょうか?
      なんか、そこらへんにヒントがあるような気がします。ログイン時の実行だけでは万全ではないのかも。

      DBAPI経由だと
      @mysql_query("{$connection_method} {$charset}", $this->conn);

      これが必ず実行されます。SET CHARACTER SET設定でインストールした場合ならSET CHARACTER SETですね。
      だから間違いないと思うのですが、他にもいろいろ処理が入ってるから今はDBAPIを使わないほうが無難なのかな。
      MySQL関数を直接叩かずにAPI経由での解決ってスマートでよいなと思うのですが。

      追記
      最初に参考にしたのが processors/save_content.processor.php です。このファイルはドキュメント編集画面に
      関するものだと思いますが、mysql_query ではなく $modx->db->query に置き換えられています。
      rc2はドキュメント編集に関しては文字化けしないようになっているので、これが関係あるのかなと思ったのでした。

      もうひとつ追記
      Quote from: tkfm at Nov 13, 2008, 12:43 AM
      connect() 関数だけですね。query() 関数は全然変更されていません
      query( )関数の中からconnect( )関数にアクセスしているように思えますが、どうでしょう?
        • 33014 ☆ A M B ☆
        • 1,231 Posts
              if (empty ($this->conn) || !is_resource($this->conn)) {
                 $this->connect();
              }

        DBAPI (includes/extenders/dbapi.mysql.class.inc.php) のquery( )関数内の
        上記の行をコメントアウトすると、管理画面の操作がまったくできなくなりますね。
        ここのところが要になってる気がします。ログインした後も、ここの処理は必ず通るのでは。

          • 36592
          • 970 Posts
          あ~勉強になります~ wink

          私勘違いしていました。manager/index.php の37行目(のif文の内容)の
          $modxDBConn = mysql_connect($database_server, $database_user, $database_password)

          で作られるDBコネクションと、modxオブジェクトの中のDBAPIで作られるDBコネクションを、同じものだと思っていました。これって、2つの別のDBコネクションが同時にオープンされてるってことなんですよね?

          どうやって使い分けるんだろ?
            • 33014 ☆ A M B ☆
            • 1,231 Posts
            Quote from: tkfm at Nov 13, 2008, 02:40 AM

            私勘違いしていました。manager/index.php の37行目(のif文の内容)の
            $modxDBConn = mysql_connect($database_server, $database_user, $database_password)

            で作られるDBコネクションと、modxオブジェクトの中のDBAPIで作られるDBコネクションを、同じものだと思っていました。これって、2つの別のDBコネクションが同時にオープンされてるってことなんですよね?
            うーん、どうでしょう。インクルードするファイルが多いので追いきれないですが(孫インクルードもあるし)、2つ同時にコネクション張ってなくて、どこかでmysql_closeしてるかも。この種のコードってそう作るのが普通なのかも、という気もしますが。(つなぎっぱなしを避ける、みたいな。詳しい方のフォロー求む)
            さっきdbapiの一部を編集すると管理画面が表示されなくなりましたが、その中にmysql_closeはあるようです。
              • 36592
              • 970 Posts
              あ~段々Jason氏が言ってる意味が分かってきた気がする… :’(
              だから何故文字化けしてしまうのかが分からなくなってしまいました…

              save_content.processor.php が何故DBAPIを使っているのかも良く分かりませんね。
              Rev.4173で修正されているようですが、そのコメントが
              「Refactor save_content.processor.inc.php to use MODx DBAPI」
              と書かれているだけで、何故そう変更したのかについては何も書かれていません…

              Quote from: yama at Nov 13, 2008, 03:23 AM

              どこかでmysql_closeしてるかも。
              さっきdbapiの一部を編集すると管理画面が表示されなくなりましたが、その中にmysql_closeはあるようです。
              mysql_close() 関数は確かに DBAPI ( db->disconnect() 関数 ) にありますが、
              関数定義の中にあるだけでその関数を実際に呼んでいる部分は無さそうですよ~
                • 33014 ☆ A M B ☆
                • 1,231 Posts
                Quote from: tkfm at Nov 13, 2008, 04:46 AM

                mysql_close() 関数は確かに DBAPI ( db->disconnect() 関数 ) にありますが、
                関数定義の中にあるだけでその関数を実際に呼んでいる部分は無さそうですよ~
                あれ?ほんとですね。document.parser.class.inc.phpからは呼ばれてるみたいだけど、管理画面
                全般としては関係ないし。ちなみにmysql_close( ) 関数はdbClose( )という別名もあるみたいだけど、
                これはホントにどこからも呼ばれてない。

                save_content.processor.phpでDBAPIを採用した理由を確認したい気もします。
                「ドキュメント編集画面以外でもエンコード対応が必要とは思わなかった」なんてオチもないと思うし。(だよね?汗)
                Jasonの表現では、そこはエンコード対応とは関係ないみたいなニュアンスがありますよね。
                でもJasonが意識しているしていないに関わらず、僕から見た感じでは関係してるように思えます。

                少し切り口が見えてきた気がします。これをクリアできれば大きいんですが。
                  • 33014 ☆ A M B ☆
                  • 1,231 Posts
                  http://svn.modxcms.com/jira/browse/MODX-460

                  あと、これの件が開発チームに意図が伝わってないです。
                  (MySQLの特定のバージョンではアラートを出すようにしてるという返事はもらってるけど、その件とは違う)
                  問題ないWarningなので、非表示にしてほしいです。
                    • 33488
                    • 429 Posts
                    すっごいスレが伸びてますねぇ うっかり 投げっぱなしでした。
                    えーと、tkfmさんのレスを見ると 2つのコネクションが張られているってことですよね?
                    DBAPI($modx->db)ともう1つmanager/index.phpで行われてるmysql_conect

                    だとすると、最後に実行した方のconnectがmysql_query($query)のときに使われるリンクになります。

                    これって やっぱ1つにすべきですよねぇ・・・文字化けは、多分この2つがあるから両方にSET NAMESとかしとけばOKもしくはDB APIで統一ってことですかねぇ。

                    元々の関係ないよってのは、2つコネクトしてるとは考えてなかったからじゃないっすかね
                      • 36592
                      • 970 Posts
                      そろそろ私が手におえない領域に入り込んでいる気がしてます… :’(
                      Quote from: ZeRo at Nov 13, 2008, 08:23 AM

                      最後に実行した方のconnectがmysql_query($query)のときに使われるリンクになります。
                      そうなんですか~ だとすると、最初 mysql_query($query) の方のDBコネクションで処理がなされてきて、途中でDBAPIが呼び出されてDBコネクションが新たに張り直されると、そもそも最初の mysql_query($query) を想定して記述されている各種MySQL関数は、DBAPIで開かれたDBコネクションを使って実行されるってことなんですね~ ここら辺で何か問題があるのかな~

                      文字化けは、多分この2つがあるから両方にSET NAMESとかしとけばOKもしくはDB APIで統一ってことですかねぇ。
                      Jasonは多分前者(両方に適切に SET NAMES/SET CHARACTER SET が実行されています)のスタンスで問題ないはずだと言ってるわけですね。やっぱり、この両者の違いを明確化しないと Jason を納得させられない感じがします(私はこれ以上技術的な話は無理です… undecided)。