Formulaire d'insertion dans une BDD [carte cliquable]

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 : Formulaire d'insertion dans une BDD [carte cliquable]

par toone » 12 juin 2009, 09:10

Merci beaucoup :)

Je vais laisser comme sa pour l'instant.

Merci de votre aide! Je suis en ce moment sur un 'catalogue/brochure' (faut bien de lamatière pourmon rapport de stage !) donc plus infographie^^...

Surement à bientôt.

par AB » 10 juin 2009, 15:03

Ci cependant il me faut remettre comme avant, il faut que je crée une petite partie d'insertion dans la table departements par exemple dans chacune de mes pages "?id=xx", c'est une bonne idée aussi mais cela implique de bien mettre à jour la bdd, et ça je ne sais pas si cela sera fait sur le long terme (stage inside)...
Si tu veux renseigner le nombre de clients dans ta table "départements", à la suite de ta requête d'insertion il suffit de faire :
//...
if (get_magic_quotes_gpc()) $_POST = array_map('stripslashes',$_POST);
$_POST = array_map('mysql_real_escape_string',$_POST);

$sql = "INSERT INTO informations(Entreprise, Num_Dep, Nom_Maintenance, Num_Maintenance, Nom_Travaux, Num_Travaux, Adresse) VALUES('".$_POST['Entreprise']."', '".$_POST['Num_Dep']."', '".$_POST['Nom_Maintenance']."','".$_POST['Num_Maintenance']."', '".$_POST['Nom_Travaux']."','".$_POST['Num_Travaux']."', '".$_POST['Adresse']."')";


if (mysql_query($sql)) {

// Mise à jour nb_client dans table "departements"

$verif_nb_client = "SELECT COUNT(*) as nbc FROM informations WHERE Num_Dep = '".$_POST['Num_Dep']."'";
$req_verif_nb_client = mysql_query($verif_nb_client);
$nb_client = mysql_fetch_assoc($req_verif_nb_client);

$update_nb_client = "UPDATE departements SET Nb_Clients = '".$nb_client['nbc']."' WHERE Num_Dep = '".$_POST['Num_Dep']."'";
mysql_query($update_nb_client);

};
Evidemment il faudra mettre le bloc de code //Mise à jour nb_client dans table "departements", de la même manière lorsque tu feras une suppression dans ta table "informations"

Si tu fais cela tu pourras reprendre ta petite requête simple (sans jointure) pour les informations de tes infobulles.

Il te resterait le cas où quelqu'un rentrerait des informations dans la table "informations" sans passer par ton module d'administration, depuis phpmyadmin par exemple. Pour ce cas particulier, tu pourrais faire une page "Actualiser le nombre de clients" en te servant du dernier code que tu as créé
$query = "SELECT 

departements.Num_Dep, 

COUNT(informations.Num_Dep) AS nombre_Dep

FROM departements 

LEFT JOIN informations

ON departements.Num_Dep=informations.Num_Dep 

GROUP BY departements.Num_Dep";

$ressource = mysql_query($query) or die(mysql_error());

$nb_lient_dep = array();

while ($resultat = mysql_fetch_assoc($ressource)) 

    {
    $nb_lient_dep[$resultat['Num_Dep']] = $resultat['nombre_Dep'];
    } 


foreach ($nb_lient_dep as $key => $value)
	{
	$maj = "UPDATE departements SET Nb_Clients = '".$value."' WHERE Num_Dep = '".$key."'";
	mysql_query($maj);
	}
Donc cette page ne serait utilisée qu'occasionnellement sur demande, au cas où... et le code d'affichage de ta carte serait optimisé.

Enfin bon si le nb de clients est de l'ordre de la dizaine par département, tu peux laisser la jointure pour l'affichage des infobulles de ta carte. Par contre si c'est de l'ordre de la centaine ou plus, ta table "informations" pourra contenir plusieurs dizaines de milliers de lignes et dans ce cas la différence pourra être sensible d'autant plus qu'il y aura des connexions simultanées à ta page "carte".

par toone » 10 juin 2009, 08:44

Je vois je vois, cependant je pense laisser cette solution....

En effet je préfère que le nombre de client s'incrémente automatiquement, car il y aura eventuellement plusieurs 'cartes' sur le même modèle...

Donc le nombre d'enregistrements devrait être limités.

Ci cependant il me faut remettre comme avant, il faut que je crée une petite partie d'insertion dans la table departements par exemple dans chacune de mes pages "?id=xx", c'est une bonne idée aussi mais cela implique de bien mettre à jour la bdd, et ça je ne sais pas si cela sera fait sur le long terme (stage inside)...


Edit :

Petite question, serait il compliqué de mettre en place des fonctions de modification et suppression ? Je pensais à des petits 'boutons' modifier , supprimer, sur les tableau affiché par le onclick ....

par AB » 09 juin 2009, 19:29

Et bien je crois que ça commence à rentrer ^^...
Effectivement je vois que tu commence à comprendre =D> =D>

Juste une remarque : la méthode employée (avec jointure) pour renseigner les infobulles possède un gros avantage mais également un gros inconvénient.
Le gros avantage est que maintenant tes tables sont indépendantes, la table "département" ne servant qu'à renseigner le nom du département pour éviter la redondance dans ta table "information", ce qui est une bonne chose. En faisant ainsi tu peux ajouter une ligne dans ta table "information" sans avoir à renseigner la table "département".

L'inconvénient c'est que cette jointure va consommer beaucoup plus de ressources que la requête initiale qui te servait à renseigner les infobulles puisqu'elle va compter pour chaque champ de ta table "département" le nombre de correspondances dans ta table "information". Cette requête sera effectuée à chaque affichage de ta page et son temps d'exécution augmentera proportionnellement avec l'augmentation du nombre de clients, contrairement à la première qui était beaucoup plus rapide et d'une durée stable.

Donc ta première idée de renseigner un champ "nb_client" directement dans ta table "département" était une bonne idée du point de vue de la performance pure. Depuis ton espace d'administration tu aurais pu renseigner le "nb_client" dans ta table "département" pour chaque ajout dans ta table "information" avec deux requêtes distinctes (une insertion dans la table "information" suivie d'un update dans ta table "département" .

Mais la jointure est plus efficace si l'on considère la cohérence des données :
Si par exemple tu ajoute une ligne dans ta table "information" depuis phpmyadmin par exemple (sans passer par ton interface administrateur et sans incrémenter le nombre de client dans ta table "département") le nombre de clients retourné par la jointure sera néanmoins exact.

Voilà donc les données du problème :wink:

par toone » 09 juin 2009, 14:19

Je vais me faire taper sur les doigts... AB m'avait donné une requête avec une jointure que j'utilise pour le tableau d'informations :s

Désolé AB :D , je vais donc voir du côté de la jointure ^^


EDIT :

Et bien je crois que ça commence à rentrer ^^...

Voici mon code pour mes infobulles, testé et apparemment fonctionnel! (je me suis aidé de ce site:


http://www.romualb.com/2008/06/12/5/mys ... nture.html )


$query = "SELECT departements.Nom_Dep,

departements.Num_Dep, 

COUNT(informations.Num_Dep) AS nombre_Dep

FROM departements 

LEFT JOIN informations

ON departements.Num_Dep=informations.Num_Dep 

GROUP BY departements.Num_Dep";

$ressource = mysql_query($query) or die(mysql_error());

$StrInfo = array();

while ($resultat = mysql_fetch_assoc($ressource)) 

    {
    $StrInfo[$resultat['Num_Dep']] = $resultat['Nom_Dep'].' : '.$resultat['nombre_Dep'].' contacts dans le département';
    }

par charabia » 09 juin 2009, 14:14

par toone » 09 juin 2009, 14:09

Yes, mais le soucis est que dans départements, j'ai mes noms de départements, et pas dans informations, pourtant j'aimerai bien l'affiché aussi dans mon info bulle,

comme ceci :
Image


Il y a t'il un moyen de 'mixer' les deux requêtes, récupérer des infos dans une base, et d'autres infos dans l'autre base... :s

par charabia » 09 juin 2009, 13:58

La nouvelle requête doit remplacer l'ancienne. Elle ne doit plus porter sur départements mais sur informations.

par toone » 09 juin 2009, 13:41

Dans mon idex, j'ai cette partie qui gère les StrInfo utilisés pour mes areas title :
$query = "SELECT 

Num_Dep,
Nom_Dep,
Nb_Clients

FROM departements ";

$ressource = mysql_query($query) or die(mysql_error());

$StrInfo = array();

while ($resultat = mysql_fetch_assoc($ressource)) 

    {
    $StrInfo[$resultat['Num_Dep']] = $resultat['Nom_Dep'].' : '.$resultat['Nb_Clients'].' contacts dans le département';
    }
Dans cette requête je fais un select Num_Dep, est ce ici que j'inclue

Code : Tout sélectionner

SELECT Num_Dep,COUNT(*) FROM informations GROUP BY Num_Dep
ou alors je dois faire deux requêtes différentes..

Désolé mais là je ne suis pas assez sur de moi pour le placement des requêtes sql

par charabia » 09 juin 2009, 11:10

Heu...ben il s'agit d'une requête banale quoi. Tu récupères les données comme tu ferais avec d'autres requêtes et tu en fais ce que tu veux, afficher le résultat pour ta map par exemple.

par toone » 09 juin 2009, 11:05

Donc si je comprends bien la requête devrait être celle ci :

Code : Tout sélectionner

SELECT Num_Dep,COUNT(*) FROM informations GROUP BY Num_Dep
Cela me renverra quelle variable, et où??

Je pourrai mettre le codephp qui gère les Strinfo si besoin, cette partie est rappelée dans mes 'areas' de ma map par des
title = "<?php echo isset($StrInfo['62'])? $StrInfo['62'] : '' ?>"

par charabia » 09 juin 2009, 10:47

En fait dès qu'il y a un nouvel enregistrement, le champ num_dep sera rempli dans ta table "informations".

Il te suffit donc de faire une requête avec COUNT et GROUP BY.

http://sql.toutestfacile.com/cours/coun ... _by_2.php5

par toone » 09 juin 2009, 10:42

Tu veux dire qu'avec une fonction qui compterait le nombre de "Num_Dep"identique, cela suffirait? et cela pourra être dynamique et se "mettre à jour"?

Mon but est que l'infobulle qui s'affiche quand je passe sur les départements indique bien le nombre de clients...

par charabia » 09 juin 2009, 10:07

Je ne vois pas trop l'intérêt de ce que tu fais là.

Déjà tu n'as pas de clé primaire + auto-incrémentation dans ta table "départements".

Ensuite, ce que tu veux faire c'est de pouvoir récupérer à un moment donné le nombre de client d'un département X.

Dans ta table informations, tu as déjà cette information, il te suffit de te baser sur le champ num_dep de "informations" pour avoir le résultat escompté. Inutile donc d'ajouter le champ nb_clients dans "départements".

par toone » 09 juin 2009, 10:01

Alors, detaillons :

J'ai une BDD Clients :

> Une table departements :

Image


> Une table informations :

Image

Ma table departements contient donc tous les départements (nom et numéros) et la table informations des infos plus précises en fonction du numéro...

Lors de mon insertion de nouveau client, je complète la table "informations".

==> J'aimerai alors trouver la fonction qui permet de rajouter +1 au Nb_Clients de la table "departements" lors de l'insertion sql :

Code : Tout sélectionner

$sql = "INSERT INTO informations(Entreprise, Num_Dep, Nom_Maintenance, Num_Maintenance, Nom_Travaux, Num_Travaux, Adresse) VALUES('".$_POST['Entreprise']."', '".$_POST['Num_Dep']."', '".$_POST['Nom_Maintenance']."','".$_POST['Num_Maintenance']."', '".$_POST['Nom_Travaux']."','".$_POST['Num_Travaux']."', '".$_POST['Adresse']."')"; $res = mysql_query($sql) or die(mysql_error());

Il faut donc un lien avec Num_Dep, mais je ne vois pas lequel, un INSERT conditionnel?(cela existe?)