Sens de IN
Pour comprendre ce ticket, on peut se réferer :
- aux remarques de JLuc ici https://contrib.spip.net/ecrire/?exec=article&id_article=5080#forum501431
- aux problèmes de @rastapopoulos ici #23 (closed)
Le problème
La saisie IN a été prévue pour permettre de tester qu'au moins une valeur d'une saisie multivaluée (à gauche de l'opérande) se trouve parmis les valeurs listées à droite de l'opérande.
Cela pose toutefois un double problème :
- d'une part en MYSQL/PHP, le IN n'a pas ce sens là. Elle ne peut s'appliquer qu'aux variables monovalués (à gauche de l'opérande) envers des valeurs multiples (à droite de l'operant)
id_article IN 1,2,3
/in_array($valeur, $array)
. En fait IN se comporte plutôt comme un INTER - des gens peuvent être tentés de l'utiliser pour une valeur monovalué à gauche de l'opérande (
@champ@ IN "2,3"
équivalent à@champ@ == 2 || @champ@ == 3
).
Du coup ca pose de la confusion.
Pistes à rejeter
Concernant le point 1, on ne peut pas changer le comportement de IN pour qu'il ne se comporte plus comme un INTER, car on va casser des sites.
COncernant le point 2, on pourrait faire évoluer IN pour le permettre sur les champs monovalués, mais ca veut dire maintenir cet opérateur confusionnant
Proposition
Du coup je serai d'avis d'opter plutot pour la solution suivante :
- ajouter un INTER pour les champs multi valués, se comportant comme le IN actuel
- deprecier le IN actuel
- ajouter un opérateur CHOIX / PARMIS / DANS / INCLUS DANS (en tout cas un terme francais, car le bon terme anglais serait ... IN) qui se comporte ainsi :
- pour un champ multivalué, vérifie que TOUTE les valeurs choisies sont parmis les valeurs à droite de l'opérateur
- pour un champ monovalué, vérifie que la valeur se trouve parmis les valeurs à droite de l'opérateur
On ajouterait une fonction de migration de IN vers INTER qui pourrait être appelé par les plugins utilisant des constructeurs de formulaire (champs extra, formidable, et d'autres)
Avis bienvenu.