Bonjour à tous et à toutes,

J'ai une question un peu particulière concernant les warnings de MySQL.

Que j'explique un peu le contexte.

Dans ma boite, nous exécutons un certain nombre de traitements automatiques sur nos bases de données, importants dans les cycles de vie des métiers de nos clients, et chacun de ces traitements possèdent un type et génèrent un certain nombre de compte-rendus (erreurs, stats, états, etc ...) associés à ce type, le tout, stocké en DB.

Ces traitements sont instanciés en PHP, suivent une architecture commune à l'ensemble des traitements, et ont pour but d'appliquer au maximum le fait de faire les calculs au maximum dans la DB. C'est au plus proche de la donnée, on fait du traitement ensembliste et non pas séquentiel, et on peut tout annuler avec un seul rollback de transaction.

L'architecture habituelle de ce genre de traitements est la suivante:
1/ Initialisation du référentiel de traitement + initialisation du moteur de compte-rendus.

2/ Initialisation des données préalables en DB => il s'agit là de charger les données dans des tables créées par le traitement et détruites à la fin de ce dernier. On y charge temporairement les données sur lesquelles on doit travailler.

3/ Vérification des conditions pré requises => vérification des différents formats, ce genre de choses. C'est à cet endroit que l'on détermine les éléments bloquants qui empêchent le traitement de continuer.

4/ Exécution du traitement en lui-même si contrôles OK => calcul des données temporaires, ajouts et modifications des tables réelles

5/ fin du traitement et clôture des compte-rendus associés.

Maintenant que le contexte est posé, pour en revenir à mon problème:
J'ai une table avec la structure suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
CREATE TABLE tmp_maj_dms(  
  dms_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  dms_numero VARCHAR(20) NOT NULL COMMENT 'numero sva format international sans signe',
  dms_date_mes VARCHAR(15) NOT NULL COMMENT 'date mes format AAAAMMJJ (texte)',
  dms_date_mes_formatee DATE COMMENT 'date mes format AAAA-MM-JJ (date)',
  fk_num_id INT(10) UNSIGNED COMMENT 'fk id numero_num',
  dms_user_id int(10) unsigned NOT NULL COMMENT 'id du user ayant lance le traitement',
  PRIMARY KEY (dms_id),
  CONSTRAINT fk_dms_num FOREIGN KEY (fk_num_id) REFERENCES numero_num(num_id)
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci";
Dans laquelle je charge les données issues d'un fichier csv (un numéro de tel sur 10 caractères, et une date au format AAAAMMJJ).
Ces informations vont respectivement dans les champs "dms_numero" et "dms_date_mes".

Lors d'un de mes contrôles prérequis, je veux valider que la date correspond bien à une date valide.
Pour se faire, j'utilise la requête suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
SELECT dms.dms_numero AS param1, dms.dms_date_mes AS param2
FROM tmp_maj_dms AS dms
WHERE DATE(dms.dms_date_mes) IS NULL
OR dms.dms_date_mes NOT RLIKE '[0-9]{8}'
L'idée est de lister les numéros pour lesquelles les dates associées ne sont pas au bon format OU ne sont pas une date valide.
Pour cela, le select est associé à un insert into dans notre table des compte-rendus qui prend des valeurs textuelles.

La requête s'exécute à merveille et fait parfaitement son boulot (les numéros sont bien listés dans les compte-rendus).
En revanche, elle lève un warning (invalid date format) qui est interprété par PHP comme une Exception, qui me bloque l'ensemble du traitement par la suite (alors que c'est pour moi le comportement attendu).

J'avoue ma détresse quant à la création d'une expression régulière qui me valide une date réelle (valider un format de date est facile, mais valider la réalité d'une date est ... bref).

Je voudrais juste faire taire ce warning à ce moment précis pour que PHP ne lève pas d'exception.

Vous auriez une idée d'une requête que je pourrais passer au SGBD pour mettre en silence les warnings ?

Configuration:
MySQL 5.5.9
PHP: 5.4.23

En vous remerciant par avance,
Cordialement,
Delio