Formulaire d'insertion dans une BDD [carte cliquable]

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2009, 14:52

Voici un formulaire type à tester dans une page séparée
<?php
header('Content-type: text/html; charset=UTF-8');

if (isset($_POST['ajouter'])) 
{
echo '<pre>';
print_r($_POST);
echo '</pre>';
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Document sans titre</title>
<style type="text/css">
#ajout label {
font-family : Trebuchet, Helvetica, sans-serif;
font-size:0.9em;
}
</style>
</head>

<body>
<div>
<form id = "ajout"  action="#" method="post">
<p>
<label for = "Entreprise">Entreprise </label><input  type = "text" name = "Entreprise" id = "Entreprise" />
<br />
<label for = "Num_maintenance">Numéro de maintenance </label><input  type = "text" name = "Num_Maintenance" id = "Num_maintenance" />
<br />
<input  type = "submit" name = "ajouter" value = "Ajouter" />
</p>
</form>
</div>
</body>
</html>
Remarques :
Si tu travailles en utf-8 penses à ajouter l'entête ci-dessous au début de tes pages php
header('Content-type: text/html; charset=UTF-8');


et juste après la connexion à ta base de données, la requête
mysql_query("SET NAMES 'utf8'");


Ensuite il faudrait protéger tes données avec mysql_real_escape_string() pour les insérer en bdd, après avoir auparavant vérifié (c'est préférable pour un code portable) la configuration magic quotes du serveur.
Un exemple de mise en application de ces remarques dans le code de ce tuto http://www.phpfrance.com/forums/voir_sujet-242539.php

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2009, 14:57

J'ai répondu sans voir ta réponse.
Apparemment le tuto déjà cité sur la connexion dans un espace membre et la protection des pages devrait t'être assez utile http://www.phpfrance.com/forums/voir_sujet-242539.php

Eléphant du PHP | 51 Messages

08 juin 2009, 15:24

Voici quelque chose qui fonctionne (j'ai fait un test echo, il faut que je teste pour la base)
<?php
      header('Content-type: text/html; charset=UTF-8'); 
      // déclaration de quelques variables

      $host = "localhost";
      $user = "root";
      $pass = "";
      $bdd = "clients";
      $table = "informations";

      // connection avec MySQL

      mysql_connect($host, $user, $pass) or die("Impossible de se connecter à la base de données");
mysql_query("SET NAMES 'utf8'"); 
      // Le @ indique à php de ne pas afficher de message d'erreur

      mysql_select_db($bdd) or die("Impossible de se connecter à la base de données");

     
      // stockage dans la bdd
 
if (isset($_POST['ajouter'])) 
{
$Entreprise = $_POST['Entreprise']; 
echo $Entreprise;
$Num_Dep = $_POST['Num_Dep'];
$Nom_Maintenance = $_POST['Nom_Maintenance'];
$Num_Maintenance = $_POST['Num_Maintenance'];
$Nom_Travaux = $_POST['Nom_Travaux'];
$Num_Travaux = $_POST['Num_Travaux'];
$Adresse =$_POST['Adresse'];
    
}
 /*
      $sql = "INSERT INTO informations(Entreprise, Num_Dep, Nom_Maintenance, Num_Maintenance, Nom_Travaux, Num_Travaux, Adresse) VALUES('$Entreprise', '$Num_Dep', '$Nom_Maintenance', '$Num_Maintenance', '$Nom_Travaux', '$Num_Travaux', '$Adresse')";
      $res = mysql_query($sql) or die(mysql_error());
	  echo 'merci beaucoup, vos infos ont été enregistrées.';

*/
      // déconnection avec MySQL

      mysql_close();

      ?>
<form id="ajout" method="post" action="ajout.php">
<label for="Adresse"> * Adresse : </label><input name="Adresse" id="Adresse" type="text" /><br /><br /><br />

<input type="submit" name= "ajouter" value="Insérer dans la base"> 

La verif config magic quotes et le mysql_real_escape_string() doit être faîte pour chacune de mes variables?

ViPHP
AB
ViPHP | 5818 Messages

08 juin 2009, 15:49

La verif config magic quotes et le mysql_real_escape_string() doit être faîte pour chacune de mes variables?
Oui mais tu peux aussi appliquer ces fonctions à chacun des éléments du tableau $_POST avec array_map() (puisque dans ce cas le tableau $_POST est uni dimensionnel)
if (isset($_POST['ajouter'])) 
{

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']."')";

Eléphant du PHP | 51 Messages

09 juin 2009, 08:45

Me voilà avec une carte fonctionnelle, je peux ajouter des données grâce au formulaire, elle s'affiche correctement après...

Reste deux trois interrogations :D

* Lorsque j'insère dans la BDD (je l'ai vu lors des tests), cela indente +1 à l'id, et lorsque je supprime une entrée cela ne revient pas, exemple je fait un ajout, la ligne à un id 5, si je la supprime et que je rajoute une ligne, elle aura l'id 6. Je pensait qu'elle aurait l'id 5... Cela a t'il une importance??

*Dans mon formulaire, j'avais commencé à mettre une liste déroulante pour les départements, il y a t'il des spécificités pour la récupération dans la BDD, ou même méthode?

(Comme sa je peux mettre les Num_Dep en liste déroulante pour éviter des erreurs, ou alors le nom du departement..)

Je peux mettre pour les intéressé(e)s les screens et codes de mes différentes pages.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 08:48

Pour ta première question, non ce n'est pas important et c'est normal que ça continue à s'incrémenter. Tes enregistrements ont chacun leur propre numéro unique, donc que ça se suive ou pas, aucun souci à te faire.

Pour ta liste déroulante, ça fonctionne comme un champ texte (sauf si tu fais une liste déroulante à choix multiples)

Eléphant du PHP | 51 Messages

09 juin 2009, 09:38

Autre question qui me vient...

Dans ma base, dans la table clients, j'ai un champ nb_Clients. J'aimerai que lorsque j'ajoute un client, cela ajoute un client à Nb_Clients, sachant que les deux tables ont en commun Num_Dep, cela devrait être possible?

Avatar du membre
ViPHP
ViPHP | 3008 Messages

09 juin 2009, 09:42

Je n'ai pas entièrement suivi ce qui concerne tes tables, mais ce n'est pas juste un INSERT dont tu parles là ?

Eléphant du PHP | 51 Messages

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

Avatar du membre
ViPHP
ViPHP | 3008 Messages

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

Eléphant du PHP | 51 Messages

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

Avatar du membre
ViPHP
ViPHP | 3008 Messages

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

Eléphant du PHP | 51 Messages

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'] : '' ?>"

Avatar du membre
ViPHP
ViPHP | 3008 Messages

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.

Eléphant du PHP | 51 Messages

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