developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Opened 10 years ago

Closed 10 years ago

Last modified 10 years ago

#1046 closed bug (fixed)

format de date et heure trop permissif

Reported by: foxmask Owned by:
Priority: normal Milestone: Jelix 1.2RC1
Component: jelix:dao Version: 1.1.4
Severity: normal Keywords:
Cc: Blocked By:
Blocking: Documentation needed: no
Hosting Provider: Php version:

Description

à plusieurs reprises (jDateTime/jDaoRecordBase etc..) j'ai aperçu que l'heure était vérifiée comme ceci

 /^(\d{2}:\d{2}:\d{2})?$/

ce qui permet aussi 99:99:99, donc si vous voulez, ceci permet d'identifier 23:59

 [01]?[0-9]|2[0-3]:[0-5][0-9]:[0-5][0-9]

cette regexp n'est pas de moi mais de Jeffrey Friedl auteur de "Maîtrise des expressions régulières" chez O'Reilly, dont elle est tirée (page 26) ;)

Il faudrait se pencher aussi sur celle de la date qui permet :

 9999-99-99

Change History (8)

comment:1 Changed 10 years ago by foxmask

pour la date :

ceci valide une date en vérifiant le nombre de jours par rapport au mois courant exception faite des années bissextiles

preg_match('/^(\d{4})-(((0?[1,3-9]|1[0-2])-([01][0-9]|2[0-9]|3[01]))|((0?2)-([01][0-9]|2[0-9])))?$/','2000-01-29',$matches);

ensuite on acheve la vérif de la date

// on check les dates dont les mois est different de fevrier
if ($matches[3]=='' and $matches[4]=='')
	return checkdate($matches[7],$matches[8],$matches[1]);
// on check les dates avec le mois de février
else
	return checkdate($matches[4],$matches[5],$matches[1]);

comment:2 Changed 10 years ago by laurentj

  • Milestone set to Jelix 1.2

comment:3 Changed 10 years ago by foxmask

  • review set to review?

depuis la date initiale du ticket je n'ai pas retrouvé le pattern dans jDateTime donc voici un patch pour jDaoRecordBase

http://bitbucket.org/foxmask/jelix-trunk-patch/changeset/5a9d85197179

et résultat des tests unitaires :

C:\WEB\DOCUMENT_ROOT\www_jelix_12\testapp\scripts>C:\xampp\xampp\php\php.exe tests.php  single jelix_tests utils.jdatetime

Unit Tests        php version: 5.3.1   Jelix version: 1.2pre.1624
===========================================================================

"jelix_tests" module , utils: jdatetime
--------------------------------
OK
Test cases run: 1/1, Passes: 34, Failures: 0, Exceptions: 0

comment:4 Changed 10 years ago by laurentj

  • Resolution set to fixed
  • Status changed from new to closed

comment:5 Changed 10 years ago by laurentj

  • review changed from review? to review+

comment:6 Changed 10 years ago by laurentj

  • Component changed from jelix to jelix:dao

in fact, regexp were totally wrong. Some tests has failed. You should run tests before submitting a patch !

I fixed them. http://bitbucket.org/jelix/jelix-trunk/changeset/9eec21a5019b

comment:7 Changed 10 years ago by foxmask

Je ne saisi pas ce qui ne va pas puisque tesapp ne m'a sorti aucune erreur. De plus ton expression oblige l'utilisation du zéro dans le mois alors qu'on pourrait ne pas en avoir besoin, mais c'est ton choix. Chuis un peu pantois.

comment:8 Changed 10 years ago by laurentj

Bah toujours est-il que chez moi, les tests échouaient sur jdao.main_api (PHP 5.2.13). Je ne te blame pas ceci dit. C'est aussi à moi de vérifier que les tests sont ok avant de pusher :-)

L'erreur est qu'il manquait des parenthèses. Donc surement un problème de priorité par rapport à l'opérateur | . Quand on écrit [01]?[0-9]|2[0-3], c'est un OU entre [0-9] et 2 ? ou entre [01]?[0-9] et 2[0-3] ? Tout les moteurs de regexp ne réagissent pas forcement de la même façon, et donc ce que tu as dans ton bouquin n'est pas forcément valable partout je pense et il vaut mieux donc essayer de lever le maximum d'ambiguïté dans la regexp.

Ensuite, tu avais supprimé le caractère optionnel (parenthèses mal placées) du pattern entier. (rien que pour ça, tu aurais du avoir des tests négatifs)

Pour les 0 optionnels, est-t-on sûr que toutes les bases de données accepte un seul chiffre entre "-" ? à vérifier. à priori, pour mysql 5.1.44 ça a l'air ok.

Note: See TracTickets for help on using tickets.