Construction BDD et recuperation formulaire

Eléphant du PHP | 287 Messages

13 mai 2009, 09:41

Bonjour à tous !
Problème:
Création d'un formulaire d'inscription avec cases à cocher
<form method="post" enctype="multipart/form-data" action="recup_donnee.php">
Nom :<input type="text" name="nom_etab" size="40" value="" maxlength="70"><br>
Texte :<textarea name="texte_etab" cols="40"></textarea><br>
Pictos :<?php
$db=mysql_connect('localhost', 'root', '') or die('Erreur de connexion '.mysql_error());
mysql_select_db('test_picto',$db);
$picto = "SELECT id_picto, nom_picto, image_picto FROM picto";
$result = mysql_query($picto);
while ($row = mysql_fetch_assoc($result)) {
echo '<input type="checkbox" name="picto[]" value="' . $row['id_picto'] . '"/>
<img src="picto/' . $row['image_picto'] . '">';
}
?><br>
<input type="submit" name="upload" value="Envoyer">
</form>
Page de traitement :
<?php 
// On commence par récupérer les champs 
if(isset($_POST['nom_etab']))      $etab=$_POST['nom_etab'];
else      $etab="";

if(isset($_POST['texte_etab']))      $texte=$_POST['texte_etab'];
else      $texte="";

// On vérifie si les champs sont vides 
if(empty($etab) OR empty($texte)) 
    { 
    echo '<font color="red">Aucun champ ne doit rester vide !</font>'; 
    }

// On efface tout
$sql = "DELETE FROM liaison id_etab WHERE id_etab =" . $id_etab;
 
// on ré-ecrit
if (isset($_POST['picto'])) {
   foreach ($_POST['picto'] as $id_picto) {
       $sql = "INSERT INTO liaison (id_etab, id_picto) VALUES (id_etab, intval($id_picto))";
   }
}

// Aucun champ n'est vide, on peut enregistrer dans la table 
$db = mysql_connect('localhost', 'root', '')  or die('Erreur de connexion '.mysql_error());
// sélection de la base  

mysql_select_db('test_picto',$db)  or die('Erreur de selection '.mysql_error()); 
     
// on écrit la requête sql 
$sql = "INSERT INTO etab(id_etab,etab,texte) VALUES('".mysql_real_escape_string('')."','".mysql_real_escape_string($etab)."','".mysql_real_escape_string($texte)."')";
     
// on insère les informations du formulaire dans la table 
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 

// On récupère l'id_etab qui vient d'être généré 
$id_etab = mysql_insert_id(); 

// Ci-dessous on insère les infos dans liaison 
$sql = "INSERT INTO liaison(id_liaison, id_etab, id_picto) VALUES('','$id_etab','$id_picto')"; 
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
     
// On insère les informations du formulaire dans la table 
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 

// On affiche le résultat pour le visiteur 
        echo "<br />";
        echo 'Votre Etablissement a été enregistré avec succés !';
        echo "<br />"; 

    mysql_close();  // on ferme la connexion 
?>
Mon souci, c'est mes établissement s'enregistrent 2 fois dans ma base de liaison entre pictos et etab.
Quant aux picos, ce n'est pas le l'id du picto qu s'enrgistre, mais le nombre de pictos cochés dans le formulaire.
Si vous avez une solution, parce que je galère depuis des jours la-dessus et ça m'énerve !!!!

Eléphant du PHP | 353 Messages

13 mai 2009, 10:24

Bonjour.
Je vais tenter de t'aider à solutionner ton problèmes.

Les pictos

Concernant l'enregistrement des pictos, regardons d'abord ton code html.
Tu utilises ceci :

Code : Tout sélectionner

echo '<input type="checkbox" name="picto[]" value="' . $row['id_picto'] . '"/>
Ce qui se traduira, une fois ton formulaire validé, par un tableau $_POST du style :

Code : Tout sélectionner

Array ( [0] => a [1] => b [2] => e );
A première vue (et j'ai bien dit à première vue) cela devrait fonctionner si tu fais ceci :
// on ré-ecrit
if (isset($_POST['picto'])) {
   foreach ($_POST['picto'] as $key => $id_picto) {
       $sql = "INSERT INTO liaison (id_etab, id_picto) VALUES (id_etab, '".intval($id_picto))."'";
   }
} 

Tes requêtes

Il me semble quelque peu bizzare que tu faces des

Code : Tout sélectionner

$sql = "...";
en chaine, pour seulement exécuter tes requêtes à la fin.
Tu es sur du code que tu nous a mis? si oui, il y a un soucis car à chaque fois tu surcharges ta requêtes.

Il faudrait plutôt faire ceci:
<?php 
// On commence par récupérer les champs 
if(isset($_POST['nom_etab']))      $etab=$_POST['nom_etab'];
else      $etab="";

if(isset($_POST['texte_etab']))      $texte=$_POST['texte_etab'];
else      $texte="";

// On vérifie si les champs sont vides 
if(empty($etab) OR empty($texte)) 
    { 
    echo '<font color="red">Aucun champ ne doit rester vide !</font>'; 
    }
	

// Aucun champ n'est vide, on peut enregistrer dans la table 
$db = mysql_connect('localhost', 'root', '')  or die('Erreur de connexion '.mysql_error());
// sélection de la base  
mysql_select_db('test_picto',$db)  or die('Erreur de selection '.mysql_error()); 

// On efface tout
$sql = "DELETE FROM liaison id_etab WHERE id_etab =" . $id_etab;
// on insère les informations du formulaire dans la table 
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); // !!! ICI, pense à éxécuter ta requête ! 
 
// on ré-ecrit
if (isset($_POST['picto'])) {
   foreach ($_POST['picto'] as $key => $id_picto) 
   {
		$sql = "INSERT INTO liaison (id_etab, id_picto) VALUES (id_etab, '".intval($id_picto))."'";
		// !!! ICI, pense à éxécuter ta requête ! 
		mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
   }
}
     
// on écrit la requête sql 
$sql = "INSERT INTO etab(id_etab,etab,texte) VALUES('".mysql_real_escape_string('')."','".mysql_real_escape_string($etab)."','".mysql_real_escape_string($texte)."')";
     
// on insère les informations du formulaire dans la table 
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 

// On récupère l'id_etab qui vient d'être généré 
$id_etab = mysql_insert_id(); 

// Ci-dessous on insère les infos dans liaison 
$sql = "INSERT INTO liaison(id_liaison, id_etab, id_picto) VALUES('','$id_etab','$id_picto')"; 
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
     
// On insère les informations du formulaire dans la table 
//mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 

// On affiche le résultat pour le visiteur 
        echo "<br />";
        echo 'Votre Etablissement a été enregistré avec succés !';
        echo "<br />"; 

    mysql_close();  // on ferme la connexion 
?> 

On récapitule.

- Erreur 1 :
Tu n'exécute pas ta requete de délete
- Erreur 2 :
Tu n'exécute pas tes insert de picto.
- Erreur 3 : Tu fais un second mysql_query($sql) après avoir inséré une premier fois dans "etab", mais sans avoir modifié ta requete.. ce qui fait donc que tu insert 2 fois.


J'espère que cela pourra t'aider.

Eléphant du PHP | 287 Messages

13 mai 2009, 10:36

Salut,
merci de t'intéresser à mon problème !
Comme j'ai utilisé plusieurs tutos, il se peut qu'il y des choses qui s'ajoutent ou autre...
Bref il y a une erreur dans le code
$sql = "INSERT INTO liaison (id_etab, id_picto) VALUES (id_etab, '".intval($id_picto))."'"; 
Il maque une paranthèse quelque part non !!

Eléphant du PHP | 353 Messages

13 mai 2009, 10:39

oui oui.
Au temps pour moi, j'ai oublié de fermer la parenthèse de fin.
il te faut en fait écrire :
$sql = "INSERT INTO liaison (id_etab, id_picto) VALUES (id_etab, '".intval($id_picto))."')";
Voila, cela devrait etre plus simple.

En fait, ton principale problème c'est que tu n'exécutes pas toutes tes requetes.
Du coup, essaye de faire en permanence (pour le moment, une fois que tu auras l'habitude, tu pourras optimiser et modifier à souhait) :
$sql = "ta requête";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
Bref, tu crées ta requête, puis tu l'exécutes.

Eléphant du PHP | 287 Messages

13 mai 2009, 11:13

Euh, il y a un truc qui cloche à cette ligne 30 !!!
Parenthèse ou pas, guillements ou pas j'ai tjs une satanée erreur...

Eléphant du PHP | 60 Messages

13 mai 2009, 15:34

j'ai tjs une satanée erreur...
Oui Romuald mais laquelle d'erreur...laquelle ? #-o
"La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information"
Albert Einstein.

ViPHP
ViPHP | 2291 Messages

13 mai 2009, 15:37

Euh, il y a un truc qui cloche à cette ligne 30 !!!
Parenthèse ou pas, guillements ou pas j'ai tjs une satanée erreur...
Salut,

Comme dirais l'autre à deux sa va , mais a trois il y en a un de trop :)
//TA requête//
$sql = "INSERT INTO liaison (id_etab, id_picto) VALUES (id_etab, '".intval($id_picto))."')";

//Proposition de correction.//

$sql = "INSERT INTO liaison (id_etab, id_picto) VALUES (id_etab, '".intval($id_picto)."')";
Enfin ici c'est une de trop (parenthèse).

Eléphant du PHP | 353 Messages

13 mai 2009, 15:48

En effet dunbar a corrigé l'autre coquille que j'avais laissé.

Mais romuald, par pitié, pense à donner l'erreur qui s'affiche à l'écran.

PHP étant plutôt bien fait, avec un peu d'habitude on comprend vite ce qui cloche.
Pourquoi?
Parce que c'est marqué dans l'erreur :D

Eléphant du PHP | 287 Messages

13 mai 2009, 19:06

Merci de votre aide,
il y a 1 autre erreur :
Notice: Undefined variable: id_etab in recup_donnee.php on line 22
Erreur SQL !DELETE FROM liaison id_etab WHERE id_etab =
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'id_etab WHERE id_etab =' at line 1

ViPHP
ViPHP | 2291 Messages

13 mai 2009, 19:18

Comme ceci je pense que tu n'auras plus d'erreur de syntaxe :wink:
<?php
// On commence par récupérer les champs
$etab = isset($_POST['nom_etab']) ? mysql_real_escape_string($_POST['nom_etab']) : '';
$texte = isset($_POST['texte_etab']) ? mysql_real_escape_string($_POST['texte_etab']) : '';


// On vérifie si les champs sont vides
if (empty($etab) or empty($texte)) {
    echo '<font color="red">Aucun champ ne doit rester vide !</font>';
}


// Aucun champ n'est vide, on peut enregistrer dans la table
$db = mysql_connect('localhost', 'root', '') or die('Erreur de connexion ' .
    mysql_error());
// sélection de la base
mysql_select_db('test_picto', $db) or die('Erreur de selection ' . mysql_error());

// On efface tout
$sql = "DELETE FROM liaison id_etab WHERE id_etab ='" . $id_etab . "'";
		// on insère les informations du formulaire dans la table
		mysql_query($sql) or die('Erreur SQL !' . $sql . '<br>' . mysql_error()); // !!! ICI, pense à éxécuter ta requête !

// on ré-ecrit
if (isset($_POST['picto'])) {
    foreach ($_POST['picto'] as $key => $id_picto)
     {
        $sql = "INSERT INTO liaison (id_etab, id_picto) VALUES (id_etab, '" . intval($id_picto) . "')";
        // !!! ICI, pense à éxécuter ta requête !
        mysql_query($sql) or die('Erreur SQL !' . $sql . '<br>' . mysql_error());
    }
}

// on écrit la requête sql
$sql = "INSERT INTO etab(id_etab,etab,texte) VALUES( '','" . $etab . "','" . $texte . "')";
	    // on insère les informations du formulaire dans la table
		mysql_query($sql) or die('Erreur SQL !' . $sql . '<br>' . mysql_error());



// On récupère l'id_etab qui vient d'être généré
$id_etab = mysql_insert_id();

// Ci-dessous on insère les infos dans liaison
$sql = "INSERT INTO liaison(id_liaison, id_etab, id_picto) VALUES('','" . $id_etab . "','" . $id_picto . "')";
        mysql_query($sql) or die('Erreur SQL !' . $sql . '<br>' . mysql_error());


// On insère les informations du formulaire dans la table
//mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());

// On affiche le résultat pour le visiteur
echo "<br />";
echo 'Votre Etablissement a été enregistré avec succés !';
echo "<br />";

mysql_close(); // on ferme la connexion

?>
Par contre ton DELETE ne va pas fonctionner je pense tu utilise une $variable que tu crée après ta requête, va falloir faire différament.

Eléphant du PHP | 287 Messages

13 mai 2009, 19:41

Je vais étudier ça demain
Merci pour ton aide, mais j'ai d'autres erreurs apparement

Eléphant du PHP | 287 Messages

19 mai 2009, 09:27

Bonjour,
Tjs des problèmes...
J'ai modifié le début du code :
if(isset($_POST['nom_etab'])) $etab=$_POST['nom_etab'];
else      $etab="";

if(isset($_POST['texte_tab'])) $etab=$_POST['texte_etab'];
else      $texte="";