it-swarm.com.de

Wie sortiere ich die Ergebnisse meiner Abfrage nach Publish_up-Wert?

Ich habe ein .php-Skript, das Felder aus meiner Datenbanktabelle abruft und sie dann in einer foreach-Schleife anzeigt (hier sind die relevanten Teile des Codes):

<?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;
?>

Alles funktioniert also gut, außer dass meine Array-Einträge nach id sortiert sind. Ich möchte, dass sie nach dem Datum sortiert werden (nach dem publish_up Wert).

Ich habe diesen Code ausprobiert, aber es wird eine leere Seite mit nur dem Titel oben angezeigt:

$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):

Ich habe PHP nur durch das Betrachten von Codes und durch das Lesen von Tutorials "gelernt", daher fehlt mir eine Menge grundlegendes Wissen, das wichtig ist, wenn ich Theorie in die Praxis umsetzen muss.

Ich bin verwirrt über den Unterschied zwischen einem array und einem object und kann nicht herausfinden, was ich tun soll, um diese Warnung zu lösen.


BEARBEITEN:

<?php
    var_dump($jfeed1)
?>

gibt mir den ersten Punkt:

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

Es gibt wahrscheinlich andere Unterschiede (oder vielleicht auch nicht: https://stackoverflow.com/questions/2193049/php-objects-vs-arrays ) zwischen Objekten und Arrays, aber meistens handelt es sich um einen Stilunterschied ( zumindest bei Verwendung eines stdClass Objekts).

Für Objekte verwenden Sie die Syntax von $variable->property Und für Arrays $variable['property']. var_dump Zeigt normalerweise eine Array-artige Syntax an, obwohl Sie diese nicht verwenden möchten, wenn Sie stdClass sehen, was bedeutet, dass es sich um ein Objekt handelt.

Daher sollte Ihre date_compare - Funktion $a->publish_up Und $b->publish_up In den strtotime - Aufrufen verwenden. Das sollte dazu führen, dass die Werte tatsächlich verwendet und somit tatsächlich sortiert werden.


Sie können auch das gesamte Sortierbit in PHP) überspringen, indem Sie einfach in der SQL-Anweisung bestellen:

$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();

(Sie sind sich nicht sicher, in welcher Reihenfolge Sie genau vorgehen möchten. Wenn es sich um eine umgekehrte Reihenfolge handelt, ändern Sie das DESC am Ende in ASC (absteigend v. Aufsteigend ...)


Und schließlich der obligatorische Abschnitt "Weitere bewährte Methoden von Joomla, die Sie verwenden sollten". (Natürlich kann Ihr Code auch ohne diese funktionieren, aber sie nutzen einige der besseren Funktionen von Joomla.)

Das größte Problem besteht darin, zu vermeiden, dass das Tabellenpräfix in die Abfrage eingefügt wird. Verweisen Sie immer auf eine Tabelle, indem Sie mit #__ Beginnen. Wenn Sie jemals Code für zwei Sites freigeben, werden Sie wahrscheinlich das Präfix ändern. Dies ist das einzige, was Sie ändern müssen, damit der Code auf der neuen Site funktioniert. Sparen Sie sich also Ärger und geben Sie einfach immer Folgendes ein: #__.

Zweitens ist das Abfrageobjekt von Joomla eine großartige Möglichkeit, Abfragen zu erstellen und sie automatisch für andere Datenbanktypen verwenden zu lassen (auch wenn Sie sie jetzt noch nie verwenden). Auf jeden Fall einen Besuch wert! http://docs.joomla.org/Selecting_data_using_JDatabase

4
David Fritsch

Sie können die folgende Abfrage verwenden:

$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