We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 4194
    • 7 Posts
    はじめまして!
    現在MODxを勉強中の初心者のBR_TOKYOと申します!

    スニペット内でDBAPIを利用して『データベースのテーブルからデータを抽出』したいのですが、
    利用方法についての日本語解説等はありますでしょうか??


    具体的にやりたい内容は「各ページ毎にページタイトルを元にデータ抽出」ということがしたいのですが、
    php、SQLなどあまり詳しくないため難航しています。。


    当初『スニペット』にSQL文を下記のようなイメージで抽出できたらなぁと思ってました。。
    select * from テーブル名 where ○○ = ’[*pagetitle*]’"

    『データグリッド』の利用も試してみたのですが、
    やはり「ページタイトルを元にデータ抽出」といったところが分かりませんでした。。。

    php、SQLを扱うにしては、非常に未熟なご質問なのかも知れませんが、
    よろしくお願いいたします。。m(_ _;)m
      • 36592
      • 970 Posts
      こんにちは~
      Quote from: BR_TOKYO at Dec 05, 2008, 04:47 AM

      スニペット内でDBAPIを利用して『データベースのテーブルからデータを抽出』したいのですが、
      利用方法についての日本語解説等はありますでしょうか??
      う~ん、見たことないかも...
      あったら私もそれを見て勉強したいですぅ~

      select * from テーブル名 where ○○ = ’[*pagetitle*]’"
      スニペットの中では [*pagetitle*] とかは使えないんですよ。
      なので、スニペットへの引数として、例えば &data=`[*pagetitle*]` とかで外部から渡すか、
      MODx API の getDocumentObject で取得するかしないとダメなんですよね~
        • 4194
        • 7 Posts
        tkfmさん
        はじめまして!早速のコメントありがとうございます!

        やはり【DBAPI】の日本語解説についてはないんですねぇ。。。

        スニペットへの引数として、例えば &data=`[*pagetitle*]` とかで外部から渡すか、
        MODx API の getDocumentObject で取得するかしないと
        ご提案いただいた上記の方法を試してみたいのですが、
        具体的な方法ってご教授いただけますかっ?

        ここ二週間ほど、色々とサイトを調べたりもしているのですが、
        英語も分からずプログラムも理解が浅いもので、
        MODx API の使い方等も良く分からなく、暗礁に乗り上げてしまっています。。

        お手数をお掛けしますが、よろしくお願いいたします。m(_ _;)m
          • 36592
          • 970 Posts
          Quote from: BR_TOKYO at Dec 08, 2008, 08:57 AM

          ご提案いただいた上記の方法を試してみたいのですが、
          具体的な方法ってご教授いただけますかっ?
          あっ、いや、私も素人みたいなものなんで... tongue

          具体的に、こうしたけど動かないという感じでご質問頂いた方が宜しいかと。
          スニペットのソースも公開しつつ、そのスニペットをどう呼び出したかも書いて頂いて。
          ここにはプログラミングのプロの方がたくさんいらっしゃいますから、
          的確なフォローを頂けると思います。

          あと、既存のスニペットの簡単なもののソースを見てみると、
          スニペットのプログラミングの仕方の勉強になると思います。
          私もそうやって勉強中です~ grin
            • 4194
            • 7 Posts
            tkfmさん
            アドバイスありがとうございます!

            現在、下記二通りの構文を別々の『スニペット』に記述して試しています。


            <?php
            $output = ’’;
            $result = $modx->db->query(’ SELECT * FROM `テーブル名` ’);

            while( $row = $modx->db->getRow( $result ) ) {
            $output .= ’<tr><td>’ . $row[’date’] . ’</td></td><td>’ . $row[’stadium’] . ’</td><td>’ . $row[’team’] . ’</td><td>’ . $row[’score’]. ’</td></tr>’. "\n";
            }

            echo ’<table>’. "\n";
            echo ’<tr><th>日付</th><th>STADIUM</th><th>TEAM</th><th>SCORE</th></tr>’. "\n";
            echo $output;
            echo ’</table>’;
            ?>



            <?php
            $host = "serverName○○○"; // サーバー名
            $id = "userName○○○"; // ユーザー名
            $pass = "Password○○○"; // パスワード
            $dbName = "databaseName○○○"; // データベース名
            $con = mysql_connect ($host,$id,$pass); // mysql_connectにて接続
            $strSql = "select * from テーブル名"; // sqlの発行
            $res = mysql_db_query($dbName,$strSql); // mysql_db_queryでSQL文を発行

            print "<table>\n";
            print "<tr><th>日付</th><th>STADIUM</th><th>TEAM</th><th>SCORE</th></tr>\n";

            while($row = mysql_fetch_array($res)) { // mysql_fetch_arrayで結果を取得して表示
            print "<tr><td>";
            print $row[’date’];
            print "</td><td>";
            print $row[’stadium’];
            print "</td><td>";
            print $row[’team’];
            print "</td><td>";
            print $row[’score’];
            print "</td></tr>\n";
            }
            print "</table>";

            mysql_free_result($res); //結果レコードをメモリから開放
            mysql_close($con); //DBへの接続を切断
            ?>


            ネットから拾ってきたソースなので、
            どちらのアプローチが良いのかも分からないのですが、
            いずれにしても、
            select * from テーブル名 where ○○ = ’[*pagetitle*]’"
            『where』以降の記述をどうして良いものか悩んでいます。。

            ご意見頂ければと思いますので、
            よろしくお願いいたします!
              • 36592
              • 970 Posts
              Quote from: BR_TOKYO at Dec 09, 2008, 08:53 AM

              どちらのアプローチが良いのかも分からないのですが、
              どちらも動作すると思いますが、基本的にはMODxのDBAPIを使う前者(赤字の方)を使う方のが良いのでは?

              テーブル名については特定されていませんが、これは独自のテーブルでしょうか? それともMODxの既存のテーブルでしょうか?
                • 4194
                • 7 Posts
                tkfm さん

                Quote from: tkfm at Dec 11, 2008, 03:44 AM

                どちらも動作すると思いますが、基本的にはMODxのDBAPIを使う前者(赤字の方)を使う方のが良いのでは?
                ソース自体も理解しやすそうなので、コチラで進めて行きたいと思います。

                Quote from: tkfm at Dec 11, 2008, 03:44 AM

                テーブル名については特定されていませんが、これは独自のテーブルでしょうか? それともMODxの既存のテーブルでしょうか?
                データテーブルについては、新規でデータテーブルを作成しました。
                  • 36592
                  • 970 Posts
                  ここから先は私も素人同然! どなたかフォローをお願いしますね~ tongue
                  Quote from: BR_TOKYO at Dec 11, 2008, 04:31 AM

                  データテーブルについては、新規でデータテーブルを作成しました。
                  MODxが使っているデータベースの中に、新しくテーブル(仮にテーブル名を MyTable としましょう)を作成されたんですね?
                  そのテーブルの構造がよくわかりませんが、ページタイトルと比較するフィールド名は何でしょうか?

                  仮にそのフィールド名を hoge としましょう。
                  このスニペット(名前を仮にSomeSnippetとします)を呼び出すときに、
                  下記のようにページタイトルをスニペット内の変数に渡します。
                  [!SomeSnippet? &targetTitle=`[*pagetitle*]`!]

                  こうすると、スニペット内の変数 $targetTitle にページタイトルの文字列がセットされます。
                  この状態で以下のSQL文を発行することになるんじゃないでしょうか?
                  $result = $modx->db->query(”SELECT * FROM `MyTable` WHERE hoge='$targetTitle'”);
                  

                  こんな感じでどうでしょうか?

                  自分では試していませんので...動作保証はありません。 wink

                  ちなみに、最後のところで結果をechoしていますが、returnを使った方が良いようです。
                    • 15497
                    • 117 Posts
                    このトピック、全部おっかけられていないので、ピンポイントでソースだけ見て反応しています。 tongue
                    Quote from: tkfm at Dec 11, 2008, 07:26 AM

                    $result = $modx->db->query(”SELECT * FROM `MyTable` WHERE hoge='$targetTitle'”);
                    

                    大筋あっていると思いますが、データベースに使う値はescapeした方が良いですね。
                    1行足して、
                    $targetTitle = $modx->db->escape($targetTitle);
                    $result = $modx->db->query(”SELECT * FROM `MyTable` WHERE hoge='$targetTitle'”);
                    

                    といった感じでしょうか。
                      ★日本公式フォーラム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
                      • 15497
                      • 117 Posts
                      その他、パラメータでわたさない方法として、
                      $modx->documentObject[’****’]
                      も使えるかと思います。
                      こんな感じでしょうか。
                      $targetTitle = $modx->documentObject['pagetitle'];	// pagetitleの取得
                      $targetTitle = $modx->db->escape($targetTitle);	// 特殊文字のエスケープ
                      $result = $modx->db->query("SELECT * FROM `MyTable` WHERE hoge='$targetTitle'");
                      

                      もう一つ、
                      DBAPIを使うなら、「query」の代わりに「select」というのも使えそうです。
                      $targetTitle = $modx->documentObject['pagetitle'];	// pagetitleの取得
                      $targetTitle = $modx->db->escape($targetTitle);	// 特殊文字のエスケープ
                      $result = $modx->db->select("*", "`MyTable`", "hoge='$targetTitle'");
                      

                      ※DBAPIの「select」は、4番目の引数に「order by」句の値を指定することもできます。
                        ★日本公式フォーラム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