La semaine dernière a publié une version bêta 2.0 de mon plugin Events Manager, qui produit une liste d'événements. Parmi les nombreux bogues flottants, il y en a un que je ne peux pas réparer. Le bug semble se manifester seulement sur le serveur d'un testeur avec PHP 4.4.8; fonctionne bien sur PHP 5. Lorsque j'essaie d'utiliser le format d'heure php H:i
, je reçois toujours minuit (00:00). Le problème est avec la fonction wordpress mysql2date. Cette fonction est un wrapper autour de la fonction date.
J'isolé le problème et inséré cela dans le modèle de site Web:date problème avec PHP 4.4.8
echo (mysql2date("H:i", "0000-00-00 13:24:00"));
Le résultat a été
00:00
Au début, je pensais que c'était un bug wordpress, mais je réécris ma fonction d'employer date()
tout de suite. Le résultat était encore plus étrange, au lieu de minuit j'ai eu 11:59
. Assez étrangement, mysql2date et date semblent fonctionner correctement sur toutes les autres parties du plugin. Aussi, comme je l'ai dit, je ne peux pas reproduire le bug sur mon serveur, seulement 2 utilisateurs l'ont signalé.
Depuis qu'on m'a demandé, voici le code mysql2date; il fait partie de Wordpress:
/**
* Converts MySQL DATETIME field to user specified date format.
*
* If $dateformatstring has 'G' value, then gmmktime() function will be used to
* make the time. If $dateformatstring is set to 'U', then mktime() function
* will be used to make the time.
*
* The $translate will only be used, if it is set to true and it is by default
* and if the $wp_locale object has the month and weekday set.
*
* @since 0.71
*
* @param string $dateformatstring Either 'G', 'U', or php date format.
* @param string $mysqlstring Time from mysql DATETIME field.
* @param bool $translate Optional. Default is true. Will switch format to locale.
* @return string Date formated by $dateformatstring or locale (if available).
*/
function mysql2date($dateformatstring, $mysqlstring, $translate = true) {
global $wp_locale;
$m = $mysqlstring;
if (empty($m))
return false;
if('G' == $dateformatstring) {
return gmmktime(
(int) substr($m, 11, 2), (int) substr($m, 14, 2), (int) substr($m, 17, 2),
(int) substr($m, 5, 2), (int) substr($m, 8, 2), (int) substr($m, 0, 4)
);
}
$i = mktime(
(int) substr($m, 11, 2), (int) substr($m, 14, 2), (int) substr($m, 17, 2),
(int) substr($m, 5, 2), (int) substr($m, 8, 2), (int) substr($m, 0, 4)
);
if('U' == $dateformatstring)
return $i;
if (-1 == $i || false == $i)
$i = 0;
if (!empty($wp_locale->month) && !empty($wp_locale->weekday) && $translate) {
$datemonth = $wp_locale->get_month(date('m', $i));
$datemonth_abbrev = $wp_locale->get_month_abbrev($datemonth);
$dateweekday = $wp_locale->get_weekday(date('w', $i));
$dateweekday_abbrev = $wp_locale->get_weekday_abbrev($dateweekday);
$datemeridiem = $wp_locale->get_meridiem(date('a', $i));
$datemeridiem_capital = $wp_locale->get_meridiem(date('A', $i));
$dateformatstring = ' ' . $dateformatstring;
$dateformatstring = preg_replace("/([^\\\])D/", "\\1" . backslashit($dateweekday_abbrev), $dateformatstring);
$dateformatstring = preg_replace("/([^\\\])F/", "\\1" . backslashit($datemonth), $dateformatstring);
$dateformatstring = preg_replace("/([^\\\])l/", "\\1" . backslashit($dateweekday), $dateformatstring);
$dateformatstring = preg_replace("/([^\\\])M/", "\\1" . backslashit($datemonth_abbrev), $dateformatstring);
$dateformatstring = preg_replace("/([^\\\])a/", "\\1" . backslashit($datemeridiem), $dateformatstring);
$dateformatstring = preg_replace("/([^\\\])A/", "\\1" . backslashit($datemeridiem_capital), $dateformatstring);
$dateformatstring = substr($dateformatstring, 1, strlen($dateformatstring) -1);
}
$j = @date($dateformatstring, $i);
/*
if (!$j) // for debug purposes
echo $i." ".$mysqlstring;
*/
return $j;
}
Si vous êtes intéressé, vous pouvez télécharger le code de mon plugin here, le problème est en ligne 613 des événements Manager.php.
Cela peut-il avoir quelque chose à voir avec les paramètres PHP ou Apache?
Merci d'avance pour toute suggestion.
Davide
Pouvez-vous publier le code pour mysql2date ou votre remplaçant? – Greg
Je ne pense pas que ce soit un problème d'apache/mysql. Je suggère que vous ajoutiez une ligne pour consigner le problème chaque fois qu'il se présente; vérifiez si mysql2date (...) == 00:00 (et l'heure du système! = 00:00). Enregistrez toutes les variables pertinentes. Je vérifie d'abord pour voir quelles sont les valeurs d'argument avant de continuer. –
Ajouté le code mysql2date – nutsmuggler