Page 1 sur 2

Intéraction avec une base de donnée

Posté : 01 mars 2007, 19:35
par DesmaT
Bonjour, pour un projet dans une grande entreprise française, je développe un outil simple. L'utilisateur entre un code postal et clique sur un bouton envoyer.
Une popup s'ouvre avec la liste des communes correspondant au code postal (tiré d'une base de donnée mysql), lorsqu'il choisit sa commune la page arrière se regarde grâce à une fonction Javascript et met à jour certains champs de la ville.
Mon très gros problème est que, si un code postal entré correspond à une seule ville recensé dans la BD, la popup ne s'affiche pas et la page se recharge directement en mettant à jour les champs...
Voila mon soucis, comment faire que dans lorsque le bouton est cliqué, le javascript va vérifier dans la base si le code postal est unique...
Ah si le javascript pouvait extraire d'une base ca serai vite réglé mais là je suis dans l'ignorance total...merci de votre aide.

Désolé mais je ne savais pas si je devais poster ce message dans la partie Php ou Javascript, je le ferais déplacer si vous me dites que c'est impossible en Javascript mais possible en Php.

Donnez-moi à manger

Posté : 02 mars 2007, 00:06
par Phil93
Salut à toi,

Personnellement, je pars du principe que javascript peut tout faire à partir du moment où on est gentil avec lui et où on lui donne les éléments dont il a besoin. Jusque-là, je te t'apprends rien. Mais rassure-toi, pour la suite non plus, je ne t'apprendrai rien. :lol:

Pour ton problème, il existe plein de solutions. Tu as déjà cherché du côté d'Ajax ? Produire un fichier XML de ta base serait compliqué ?

Une autre solution, sans passer par Ajax et tout le bataclan, mais beaucoup moins élégante et peut-être lourde si ta base contient 1 million de données (il y en a combien, de communes, en France ?), c'est de générer un fichier javascript, en PHP, donc avant le chargement de la page, qui contiendrait les infos minimum dont tu as besoin.

Genre…

Code : Tout sélectionner

/* Mon fichier "mesvilles.js" # # Il est généré automatique en PHP à partir de la lecture # de la base MySql, même ce texte # */ /* Je mets ces données-là, mais je ne pense pas que ce soit celles dont tu as besoin. À toi de voir… */ const MESVILLES = { 75001: "Paris", 90000: "Belfort", 25200: "Montbéliard", 93500: "Pantin", 29380: "Cholet", etc. }
Je mettrais dans PHP un contrôle sur la date de dernière modification de la base et dernière modification du fichier JS pour savoir s'il est nécessaire de le ré-actualiser, comme ça, je le fais que quand c'est nécessaire.

Ensuite, comme d'habitude, un chargement du fichier JS dans le head du fichier HTML…

Code : Tout sélectionner

<script language="javascript" […] src="monDossierJS/mesvilles.js" />
À partir de là, JS a ce qu'il faut pour bosser, il devient très gentil.

Si je veux savoir si un code postal existe, par exemple, il me suffit de faire.

Code : Tout sélectionner

if ( nomVille=MESVILLES[lecode]/*un seul "=", c 1 affectation*/ ) { alert("La ville existe ! C'est « Trifouilli les Oies ! »"); } else alert("Va te faire voir chez les grecs, peut-être qu'ils connaissent" + " ton bled.");
Voilà, ça doit pas répondre du tout à ta question, mais rassure-toi, pour ça aussi, j'ai l'habitude de répondre à côté de la plaque.

Bonne chance à toi,

Phil

Posté : 02 mars 2007, 17:04
par DesmaT
Il y a 36500 villes repertoriés dans la base et l'application sera utiliser par 2000 personnes en même temps...donc je penses me renseigner du coté d'Ajax car stoquer toutes les infos à l'ouverture j'y ai pensé mais ca fera explosé le serveur lol

Donc à part Ajax et le stockage lourd, il n'y aucune méthode vraimernt spécifique au Javascript ?

Posté : 02 mars 2007, 17:23
par Phil93
Il y a 36500 villes repertoriés dans la base
36500 ? C'est tout ? Mais c'est de la rigolade, ça. Si mes applis javascript pouvaient manipuler aussi peu de données (en plus, des courtes comme des noms de villes et des codes postaux), je serais le plus heureux des hommes ! :roll:
et l'application sera utiliser par 2000 personnes en même temps...
Ben là, il y a aucun problème, puisque le fichier est manipulé côté client. Je veux dire : il est "chargé" côté client, donc rien à faire du nombre d'utilisateurs. Il pourrait y avoir 5000000 personnes en même temps que ça n'y changerait rien (à ce niveau-là en tout cas).
Ce n'est justement pas comme des appels à une base de données. Là, par ce moyen, le client *charge* sa propre base de données.

Non, aux vues de ce que tu dis là, moi, je ferais la tentative. En plus, elle se met en place en deux coups de cuillières à pot ! Mais ça serait bien d'avoir l'avis de gens plus avisés que moi.

Bonne chance à toi,

Phil

Posté : 02 mars 2007, 19:14
par Shrell
Dans ce cas la solution la plus adaptée est l'AJAX à mon avis. En effet, même si 36000 villes ca n'est pas énorme, le Javascript a une facheuse tendance à prendre énormément de temps pour faire des tris de cette sorte (je parle en connaissance de cause: j'ai déjà été confronté au même probleme)
La solution la plus simple et la plus élégante est d'afficher en premier lieu dans un select ou un div, ou n'importe quelle autre solution, une liste de toutes les villes qui correspondent à la recherche effectuée (donc AJAX pour ne pas avoir à recharger la page) puis de remplir ton formulaire avec les informations correspondant à une ville donnée quand on la sélectionne (l'AJAX semble encore une fois tout indiqué)
Si tu as déjà touché à cette façon de faire, essaie de le mettre en place et dis nous ce qu'il en est, sinon renseigne toi et reviens nous poser tes questions ;)

Kan j'en tiens un, j'le lâche plus

Posté : 03 mars 2007, 10:13
par Phil93
Bonjour à tous,

Bonjour Shrell,
le Javascript a une facheuse tendance à prendre énormément de temps pour faire des tris de cette sorte
J'en profite pour t'interroger, puisque tu as l'air d'en savoir beaucoup plus long que moi. D'abord, est-ce que tu pourrais m'expliquer où se fait le tri dans le code que je proposais ? Est-ce que, pour dire ça, tu te places à un niveau très bas (parce qu'au niveau langage, on est d'accord qu'il n'y a pas de tri, n'est-ce pas ?)

Donc, si je comprends ce que tu veux dire, tu veux dire que si j'ai…

Code : Tout sélectionner

var monTableau = new Array() ; monTableau[0] = "Toto" ; monTableau[1] = "Tintin" ; monTableau[2] = "Titi" ; monTableau[3] = "Turlututu" ; monTableau[4] = "Toutout" ; monTableau[5] = "Tarentino" ;
… et que je fais ensuite…

Code : Tout sélectionner

if ( quiEsTu = monTableau[idselected] ) alert("Je t'ai reconnu, tu es " + quiEsTu) ;
Il y a un tri qui se fait pour obtenir la valeur ?

Ensuite, il y a une interrogation que j'ai, en rapport avec ça. Tu pourras certainement me répondre.

Pour l'exemple ci-dessus, je teste simplement l'existence de la valeur en voyant si sa clé existe dans le tableau. Si ma clé idselected n'existe pas, c'est la valeur undefined qui est attribuée à quiEsTu et la condition devient fausse.

Je me suis toujours demandé ce qui était le mieux, pour *tester la présence d'une valeur* (pas forcément dans un tableau) entre procéder de cette façon, qui me semble la plus élégante, et utiliser un indexOf.

Par exemple, pour le cas qui nous occupe, j'ai la honte d'avouer que l'a première chose que je fais pour vérifier l'existence d'une valeur, c'est de passer par indexOf.

Code : Tout sélectionner

var delBiz = "^#" ; function in_array(element, liste) { return (delBiz+liste.join(delBiz)+delBiz).indexOf(delBiz+element+delBiz) > -1 ; }
Est-ce que c'est vraiment moche de faire ça ? Est-ce que c'est complètement idiot et qu'une boucle for serait plus adaptée ?

Je pose aussi la question en terme de *rentabilité*. Les tests que j'ai faits (aux tout débuts de mes interrogations) me faisaient gagner quelques centièmes de secondes avec cette méthode, mais ces tests étaient-ils suffisamment variés ? diversifiés ?

Voilà, merci à toi pour toute réponse et tout temps que tu prendras à me répondre si tu le fais.

Bien à vous,

Phil

Une solution tout bête

Posté : 03 mars 2007, 10:25
par Phil93
Re à tous,

J'ai à faire un aveu honteux : je n'avais rien compris à ton problème, DesmaT, en le lisant. En fait, tu dis « mon très gros problème » à la place de « ce que je voudrais », c'est ça ?

*Ce que tu voudrais*, c'est que lorsqu'un code postal ne correspond qu'à une seule ville, la pop up ne s'ouvre pas ?

Alors là, excuse-moi de te le dire, mais la solution est vraiment simple. Personnellement, j'indiquerais simplement au programme les particularités de la liste.

Qu'est-ce qui est en plus grand nombre, dans ta base ? Les codes qui correspondent à plusieurs villes, ou les codes qui correspondent à une seule ville (moi qui pensais naïvement qu'un code postal correspondait à une seule ville…). Inutile de te dire que c'est la liste la plus courte qu'il faudrait donner à javascript. Ensuite, il a juste à vérifier l'existence du code dans la-dite liste pour savoir s'il doit ouvrir ou non un popup.

Franchement, s'il n'y en a qu'une petite dizaine, je ne vois pas pourquoi s'encombrer avec de l'eau de javel (enfin, de l'Ajax). Ça serait utiliser une Grosse Bertha pour écraser une mouche.

Si je suis pas clair, merci de me le dire…

Bien à vous tous,

Phil

Re: Kan j'en tiens un, j'le lâche plus

Posté : 03 mars 2007, 11:29
par Shrell
Je dois mal être réveillé, j'ai du mal à comprendre tes questions #-o
Est-ce que, pour dire ça, tu te places à un niveau très bas (parce qu'au niveau langage, on est d'accord qu'il n'y a pas de tri, n'est-ce pas ?)
Euh, j'ai du mal m'exprimer...
Ce que je voulais dire c'est que demander à javascript, qui est un langage interprété coté client, dans un contexte somme toute très particulier (il est completement dépendant du navigateur dans lequel il s'exécute), de passer en revue séquentiellement 36000 enregistrement (meme en prévoyant une condition de sortie) va sensiblement ralentir toutes les autres activités.
En plus, imaginons un cas encore plus particulier, mais pas forcément si improbable : en plus de ton javascript qui trie ton tableau, tu as un setInterval quelque part avec une échéance d'une seconde (une image qui bouge ou quelque chose comme ça) et/ou une animation Flash.
Avant dans lancer le tri dans ce contexte là, je pense que j'irais me prendre un bon café :lol:

Sinon, passer par l'indexOf, à vrai dire je n'ai pas testé, mais c'est surement plus rapide qu'une solution à base de for étant donné que c'est une fonction directement implémentée dans le langage
Cependant je persiste, passer par de l'ajax dans ce cas précis ne me semble ni une perte de temps ni une débauche excessive de moyens, mais une solution élégante en plus d'un "exercice" bénéfique pour la suite

Re: Kan j'en tiens un, j'le lâche plus

Posté : 03 mars 2007, 12:03
par Phil93
Salut Shrell
Ce que je voulais dire c'est que demander à javascript, qui est un langage interprété coté client, dans un contexte somme toute très particulier (il est completement dépendant du navigateur dans lequel il s'exécute), de passer en revue séquentiellement 36000 enregistrement (meme en prévoyant une condition de sortie) va sensiblement ralentir toutes les autres activités.
Heu… où est-ce que tu vois un passage en revue séquentiel ? Je mets ma fonction complète :

Code : Tout sélectionner

/* Pré-requis : un tableau associatif MESVILLES a été défini, contenant en clé le code postal, en valeur le simple string du nom de la ville Syntaxe de chaque item du array MESVILLES : MESVILLES[string(*) codepostal] = string nomDeLaVille> ; (*) pour que "01254" ne devienne pas 1254 (octal ?) */ /* Ma fonction appelée par l'utilisateur, après son click sur le bouton (encore une fois : j'ai bien compris que ça n'était pas le problème exact soulevé par DesmaT) */ function OnClickBoutonOK ( ) { /* Je relève la valeur donnée par l'utilisateur (pourrait aussi être passé en argument, mais bon…) */ var codeUser = document.getElementById('champ-codep').value; if ( nomVille=MESVILLES[codeUser] ) alert("La ville s'appelle «"+nomVille+"»") ; else alert("Cette ville m'est inconnue."); }
Voilà, c'est tout. D'après mes faibles connaissances, je ne vois pas le passage en revue séquentiel : si la ville existe dans mon tableau, nomVille prendra sa valeur, sinon, nomVille prendra la valeur undefined, qui rendra la condition fausse.

Désolé si je ne comprends pas…

Bien à toi, merci pour cet échange,


Phil

Re: Kan j'en tiens un, j'le lâche plus

Posté : 03 mars 2007, 12:27
par Shrell

Code : Tout sélectionner

/* Pré-requis : un tableau associatif MESVILLES a été défini, contenant en clé le code postal, en valeur le simple string du nom de la ville Syntaxe de chaque item du array MESVILLES : MESVILLES[string(*) codepostal] = string nomDeLaVille> ; (*) pour que "01254" ne devienne pas 1254 (octal ?) */
Justement, le probleme est qu'étant donné qu'un code postal peut correspondre à plusieurs villes, tu ne peux pas avoir un tableau associatif 1 CP <=> 1 ville
Avec les codes INSEE à la limite, mais je ne suis pas persuadé que l'utilisateur lambda les connaisse

On pinaille, on pinaille

Posté : 03 mars 2007, 12:58
par Phil93
Salut Shrell,

On pinaille, on pinaille ;-). J'avais bien précisé que j'étais conscient qu'on s'écartait du problème de DesmaT. J'essayais d'avoir tes lumières sur d'autres choses.

Pour tout te dire, si j'avais à résoudre le problème précis de DesmaT, et que je décide (rien que pour emmer*** le monde) d'utiliser javascript, je ferais quelque chose qui m'amuserait plus.

Genre…

Code : Tout sélectionner

// Instanciation de mes villes (qui s'appelle CODES_POSTAUX, // ce qui est plus logique maintenant) // Ce tableau contiendra toutes mes instances de la classe suivante var CODES_POSTAUX = new Array() ; // Définition d'une classe CODEP function CODEP() { this.uniqueID ; this.code ; this.villes ; this.nbvilles ; this.departement; this.region; }
… Je lui créerais 2 ou trois prototypes, genre…

Code : Tout sélectionner

/* Proto pour initialiser l'instance et la mettre dans mes villes */ CODEP.prototype.init = function ( leCode) { this.code = leCode ; var pref = leCode.substring(0,2) ; this.departement = TABLEAU_DEPARTEMENTS[pref] ; this.region = TABLEAU_REGIONS[this.departement] ; /* etc. */ MESVILLES[leCode] = this ; } /* Proto pour ajouter une ville */ CODEP.prototype.addVille = function ( laVille ) { if ( ! this.villes ) this.villes = new Array() ; this.villes.push(laVille); this.nbvilles++; }
Je demanderais à PHP de me générer un code genre…

Code : Tout sélectionner

var cp = new CODEP() ; cp.init(leNouveauCodePostalTrouved); /* et pour chaque ville */ cp.addVille(laNouvelleVilleTrouved);
Et voilà, après je suis tranquille, pour savoir si un code ne renvoie qu'à une seule ville, il me suffit de faire (toujours sans passage en revue, me semble-t-il)…

Code : Tout sélectionner

function EstCeQueVilleUnique(leCodeP) { if ( dataCP=CODES_POSTAUX[leCodeP] ) { return dataCP.nbvilles == 1 ; } else { alert("Désolé, mais je ne connais pas ce code postal…"); return 0; } }

Non ?



Bien à toi,


Phil

Posté : 03 mars 2007, 13:33
par Shrell
Certes... enfin de mon avis personnel, la grosse Bertha pour tuer la mouche, c'est toi qui viens de nous la sortir ;)
sinon, pour en revenir au probleme initial, je crois que DesmaT a posé la bonne question dès le départ
Ah si le javascript pouvait extraire d'une base ca serai vite réglé mais là je suis dans l'ignorance total...merci de votre aide.
donc => ajax
en plus, ca permet d'éviter le popup, ce qui ne pourra qu'être bénéfique
( :twisted: et de toutes façons, je suis d'une mauvaise foi à toute épreuve quand il s'agit de montrer que j'ai raison :twisted: )

C'est sûr

Posté : 03 mars 2007, 13:47
par Phil93
Re-
Certes... enfin de mon avis personnel, la grosse Bertha pour tuer la mouche, c'est toi qui viens de nous la sortir ;)
LOL. C'est sûr que si c'est juste pour régler le problème de DesmaT, on peut difficilement faire plus compliqué. 8-)

Je mettais ça pour lui donner des idées, stimuler ses neurones (le pauvre, c'est clair qu'il en a besoin — je rigole).

Cela étant, si vraiment son problème se résume à ce qu'il exprime, ma solution suggérée plus haut (mettre simplement dans une liste les codes postaux qui possèdent une ville unique — ou l'inverse si elle est plus courte) reste à mon avis la plus simple et la plus performante (bien avant Ajax).
donc => ajax
J'ai la flemme de chercher, donc : Ajax permet vraiment de lire dans une base de données (autre qu'en xml) ?

Je ne parle pas, bien sûr, à la solution qui consisterait à faire…

Code : Tout sélectionner

# Javascript, via l'eau de javel, lance… # … Un script PHP qui va fouiller dans mySQL # … et renvoie ses résultats au script javascript # pour qu'il le traite intra muros
Non, je veux dire : une vraie lecture dans une base, ça existe, ça ?

Bien à toi,


Phil

Posté : 03 mars 2007, 14:01
par DesmaT
Bonjour à tous et tout d'abord merci de vos réponses.

Pour te répondre Phil93, je ne sais pas vraiment quel liste serait la plus longue, celle de Code Postaux unique ou l'autre. Car il y a énormement de regroupement de ville de campagne qui ont le même code postal. Il faudrait que je vérifie cela Lundi.

Etant donné que je ne connais pas du l'utilisation d'Ajax, je ne peux pas dire quel solution me semble la plus adapté. Il est sur que si j'avais le moyen de :

"Lorsque l'utilisateur clique sur le bouton, la fonction javascript envois le code postal à une fonction Php (et qui la lance), qui elle va chercher dans la base de donnée si le code postal est unique. Et la fonction Php ré appelle une fonction javascript qui va se charger d'ouvrir la popup ou de mettre à jour les champs." Comme ce que Phil93 propose dans son dernier message.

Je comprendrais le fonctionnement du code que j'éxecute et je ne pense pas que cela alourdirait l'utilisation du programme.

Cela est-il possible ?

Le pire, c'est ce qu'il y a de mieux

Posté : 03 mars 2007, 14:15
par Phil93
"Lorsque l'utilisateur clique sur le bouton, la fonction javascript envois le code postal à une fonction Php (et qui la lance), qui elle va chercher dans la base de donnée si le code postal est unique. Et la fonction Php ré appelle une fonction javascript qui va se charger d'ouvrir la popup ou de mettre à jour les champs." Comme ce que Phil93 propose dans son dernier message.

Je comprendrais le fonctionnement du code que j'éxecute et je ne pense pas que cela alourdirait l'utilisation du programme.

Cela est-il possible ?
Ben c'est un peu de la rigolade, oui. À mon avis, tu trouveras ici et ailleurs plein d'éclaircissements sur cette question.

C'est pas pour défendre mon idée, mais en lisant ton truc, et les infos que tu nous as données, je me dis quand même « oh attention, j'ai 2000 personnes qui travaillent en même temps, et je vais mobiliser ma base juste pour savoir si un code est unique »…

Imagine que 50% des utilisateurs entrent en même temps un code postal (il faut toujours envisager le pire, non ?), et tu te retrouves avec 1000 requêtes envoyées à la base juste pour avoir une information qui se réduit à quelques octets… Je sais pas ce qu'en pensent les pros, mais il y a quelque chose qui me parait disproportionné là-dedans.

Tiens-nous au courant, concernant le nombre de codes à ville unique (ou le contraire) — et le reste aussi —, ça m'intéresse beaucoup.

Bien à toi et bonne chance,


Phil