8780 sujets

Développement web côté serveur, CMS

Bonjour,

je suis en train d'expérimenter un plugin Wordpress qui gère des évènements et qui travaille avec des dates.
Les dates sont stockées (dans une table custom de WordPress) sous forme de chaines comme ceci:


array (size=24)
  0 => 
    object(stdClass)[1632]
      public 'id' => string '1' (length=1)
      public 'date_event' => string '2025-03-13' (length=10)
      public 'events_ids' => string '64673' (length=5)
  1 => 
    object(stdClass)[1631]
      public 'id' => string '2' (length=1)
      public 'date_event' => string '2025-03-14' (length=10)
      public 'events_ids' => string '64673' (length=5)
  2 => 
    object(stdClass)[1628]
      public 'id' => string '3' (length=1)
      public 'date_event' => string '2025-05-22' (length=10)
      public 'events_ids' => string '64672,64660' (length=5)
  3 => 
    object(stdClass)[1627]
      public 'id' => string '4' (length=1)
      public 'date_event' => string '2025-06-28' (length=10)
      public 'events_ids' => string '64660,64657,64655' (length=5)
  


je voudrais récupérer, avec une requête, les enregistrement postérieurs à la date du jour et ça ne fonctionne pas, il me renvoie tout le contenu de la table mysql

voici le code que j'utilise dans WordPress:

$today = date_i18n( 'Y-m-d' );  // renvoie 2025-02-05 pour le 5 fév 2025

global $wpdb;
$tablename1  = $wpdb->prefix . "gibi_all_current_events";

$sql = "SELECT * 
				FROM $tablename1 
				WHERE `date_event` > $today";
$date_set = $wpdb->get_results( $sql );



alors je me doute bien qu'il y a un problème dans ma clause WHERE `date_event` > $today
Je suis pas un expert en requêtes mysql et je me demande si il existe un moyen de forcer la comparaison des dates de la sorte, on peut bien les classer... alors on doit peut-être pouvoir les extraire en fonction d'une valeur...
-
Modifié par lionel_css3 (05 Feb 2025 - 10:10)
je pourrais toujours faire ça juste après:


$new_dates_set = array();
foreach($dates_set as $date_item) {
	if($date_item->date_event > $today) {
		$new_dates_set[] = $date_item;
	}
}



mais c'est pas le plus élégant je pense...
Je dirais que today ne renvoie pas une chaine formatée comme dans l'array pour le test, il faudrait peut être vérifier en testant les timestamp correspondants avec strtotime par exemple

J'utilise pour la date du jour avec un enregistrement en base comme le tien 'aaaa-mm-jj' des champs à tester, mais je gère le 0 des mois inférieur à 10 car ça ne marchait pas directement.

Function aujourdhui () {

  $aujourdhui = getdate();
  $mois = $aujourdhui['mon'];
  $mjour = $aujourdhui['mday'];

  $annee = $aujourdhui['year'];
  if ($mois>9) {
     $daterech=$annee.'-'.$mois.'-'.$mjour;
  } else {
     $daterech=$annee.'-0'.$mois.'-'.$mjour;
  }
  return $daterech;
}


ensuite je fais la recherche
$sel = $link->prepare("
	SELECT * from calendrier where (cal_deb>=? or  cal_fin>=?)  order by cal_deb,cal_fin
	");
$sel->execute(array($daterech, $daterech));
Bonjour,

Quelle est la structure de la table sql ?
Les dates sont bien stockées avec un type sql Date ou Datetime ?
Pitet a écrit :
Bonjour,

Quelle est la structure de la table sql ?
Les dates sont bien stockées avec un type sql Date ou Datetime ?


J'ai utilisé du texte pour l'instant

upload/1738763600-40948-fireshotcapture160-localhostm.png
Essaye d'ajouter des guillemets simples pour délimiter la chaine de caractère à comparer dans ta requête :
$sql = "SELECT * FROM $tablename1 WHERE `date_event` > '$today'";
Meilleure solution
Salut,

2 -3 petites questions :
- Tu es sur de ce que renvoie
$today = date_i18n( 'Y-m-d' );
? (Je ne connais pas cette fonction mais pour moi i18n j'aurai bien vu un truc qui renvoie un texte dépendant du lieu/langue, genre 5 fevrier 2025 en france et 5 february 2025 en anglais)
- Tu as essayé la requête directement dans mysql ? Des fois ça permet d’être sur que cela fonctionne correctement avant d'attaquer le debug du coté du php (après si $today contient bien 2025-02-05, visuellement cela me semble correct)
- C'est forcement today ? Si oui tu dois avoir moyen d'utiliser directement les fonctions de ta bdd pour avoir la date d'aujourd'hui. A priori en mysql ça donnerait directement :
$sql = "SELECT * FROM $tablename1 WHERE `date_event` > CURRENT_DATE()";


Edit : la réponse de Pitet me semble correct, manque de guillemets pour une chaîne de caractère
Modifié par Mathieuu (05 Feb 2025 - 15:22)
Pitet a écrit :
Essaye d'ajouter des guillemets simples pour délimiter la chaine de caractère à comparer dans ta requête :
$sql = "SELECT * FROM $tablename1 WHERE `date_event` > '$today'";


Mais tu es un génie !!! Smiley prie

ça marche avec les single quotes... j'aurais du essayer

je pensais qu'on ne pouvait interpoler des variables PHP que entres des guillemets double quotes ""
Mathieuu a écrit :

- Tu es sur de ce que renvoie
$today = date_i18n( 'Y-m-d' );
? (Je ne connais pas cette fonction mais pour moi i18n j'aurai bien vu un truc qui renvoie un texte dépendant du lieu/langue, genre 5 fevrier 2025 en france et 5 february 2025 en anglais)

Oui, bien sur , je l'ai vérifié, d'ailleurs je le dis dans le post au début.
date_i18n() est une fonction de WordPress



Mathieuu a écrit :

- C'est forcement today ? Si oui tu dois avoir moyen d'utiliser directement les fonctions de ta bdd pour avoir la date d'aujourd'hui. A priori en mysql ça donnerait directement :
$sql = "SELECT * FROM $tablename1 WHERE `date_event` > CURRENT_DATE()";


Ceci est très intéressant aussi, j'essaierai mais de toutes façons il faut que je récupère le mois et l'année de départ pour créer des découpages par mois donc j'ai besoin de décomposer la date de départ.

(edit) oui ça marche avec CURRENT_DATE()

Un grand merci en tout cas.
Modifié par lionel_css3 (05 Feb 2025 - 16:04)
lionel_css3 a écrit :

je pensais qu'on ne pouvait interpoler des variables PHP que entres des guillemets double quotes ""


C'est bien le cas, $today est "transformé" en date (2025-02-05) parce qu'au niveau "global" tu as des doubles quotes pour créer $sql.
Les simples quotes restent des simples quotes à l’intérieur du string $sql (et sont nécessaire à la requête sql qui à besoin de quotes (simple ou double) pour encadrer une chaîne de caractère "2025-02-05" . C'est ce que je demandais avec ma question 2 de tester directement dans mysql, ça remonte directement ce genre d'erreur de guillemets manquants)