Formulaire d'insertion dans une BDD [carte cliquable]

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 13:58

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

Eléphant du PHP | 51 Messages

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

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 14:14


Eléphant du PHP | 51 Messages

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';
    }

ViPHP
AB
ViPHP | 5818 Messages

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:

Eléphant du PHP | 51 Messages

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 ....

ViPHP
AB
ViPHP | 5818 Messages

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".

Eléphant du PHP | 51 Messages

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.