web-dev-qa-db-fra.com

Comment trier les résultats de ma requête par la valeur publish_up?

J'ai un script .php qui récupère des champs de ma table de base de données puis les affiche dans une boucle foreach (voici les parties pertinentes du code):

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

Donc tout fonctionne très bien sauf que les entrées de mon tableau sont triées par id. Je voudrais qu'ils soient triés par date (par le publish_up valeur).

J'ai essayé ce code, mais il affiche une page vierge avec uniquement le titre en haut:

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

J'ai "appris" php simplement en regardant les codes et en lisant des tutoriels, il me manque donc beaucoup de connaissances fondamentales qui sont essentielles lorsque je dois mettre la théorie en pratique.

Je suis confus quant à la différence entre array et object et je ne peux pas comprendre ce que je suis censé faire pour résoudre cet avertissement.


MODIFIER:

<?php
    var_dump($jfeed1)
?>

me donne le premier article:

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

Il existe probablement d'autres différences (ou peut-être pas: https://stackoverflow.com/questions/2193049/php-objects-vs-arrays ) entre les objets et les tableaux, mais il s'agit principalement d'une différence de style ( du moins lorsqu’on utilise un objet stdClass).

Pour les objets, vous utilisez la syntaxe de $variable->property et pour les tableaux que vous utilisez $variable['property']. var_dump affiche généralement une syntaxe de type tableau, bien que ce ne soit pas ce que vous voulez utiliser si vous voyez stdClass, ce qui signifie qu'il s'agit d'un objet.

Donc, votre date_compare La fonction doit utiliser $a->publish_up et $b->publish_up dans les appels strtotime. Cela devrait amener à utiliser réellement les valeurs et donc à trier.


Vous pouvez également ignorer tout le bit de tri dans PHP en commandant simplement dans l'instruction SQL:

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

(Vous ne savez pas exactement dans quel ordre vous voulez, alors s'il est en arrière, changez le DESC à la fin en ASC (décroissant v. Croissant ...)


Et enfin, la section obligatoire "Autres meilleures pratiques Joomla à utiliser". (Évidemment, votre code peut fonctionner sans ceux-ci, mais ils exploitent certaines des fonctionnalités les plus intéressantes de Joomla.)

Le plus important est d'éviter de mettre le préfixe de la table dans la requête. Toujours référencer une table en commençant par #__. Si vous partagez du code entre deux sites, il est probable que vous changiez le préfixe et ce sera la seule chose qui doit être modifiée dans le code pour que cela fonctionne dans le nouveau site. Épargnez-vous donc vos problèmes et tapez toujours #__.

Deuxièmement, l'objet de requête de Joomla est un excellent moyen de créer des requêtes et de le faire fonctionner automatiquement pour d'autres types de bases de données (même si vous ne les utilisez jamais maintenant), mais il vous permet également de vous échapper. Ça vaut vraiment la peine d'apprendre! http://docs.joomla.org/Selecting_data_using_JDatabase

4
David Fritsch

Vous pouvez utiliser la requête suivante:

$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