web-dev-qa-db-fra.com

Comment compter les lignes dans une table de base de données qui ont une date dans l'année en cours?

J'écris un module qui affiche le nombre d'enregistrements en fonction du date_time colonne. Je suis en mesure d'obtenir le résultat que je recherche en utilisant une date statique comme ci-dessous. Cependant, je ne parviens pas à obtenir la réponse correcte à partir du code du deuxième bloc.

{
    $date       = JFactory::getDate();
    $cur_year   = JHtml::_('date', $date, 'Y');
    $db         = JFactory::getDbo();
    $query      = $db->getQuery(true);
    $query->select('COUNT(*)')
          ->from('#__aa_job_data')
          ->where("date_time LIKE '2017%'");

    $db->setQuery($query);
    $count = $db->loadResult();
    return $count;
}

Le code ci-dessous ne fonctionne pas, je ne peux pas trouver la syntaxe correcte à utiliser pour ajouter $cur_year & % tout en l’enveloppant dans ''

{
    $date       = JFactory::getDate();
    $cur_year   = JHtml::_('date', $date, 'Y');
    $db         = JFactory::getDbo();
    $query      = $db->getQuery(true);
    $query->select('COUNT(*)')
          ->from('#__aa_job_data')
          ->where("date_time LIKE $cur_year%");

    $db->setQuery($query);
    $count = $db->loadResult();
    return $count;
}

Quelle est la méthode correcte pour écrire l'instruction WHERE?

2
Twincarb

Vous n'avez pas besoin de passer une variable php dans votre requête, utilisez simplement fonction YEAR () de MYSQL .

Tu devrais utiliser:

->where("YEAR(date_time) = YEAR(CURDATE())");

p.s. Il vous manquait simplement les guillemets simples autour de votre $cur_year%. LIKE n'est pas célèbre pour être efficace de toute façon.

Parce que votre source de date est "de confiance", vous n'avez pas besoin de faire beaucoup d'efforts pour protéger votre requête contre les attaques par injection (vous pouvez manuellement mettre un guillemet simple ou appeler q() ou quote() ). Dans d'autres situations, lorsque vous voulez écrire une valeur non approuvée après LIKE dans une requête, lisez cet article ne décrit pas quoi faire jusqu'à ce que les instructions préparées de Joomla4 soient importées.

Pour votre cas, les deux auraient fonctionné - mais je ne les recommande pas:

->where("date_time LIKE '$cur_year%'");

et

->where("date_time LIKE " . $db->q("$cur_year%"));
1
mickmackusa