2009-03-16 9 views
0

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

+0

Pouvez-vous publier le code pour mysql2date ou votre remplaçant? – Greg

+0

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. –

+0

Ajouté le code mysql2date – nutsmuggler

Répondre

0

Je crois que je l'ai résolu ce problème. Le problème était 0000-00-00, apparemment pas une valeur mysql2date temps valide dans certains combos PHP/MySql (tout à fait compréhensible, je vous regarde, mois 00 ...). J'ai fini par utiliser echo (mysql2date("H:i", "2000-10-10 13:24:00"));

Puisque je suis juste intéressé par les heures et les minutes une date plus décontractée fait le travail. Problème résolu.

0

pas une solution, mais une alternative - utiliser UNIX_TIMESTAMP dans votre déclaration mysql au lieu de le convertir par la suite.

SELECT UNIX_TIMESTAMP (date_created) AS date

+0

Merci pour la suggestion. J'ai fini par mettre en place une autre solution de contournement, mais c'est aussi une bonne idée. – nutsmuggler