web-dev-qa-db-ja.com

publish_up値でクエリの結果を並べ替える方法は?

データベーステーブルからフィールドを取得し、それらをforeachループで表示する.phpスクリプトがあります(コードの関連部分です)。

<?php                   
$jquery1 = "SELECT `fulltext`,alias,metakey,publish_up,metadesc
            FROM kms_content
            WHERE catid=22 AND state= '1'";
$jdb1->setQuery( $jquery1 );
$jfeed1= $jdb1->loadObjectList();
foreach ($jfeed1 as $jitem1):
    ?>
    <li>
        <div>
            <?php                                 
            $oldLocale = setlocale(LC_TIME, 'en_US');
            echo strftime("%a %d %b %Y", strtotime($jitem1->publish_up)); 
            setlocale(LC_TIME, $oldLocale);
            ?>
        </div>
        <div><?php echo $jitem1->fulltext; ?></div>
    </li> 
    <?php
endforeach;
?>

したがって、配列のエントリがidで並べ替えられていることを除いて、すべてが適切に機能します。日付順に並べ替えてほしい(publish_up値)。

私はこのコードを試しましたが、上部にタイトルのみの空白ページが表示されています。

$jfeed1 = $jdb1->loadObjectList();

function date_compare($a, $b)
{
    $t1 = strtotime($a['publish_up']);
    $t2 = strtotime($b['publish_up']);
    return $t1 - $t2;
}    
usort($jfeed1, 'date_compare');
foreach ($jfeed1 as $jitem1):

コードを見たりチュートリアルを読んだりするだけでphpを「学習」したので、理論を実践する必要がある場合に不可欠な基本的な知識がたくさんありません。

arrayobjectの違いについて混乱しており、この警告を解決するために何をすべきかわからない。


編集:

<?php
    var_dump($jfeed1)
?>

私に最初のアイテムを与えます:

array(22) {
    [0]=> object(stdClass)#318 (5) { 
        ["fulltext"]=> string(212) "Yesterday ..." 
        ["alias"]=> string(3) "237" 
        ["metakey"]=> string(7) "France" 
        ["publish_up"]=> string(19) "2011-11-15 09:06:39"
    }
3
MagTun

オブジェクトと配列の間にはおそらく他の違いがあります(または多分そうではありません: https://stackoverflow.com/questions/2193049/php-objects-vs-arrays )が、ほとんどはスタイルの違いです(少なくともstdClassオブジェクトを使用する場合)。

オブジェクトの場合は$variable->propertyの構文を使用し、配列の場合は$variable['property']を使用します。 var_dumpは通常、配列スタイルの構文を表示しますが、stdClassが表示されている場合、これはオブジェクトではないため、使用したくない構文です。

したがって、date_compare関数は、strtotime呼び出し内で$a->publish_upおよび$b->publish_upを使用する必要があります。これで、実際に値を使用して、実際に並べ替えることができます。


SQLステートメントで並べ替えるだけで、PHPのすべての並べ替えビットをスキップすることもできます。

$jquery1 = "SELECT `fulltext`,alias,metakey,publish_up,metadesc FROM kms_content  WHERE catid=22 AND state= '1' ORDER BY publish_up DESC";
$jdb1->setQuery( $jquery1 );
$jfeed1= $jdb1->loadObjectList();

(希望する順序が正確にわからないため、逆の場合は、末尾のDESCASCに変更します(降順v。昇順...)


そして最後に、必須の「使用すべきその他のJoomlaのベストプラクティス」セクション。 (明らかに、あなたのコードはこれらがなくても機能しますが、Joomlaの優れた機能のいくつかを活用しています。)

最大のものは、クエリにテーブルプレフィックスを置かないようにすることです。 #__で始まるテーブルを常に参照します。 2つのサイト間でコードを共有する場合、プレフィックスを変更する可能性が高く、それが新しいサイトで機能するようにコードを変更する必要があるのはそれだけなので、手間を省き、常に#__と入力するだけです。 。

第2に、Joomlaのクエリオブジェクトは、クエリを構築して他のデータベースタイプで自動的に動作させる(今は使用しない場合でも)ための優れた方法であり、エスケープするだけです。間違いなく学ぶ価値があります! http://docs.joomla.org/Selecting_data_using_JDatabase

4
David Fritsch

次のクエリを使用できます。

$jquery1 = $jdb1->getQuery(true)
                ->select('`fulltext`, alias, metakey, publish_up, metadesc')
                ->from('#__content')
                ->where('`catid` = 22')
                ->where('`state` = 1')
                ->order('publish_up desc'); // OR ->order('publish_up asc');
3
Farahmand