Intéraction avec une base de donnée

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Intéraction avec une base de donnée

Le bonheur est dans le pré

par Phil93 » 06 mars 2007, 12:17

Hello DesmaT,


Heureux que tu aies trouvé ton bonheur (même si, personnellement, je trouve que… mais bon, c'est rien).
La solution est très simple grâce à l'Ajax
Ajax a changé ma vie ! :lol: Ajax, je t'aime. :roll:

Bien à toi,

Phil

par DesmaT » 06 mars 2007, 12:03

La solution est très simple grâce à l'Ajax, et il n'y pas de problème de stockage des données de la base.

Il m'a suffit de créer un fichier php de verification de la base, verif_cp.php :
<?php
include 'config.php';
$conex = mysql_connect($mysql_host, $mysql_user, $mysql_password);
mysql_select_db ($database_name,$conex) ;
$query = "SELECT count( cp ) AS nbr, cp FROM commune WHERE cp = '".$_GET["cp"]."' GROUP BY cp";
$result = mysql_db_query($database_name,$query,$conex);
if(mysql_num_rows($result)>=1)
echo "1";
else
echo "2";
?>
Avec le code javascript :
function verifCp(tel_cp)
{
if(test = file('verif_cp.php?cp='+escape(tel_cp)))
{
if(test == 1)
{
// Le cp est unique
}
else
{
// Le cp n'est pas unique
}
}
function file(fichier)
{
if(window.XMLHttpRequest) // FIREFOX
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // IE
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else
return(false);
xhr_object.open("GET", fichier, false);
xhr_object.send(null);
if(xhr_object.readyState == 4) return(xhr_object.responseText);
else return(false);
}
Et mon formulaire :
<form name="form1" method="post" onSubmit="javascript:verifCp(this.value)" action="popup.php">
<label>
<div align="left"><span class="Formulaire">CP : </span>
<input name="CP" type="text" id="CP" size="6" maxlength="5" class="boiteFormulaire" value="">
<input type="submit" name="Submit" value="Envoyer" class="bouton" align="top">
</div>
</label>
</form>
Merci pour votre aide à tous.

Se rafraîchir la mémoire

par Phil93 » 06 mars 2007, 11:35

Salut DesmaT,
[…] je vais tester l'Ajax, car je pense que charger la base coté client à chaque raffraichissement de la page rabaisserait fortement la performance de l'application.
Les pros confirmeront ou me contrediront peut-être (j'espère sincèrement qu'ils le feront, parce que c'est une information dont j'aimerais avoir confirmation), mais il n'y a aucun rechargement de la base côté client dans ce cadre là.

Le fichier javascript chargé dans le head par…

Code : Tout sélectionner

<script language="javascript"……… src="path de mon fichier javascript" />
… fonctionne comme une image : une fois qu'il est chargé, il est chargé, il ne se recharge pas chaque fois, même si l'on change de page.

Je pense ça — peut-être à tort — parce que lorsque je travaille sur mes modules javascript, si je ne *force* pas le rechargement de la page, les changements ne sont pas pris en compte, même en passant d'une page à l'autre, même en faisant un submit ou autre lien.

Bien à toi et bonne chance,

Phil

par DesmaT » 06 mars 2007, 11:07

Merci de vos réponses, je vais tester l'Ajax, car je pense que charger la base coté client à chaque raffraichissement de la page rabaisserait fortement la performance de l'application.

Mais qu'est-ce qu'il se passe-t-il alors donc ?…

par Phil93 » 03 mars 2007, 14:38

Heu, pourquoi je me retrouve avec « Maître du phpinfo() » sous mon pseudo, moi ? J'ai atteint la barre fatidique ? Je réponds à trop de messages, c'est ça ? C'est quoi le prochain step ?

Mais j'en veux pas, moi ! LOL

Du PHP, depuis l'eau de javel, j'en fais même plus que quand je suis vraiment obligé (c'est à dire presque jamais), alors phpinfo(), je me souviens même plus que ça donne toutes les infos sur ma configuration et tout le tralala.

Non non, j'en veux pas ! j'en veux ! j'en veux pas !

Je veux « Maître du `fonction.caller.name` » ! voilà !

LOL

Hein ?… Quoi ?… Qu'est-ce que vous dîtes ?… On est sur le forum de PHPFrance, pas de JAVASCRIPTFrance ?… Ah merde… J'avais pas vu… Je m'ai perdu, chef… Je veux sortir, chef ! laissez-moi sortir ! laissez-moi sortir !!!!!


Houps…

Loud Out Laughing

par Phil93 » 03 mars 2007, 14:31

re re re re re,
C'est tout à fait possible, et c'est bien là le principe de l'ajax:
javascript charge un fichier et le traite. Ce fichier est un XML, mais rien ne t'empeche d'appeler un script PHP qui va taper dans ta base et te renvoie un XML
LOL. Oui, tu me proposes donc la solution que je te proposais en contre exemple. :wink:

Je posais la question : *sans passer par l'utilisation classique d'un script PHP qui ferait le boulot*, peut-on atteindre directement une base ? LOL

Mais bon, je crois que je connais la réponse : pas encore.

Bien à toi,

Phil :wink:

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

par Shrell » 03 mars 2007, 14:24

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.
On peut le voir comme ca, on peut aussi poser le probleme dans l'autre sens:
n'est-il pas disproportionné de charger à chaque fois coté client l'intégralité de la base de données ?
En plus des incovénients liés à javascript que j'ai développés plus haut, tu augmentes considérablement le temps de chargement et la bande passante utilisée (si ce genre de considérations entre en compte)
de plus, les bases sont concues pour faire face au genre de cas (rarissime) que tu présentes

par Shrell » 03 mars 2007, 14:20

C'est tout à fait possible, et c'est bien là le principe de l'ajax:
javascript charge un fichier et le traite. Ce fichier est un XML, mais rien ne t'empeche d'appeler un script PHP qui va taper dans ta base et te renvoie un XML

Exemple simple:

Je charge villes.php?cp=75

villes.php :
/* il faut penser a prevoir les cas d'erreur, pas fait ici */
echo "<racine>";
$requete=mysql_query("SELECT * FROM villes WHERE cp LIKE '".$_GET['cp']."%' ORDER BY ville");
while($r=mysql_fetch_assoc($requete)) {
    echo "<item value=\"".$r['cp']."\" nom=\"".$r['ville'].\"">";
}
echo "</racine>";
puis dans ton fichier appelant, le javascript se charge de faire toutes les modifications necessaires à partir des éléments renvoyés par le script

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

par Phil93 » 03 mars 2007, 14:15

"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

par DesmaT » 03 mars 2007, 14:01

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 ?

C'est sûr

par Phil93 » 03 mars 2007, 13:47

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

par Shrell » 03 mars 2007, 13:33

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: )

On pinaille, on pinaille

par Phil93 » 03 mars 2007, 12:58

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

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

par Shrell » 03 mars 2007, 12:27

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

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

par Phil93 » 03 mars 2007, 12:03

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