Comparer les éléments d'array avec variable. [Résolu/Fermé]

Signaler
Messages postés
73
Date d'inscription
dimanche 23 novembre 2003
Statut
Membre
Dernière intervention
20 novembre 2020
-
 Utilisateur anonyme -
Bonjour,
Je rencontre un problème avec la comparaison des éléments d'array et une variable passée en paramètre dans une fonction externe (fichier js). L'array est remplie en début de fonction depuis un fichier txt qui se trouve sur le serveur de mon hébergeur. La lecture du fichier txt et le remplissage de l'array se font bien.

Mais lorsque je cherche la correspondance élément d'array avec la variable dans une boucle for, ça ne fonctionne pas. Il ne trouve pas sauf si l'élément d'array correspondant est le premier soit indice 0. J'avais d'abord essayé avec indexof à la place de la boucle for mais le résultat était pareil

Après de nombreux tests, je me suis aperçu que la longueur du 1er élément de l'array est 5 (correct et fonctionnel) mais les autres éléments ont une longueur de 7 et même le dernier est à 9. Conclusion, si la longueur de l'élément d'array correspond à celle de la variable ça fonctionne autrement pas.

En mettant des 'alert ' sur les éléments d'array dans ma boucle for, je ne vois rien d'anormal. Ils s'affichent exactement comme dans le fichier txt.

J'ai cherché sur internet comment attribuer une longueur fixe aux élément d'array mais je ne trouve pas.

Si quelqu'un pouvait m'aider pour résoudre ce problème, ce serai sympa car ça fait 3 jours que je rame sur ce foutu problème. Merci d'avance.

Mon javascript externe : 2 arrays séparées par **
1ère : arr_niveaux
2ème :


function check_owner(niveau) {
var Fichier = function Fichier(fichier)
{
if(window.XMLHttpRequest) obj = new XMLHttpRequest(); //Pour Firefox, Opera,...
else if(window.ActiveXObject) obj = new ActiveXObject("Microsoft.XMLHTTP"); //Pour Internet Explorer
else return(false);

if (obj.overrideMimeType) obj.overrideMimeType("text/xml"); //Évite un bug de Safari
obj.open("GET", fichier, false);
obj.send(null);

if(obj.readyState == 4) return(obj.responseText);
else return(false);
}
arr= new Array(2);
arr = Fichier('niveaux_appartements.txt');
arr=obj.responseText.split("**"); // séparateur
arr_niveaux = new Array();
arr_niveaux=arr[0].split("*"); // séparateur

// niveaux checking
alert(arr_niveaux);
for (var i=0; i<arr_niveaux.length; i++) {
alert (arr_niveaux[i] + ' ' + arr_niveaux[i].length + ' ' + niveau + ' ' + niveau.length);
if (arr_niveaux[i] != niveau) alert ('différent');
else alert ('trouve');
}
//var idx = arr_niveaux.indexOf(niveau);
//alert(arr_niveaux[1]);
//alert(niveau);
//if (idx<0) alert (idx);
//else alert (arr_niveaux.indexOf);
}


le fichier txt (la 2ème partie avec séparateur *app n'est pas encore testée)

61.00*
63.60*
66.40*
69.10

'**'
0001,0002,0004,0005,0006,0008,0011,0012,0014,0015,0016,0018*app 0101,0103,0104,0109,0110,0120,0124,0125,0128,0129,0132,0142,0144,0145,0146*app0202,0203,0204,0205,0206,0207,0208,0209,0210,0211,0213,0214,0215,0217,0218,0220,0222,0223,0224,0225,0226,0228,0229,0231,0232,0237,0238,0240,0242,0241,0244,0245,0246*app0321,0323,0335,0336



 

5 réponses


Bonjour

Tu oublies que les éléments de ton fichier sont séparés non seulement par des '*', mais aussi par des caractères de changement de ligne. Tu ne les remarques pas dans un "alert", mais la longueur de 7 au lieu de 5, et même 9 pour le dernier, montre bien qu'ils sont là. Tu pourrais aussi le vérifier si tu affichais le code ASCII de chacun des caractères de ton arr_niveaux[i].

Soit tu élimines ces caractères lors de la génération de ton fichier txt, soit lors du traitement, avec la méthode trim :
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/String/trim
Messages postés
73
Date d'inscription
dimanche 23 novembre 2003
Statut
Membre
Dernière intervention
20 novembre 2020
7
Bonjour le père,
Merci pour ta réponse.
En affichant le code ASCII des éléments d'array, je me suis aperçu que les caractères indésirables étaient l'interligne (10) et le retour chariot (13).
Quand à la méthode trim, je ne sais pas à l'utiliser car c'est réservé à la suppression de caractères blancs.
Et pour éliminer ces caractères lors de la génération de mon fichier txt, je ne vois pas comment même dans les méthodes liées à STRING.
Tu as une idée ?

 

" je ne sais pas à l'utiliser car c'est réservé à la suppression de caractères blancs"
Et qu'est ce que c'est un caractère blanc ? Je t'ai donné un lien sur la fonction, tu aurais pu lire un peu plus loin que la première ligne.

Quant à la manière d'éliminer ces caractères à la génération du fichier, je ne peux pas te répondre car tu ne donnes pas le code qui sert à créer le fichier.

Au passage, j'ignore le contexte de ton application, mais ta manière de récupérer des informations n'est vraiment pas conventionnelle. Tu n'utilises pas PHP ? Et tu t'es inventé un format personnel alors qu'il y a JSON fait pour ça, avec des fonctions toutes faites pour manipuler les données.
Messages postés
73
Date d'inscription
dimanche 23 novembre 2003
Statut
Membre
Dernière intervention
20 novembre 2020
7
Je n'ai pas prêté attention aux caractères de fin de ligne à la 1ère lecture car cela me semblait improbable et lors du test avec le code ASCII je ne m'en souvenais plus. J'ai testé la méthode trim comme dans l'exemple mais ça ne marchait pas. J'ai commencé à chercher avec regexp mais je n'ai pas encore lu toutes les possibilités.

L'utilisation d'un fichier txt me paraissait plus abordable. C'est la seule que je connais dans un environnement PC.

J'ai programmé en cobol et rpg/ile sur ibm (as/400) où on utilisait plutôt des fichiers indexés . Je cherche l'équivalent.

Je ne connais pas php sauf de nom. J'ai lu un tuto sur sql mais ça ne me paraît pas adapté avec tout ce système de tables. Alors oui, pour le php. Je vais m'y mettre car ça devient un handicap.

Merci pour ton aide.

J'ai essayé ton script avec trim et ça marche.
J'ai simplement modifié :
if (arr_niveaux[i].trim() != niveau) alert ('différent');
else alert ('trouve');

Ça m'affiche bien "trouve" si je passe une bonne valeur à check_owner.
Par contre, ma console javascript me signale que l'utilisation de XMLHttpRequest dans le thread principal est dépréciée. Ce n'est pas dramatique, mais il faut t'attendre à ce qu'un de ces jours ça ne marche plus.

L'utilisation d'un fichier txt me paraissait plus abordable Plus abordable que quoi ?
Comme tu ne dis toujours pas sous quelle forme sont tes données au départ, et que je ne connais toujours pas le contexte, difficile de te conseiller mais je pense vraiment que tu ne t'y prends pas de la bonne manière.
Messages postés
73
Date d'inscription
dimanche 23 novembre 2003
Statut
Membre
Dernière intervention
20 novembre 2020
7
Je me rends compte que j'utilisais mal la méthode trim. J'avais testé ainsi :

arr_niveaux_work=arr_niveau[i].trim();
if arr_niveaux_work != niveau) alert ('différent');
else alert ('trouvé');

Je m'attendais à ce que la méthode trim retire les caractères (LF & CR) et me donne la chaine filtrée dans la zone résultat arr_niveaux_work. En relisant, les explications et ta façon de faire je comprends que ce n'est pas comme ça que ça marche. Mal compris.

Je vais chercher une alternative à l'utilisation de xmlhttprequest car je l'utilise ailleurs sur mon site. Voir ici :
http://homeusers.brutele.be/offline.html
Les lignes dans le tableau proviennent d'un fichier txt.

Quand je dis que 'L'utilisation d'un fichier txt me paraissait plus abordable' ça sous-entend le niveau de mes connaissances en environnement PC. Mes connaissances actuelles dans ce domaine se limitent à l'xhtml, css et javascript et encore c'est limité.

Mon objectif est d'installer un contrôle d'accès à certaines pages confidentielles de mon site. C'est un site consacré à un complexe immobilier totalisant 334 appartements avec 2 copropriétés autonomes. Pour faire cela, je dois créer une base de données ou fichier avec tous les numéros d'appartements groupés par niveau topographique. Ces informations ne se trouvent que sur le titre de propriété.

Pour se faire j'ai l'intention de programmer l'encodage d'un mot de passe qui sera en 2 parties : le niveau topographique genre '63.60' et le numéro d'appartement genre '0101'.

Ensuite, contrôler l'existence du niveau/appartement dans une base de données ou fichier se trouvant sur le serveur de mon hébergeur.

Mais quel type de fichier ? J'ai lu le tuto de sql mais ça s'avère être système sophistiqué de tableaux qui me paraît superflu pour mon besoin. Alors je me suis rabattu sur le fichier txt.

J'ai pensé construire ce fichier txt en 2 parties (arrays) :
1. array des niveaux
2. array des appartements
une ligne de l'array des niveaux correspondant à une ligne de l'array des appartements qui elle contiendra une array de 2ème dimension pour accéder à chaque no d'appartement.
En somme, 2 arrays associées que je peux traiter parallèlement via l'index commun.

comme ceci :

61.00*
63.60*
66.40*
69.10
'**'
0001,0002,0004,0005,0006,0008,0011,0012,0014,0015,0016,0018*app 0101,0103,0104,0109,0110,0120,0124,0125,0128,0129,0132,0142,0144,0145,0146*app0202,0203,0204,0205,0206,0207,0208,0209,0210,0211,0213,0214,0215,0217,0218,0220,0222,0223,0224,0225,0226,0228,0229,0231,0232,0237,0238,0240,0242,0241,0244,0245,0246*app0321,0323,0335,0336*app


exemple :
[0] le niveau 61.00 correspond aux appartements 0001,0002,0004...
[1] le niveau 63.60 correspond aux appartements 0101,0103,0104...

contrôle mot de passe :
Vérifier l'existence du niveau dans l'array 'arr_niveaux'.
Si niveau OK, vérifier l'existence du numéro d'appartement (pas encore développé)

Voilà, c'est tout ce que j'ai trouvé comme solution avec mes connaissances actuelles (fichier txt). Si tu peux me guider vers un autre type de fichier, je suis partant.

Merci de m'avoir lu.

Je m'attendais ...ce n'est pas comme ça que ça marche.
Si, c'est bien comme ça que ça marche. Mais il ne faut pas accumuler les erreurs d'inattention :
arr_niveaux_work=arr_niveau[i].trim(); // arr_niveaux[i] avec un 'x'
if arr_niveaux_work  != niveau)... // avec une parenthèse gauche ( entre if et arr_niveaux_work


Normalement, ces erreurs te sont signalées dans ta console javascript. Tu ne connais pas cette console ? Elle est indispensable pour développer. Essaye de taper F12 dans ton navigateur.

Pour ce qui est de sécuriser quelque chose, oublie tout de suite javascript. N'importe qui peut lire ton script, le comprendre, et contourner ta sécurité.
AUCUN système de sécurité ne peut être basé sur javascript côté client.
La vérification doit être faite côté serveur, ce qui impose l'utilisation d'un langage serveur tel que PHP (il y en a d'autres).
Quant à l'utilisation ou non d'une base de données mysql, je comprends que ça puisse effrayer si tu n'y as jamais touché, et tu peux tout à fait le faire avec des fichiers texte, mais dès que tu connaîtras un peu, tu verras que c'est bien plus simple avec une base de données.
Utilisateur anonyme
Indépendamment des autres problèmes, un exemple d'utilisation du format JSON pour te montrer la simplicité du traitement. JSON est un format texte, tu peux très bien taper le fichier "à la main".
<script type="text/javascript">
function check_owner(niveau,appart) {
var Fichier = function Fichier(fichier)
{
    if(window.XMLHttpRequest) var obj = new XMLHttpRequest(); //Pour Firefox, Opera,...
    else if(window.ActiveXObject) obj = new ActiveXObject("Microsoft.XMLHTTP"); //Pour Internet Explorer
    else return(false);

    if (obj.overrideMimeType) obj.overrideMimeType("text/xml"); //Évite un bug de Safari
    obj.open("GET", fichier, false);
    obj.send(null);

    if(obj.readyState == 4) return(obj.responseText);
    else return(false);
}

  arr = JSON.parse(Fichier('niveaux_appartements.json.txt'));

  if (typeof(arr[niveau])=="undefined")  alert ('pas trouvé niveau');
  else {
    if (arr[niveau].indexOf(appart)===-1)  alert ('pas trouvé appart');
    else {
      alert (niveau + ' ' + appart + ' trouvé');
    }
  }
}
check_owner("66.40","0205") ; // pour tester
</script>

et le fichier appartements :
{
"61.00":["0001","0002","0004","0005","0006","0008","0011","0012","0014","0015","0016","0018"],
"63.60":["0101","0103","0104","0109","0110","0120","0124","0125","0128","0129","0132","0142","0144","0145","0146"],
"66.40":["0202","0203","0204","0205","0206","0207","0208","0209","0210","0211","0213","0214","0215","0217","0218","0220","0222","0223","0224","0225","0226","0228","0229","0231","0232","0237","0238","0240","0242","0241","0244","0245","0246"],
"69.10":["0321","0323","0335","0336"]
}