web-dev-qa-db-ja.com

データベースを検索して結果を表示するモジュールを作成する

データベースに#__magazinesというテーブルがあります。これは雑誌のデータ(発行日、発行番号など)を保持しています。 Joomla 3.x用のコンポーネント、プラグイン、およびモジュールを作成しました。モジュール表示変数(例として公開された日付を使用しましょう)を使用できるようにしたいのです。クリックすると、モジュールはデータベースに移動し、選択した日付に一致するすべての結果を返して、新しいページに結果を表示します。

私はJoomlaチュートリアルに従ってきましたが、#__magazinesテーブルをクエリして結果を表示するための最良の方法を試すことができません。

[〜#〜]更新[〜#〜]

検索プラグインが正しく機能するようになったので、雑誌のタイトル(データベースにあることがわかっています)を検索すると、検索結果に表示されます。

ただし、知りたいのは、#__magazinesのデータベーステーブルからさまざまな変数をすべて表示し、それらを検索モジュールのドロップダウンとして表示する方法ですが、重複はありません。たとえば、June 2014と呼ばれるtitleがあり、これがデータベースに2回ある場合、[オプションの選択]ドロップダウンに1回だけ表示します。ボタンをクリックすると、ユーザーは結果ページに移動し、「2014年6月」の詳細の複数のバージョンが表示されます。

3
RustyJoomla

モジュール内のdefault.phpファイルで以下を使用してこれを修正しました。

// Get a db connection.
$db = JFactory::getDbo();

// Published dates
$query = $db->getQuery(true);
$query->select($db->quoteName(array('publishedDate')));
$query->from($db->quoteName('#__magazines'));
$query->order('publishedDateASC');
$query->group('publishedDate');
$db->setQuery($query);

// Load dates
$dates = $db->loadObjectList();

// Input
$input = JFactory::getApplication()->input;

<label for="publisheddate">Departure Date:</label>
            <select id="publisheddate" name="publisheddate">
                <option selected="selected" value="A">Choose Date</option>
                <?php $dateInput = $input->get('publisheddate', null, 'string'); ?>
                <?php foreach ($dates as $result): ?>
                <option value="<?php echo $result->publishedDate; ?>"<?php echo $dateInput == $result->publishedDate ? ' selected="selected"' : ''; ?>>
                    <?php echo $result->publishedDate; ?>
                </option>
                <?php endforeach; ?>
            </select>

これは#__magazinesテーブルに行き、各publishDateの1つを取得して、テーブルにそれを設定しました!

2
RustyJoomla

更新:可能性のある着信変数値の各種の動的使用のためにスニペットを変更するには、列名の「ホワイトリスト」を宣言し、クエリ対象の着信_$column_が有効であることを確認するとします。

たとえば、_$column = "publishedDate"_

安全のために、スクリプトでpublishedDateを_$column_に置き換え、そのたびに$db->qn()を呼び出すだけです。

...そしてstrtolower()を使用して、dom属性宣言用の変数を準備します。


テスト済みコード:

_$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true)
                ->select("DISTINCT publishedDate")
                ->from("#__magazines")
                ->order("publishedDate");
    // echo $query->dump();  // uncomment if you want to see what is generated
    $db->setQuery($query);
    if ($dates = $db->loadColumn()) {
        $user_date = JFactory::getApplication()->input->get('publisheddate', null, 'string');
    }
} catch (Exception $e) {
    $dates = array();
    // echo "Syntax Error" , $e->getMessage();
}

echo "<label for=\"publisheddate\">Departure Date:</label>";
echo "<select id=\"publisheddate\" name=\"publisheddate\">";
    echo "<option value=\"A\">Choose Date</option>";
    foreach ($dates as $date) {
        echo "<option" , ($user_date == $date ? " selected" : "") , ">{$date}</option>";
    }
echo "</select>";
_

説明:

  • _try {} catch {}_ブロックは、エラーをチェックし、クエリ構文エラーが発生した場合のコードの動作を制御するためのクリーンな方法です。
  • 私はgetQuery()からの「メソッドチェーン」なので、クエリの作成中に_$query_が1回だけ書き込まれます。
  • ほとんどの場合、クエリは_SELECT DISTINCT_ではなく_GROUP BY_として記述する方が適切です。こちらが 補足記事 です。
  • select()メソッドは配列を受け取る必要はありません-文字列で問題ありません。 publishedDateはバックティックラップする必要がない[〜#〜] [〜#〜]必要がないため、qn()メソッド呼び出し。セキュリティに影響を与えることなく、引用符で囲まれていない文字列のままにします。
  • _ORDER BY_は、デフォルトの方向としてASCを使用するため、これを明示的に示す必要はありません。そして、あなたはあなたのASCの前にスペースが必要でしたが、それは単に投稿ミスだったかもしれません。
  • loadColumn()は、単一の列の結果セットから1次元配列を生成する場合に最も適切な呼び出しです。
  • _$user_date_配列が空でない場合にのみ、_$dates_を探しています。条件は2つのことを実行します。1。_$dates_を宣言し、2。偽ではない値をチェックします(空の配列は偽です)。 _$dates_に要素がない場合、ユーザーが_$_GET['publisheddate']_を送信したかどうかにかかわらず、問題はありません。
  • クエリに構文エラーがある場合、foreach()ループが反復できないように、_$dates_を空の配列として宣言しています。
  • $e->getMessage()を公開しないでください。
  • 私の個人的な好みは、phpに出入りしたり複数行の文字列を書き込んだりするのではなく、エコーを使用してコードの各行を表示することです。
  • 最初/デフォルトのオプションの値がAである理由がわかりません。これは「すべて」を意味すると思います。合理的な機能のように思われるすべてのレコードを検索結果に表示します。
  • 最初の_selected="selected"_に_<option>_を書き込む必要はありません。他のオプションが選択されていない場合は、選択されたオプションとして表示されます。
  • 結果セットの値は、foreach()ループ内で_$date_として宣言され、オブジェクト構文(_->_)は必要ありません。
  • 可視テキストと同一の_<option>_値を書き込む場合、value属性を宣言する必要はありません。コードの膨張を回避します。テキストは値として送信されます。
  • _$date_を囲む中括弧は、私が好むコーディングスタイルです-この場合は必要ありません。
0
mickmackusa