recupérer variable d'un formulaire

Eléphant du PHP | 186 Messages

01 mars 2007, 15:30

Bonjour à tous.
Je me retourne vers vous car j'ai quelques soucis à faire ce que j'ai envie.
J'ai réalisé un formulaire qui s'adresse à plusieurs type d'annonceur. Comme je ne souhaite pas multiplier le nombre de formulaire en fonction du type d'annonceur, je fait en sorte qu'il soit compatible pour tous. C'est pourquoi, pour certains données qui sont spécifiques à un type d'annonceur, je voudrais mettre des conditions if et notamment pour la partie du formulaire qui va enregistrer les informations directement dans ma base de données.
Par exemple si type = camping alors mettre infos dans table camping et si type = hotel alors mettre info dans table hotel.
voici ce que donne mon code pour la partie insertion des données dans la base:
$query_inserer_fiche_annonceur = "INSERT INTO tbl_etab(etab_id, type_etab, login_client, nom_etab, adresse_etab, ville_etab, cp_etab, mod_date, active) VALUES 
('".$_POST['id_etab']."',
'".$_POST['type_etab']."',
'".$_POST['login_client']."',
'".$_POST['nom_etab']."',
'".$_POST['adresse_etab']."',
'".$_POST['ville_etab']."',
'".$_POST['cp_etab']."',
'".$_POST['date_ouverture']."',
'".$date."',
'".$_POST['active']."');";
$inserer_fiche_annonceur = mysql_query($query_inserer_fiche_annonceur) or die(mysql_error());

if (($_POST['type_etab']) == "camping") {
$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_camping(id_etab) VALUES 
('".$_POST['id_etab']."');";
} else {
	if (($_POST['type_etab']) == "hotel") {
	$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_hotel(id_etab) VALUES 
	('".$_POST['id_etab']."');";
	} else {
		if (($_POST['type_etab']) == "auberge") {
		$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_auberge(id_etab) VALUES 
		('".$_POST['id_etab']."');";
		} else {
			if (($_POST['type_etab']) == "chambrehote") {
			$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_chambrehote(id_etab) VALUES 
			('".$_POST['id_etab']."');";
			} else {
				if (($_POST['type_etab']) == "gite") {
				$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_gite(id_etab) VALUES 
				('".$_POST['id_etab']."');";
						}
					}
				}
			}
		}
où la requete inserer_fiche_annonceur va renseigner les informations communes à tous les types d'annonceur dans une table adéquate et où la requete inserer_fiche_annonceur2 correspond quant à elle à certaines données spécifiques qui devront être mises dans une table correspondant au type.
Lorsque je pose la condition if $_POST['type_etab'] ca ne marche pas.
Est-ce que le POST n'a encore pas de valeur ou c'est autre chose qui ne fonctionne pas?
Si quelqu'un à une idée. Merci

Mammouth du PHP | 693 Messages

01 mars 2007, 16:17

Déjà, je te conseille de remplacer tous les else{if...} par elseif{...}

Ensuite,je te conseil de remplacer tout ca
if (($_POST['type_etab']) == "camping") { 
$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_camping(id_etab) VALUES  
('".$_POST['id_etab']."');"; 
} else { 
    if (($_POST['type_etab']) == "hotel") { 
    $query_inserer_fiche_annonceur2 = "INSERT INTO tbl_hotel(id_etab) VALUES  
    ('".$_POST['id_etab']."');"; 
    } else { 
        if (($_POST['type_etab']) == "auberge") { 
        $query_inserer_fiche_annonceur2 = "INSERT INTO tbl_auberge(id_etab) VALUES  
        ('".$_POST['id_etab']."');"; 
        } else { 
            if (($_POST['type_etab']) == "chambrehote") { 
            $query_inserer_fiche_annonceur2 = "INSERT INTO tbl_chambrehote(id_etab) VALUES  
            ('".$_POST['id_etab']."');"; 
            } else { 
                if (($_POST['type_etab']) == "gite") { 
                $query_inserer_fiche_annonceur2 = "INSERT INTO tbl_gite(id_etab) VALUES  
                ('".$_POST['id_etab']."');"; 
                        } 
                    } 
                } 
            } 
        }
Par
$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_{$_POST['type_etab'](id_etab) VALUES  
                ('".$_POST['id_etab']."');"; 
Enfin, pour vérifier que les variables sont défnie, je te conseille d'utiliser foreach()

Eléphant du PHP | 186 Messages

01 mars 2007, 16:32

Effectivement, ca peut alléger le code mais je suis pas sur de ta synthaxe quand tu met
$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_{$_POST['type_etab'](id_etab) VALUES  
                ('".$_POST['id_etab']."');";
Ca ne serait pas plutôt:
$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_".$_POST['type_etab']."(id_etab) VALUES  
                ('".$_POST['id_etab']."');";
Qui plus est, il se peut que cette requête ne s'applique pas à tous les cas.
Par exemple, si $_POST['type_etab'] est égal à "truc" et que je n'ai pas la table "truc" dans ma bd, ca risque de provoquer quelques erreurs, non?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 mars 2007, 16:33

Plutôt que des elseif{...} j'aurais suggéré un switch, mais de toute façon, changer le nom de la table dans la requête de façon dynamique me semble la meilleur solution puisque les noms correspondent :)

Juste penser à sortir les variables, et ne pas mettre le ";" final dans la requête sql (laisser ce soin à l'interpréteur, s'il estime en avoir besoin :)) Ah, et pis ne pas mettre d'apostrophe autour des nombres en SQL (c'est uniquement pour les chaines : varchar, date, etc.)
$query = "INSERT INTO tbl_".$_POST['type_etab']." (id_etab) 
  VALUES (".$_POST['id_etab'].")";
Enfin, pour vérifier que les variables sont défnie, je te conseille d'utiliser foreach()
Euh..... isSet() plutôt nan ? :)

Lorsque je pose la condition if $_POST['type_etab'] ca ne marche pas.
Est-ce que le POST n'a encore pas de valeur ou c'est autre chose qui ne fonctionne pas?
Un simple echo $_POST['type_etab'] te donnerais immédiatement la réponse à cette question ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 186 Messages

01 mars 2007, 17:00

J'ai fait un echo de la variable et ca me met toujours le même message à savoir : Column count doesn't match value count at row 1

et pas de trace de mon echo.
Pourtant, je récupère la même variable que celle qiu va remplir ma base de donnée, à savoir le code suivant:
$query_inserer_fiche_annonceur = "INSERT INTO tbl_etab(etab_id, type_etab, login_client, nom_etab, adresse_etab, ville_etab, cp_etab, mod_date, active) VALUES 
('".$_POST['id_etab']."',
'".$_POST['type_etab']."', //  ici
'".$_POST['login_client']."',
'".$_POST['nom_etab']."',
'".$_POST['adresse_etab']."',
'".$_POST['ville_etab']."',
'".$_POST['cp_etab']."',
'".$_POST['date_ouverture']."',
'".$date."',
'".$_POST['active']."');";
$inserer_fiche_annonceur = mysql_query($query_inserer_fiche_annonceur) or die(mysql_error());
Donc je ne comprend pas pourquoi je ne peut pas me resservir de $_POST['type_etab'].

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 mars 2007, 17:05

ah ben oui mais si tu parles pas des messages d'erreur aussi :)

"Column count doesn't match value count at row 1" => Le nombre de colonnes ne correspond pas aux nombre de valeurs que tu essayes d'insérer :

(etab_id, type_etab, login_client, nom_etab, adresse_etab, ville_etab, cp_etab, mod_date, active) => 9 colonnes

('".$_POST['id_etab']."',
'".$_POST['type_etab']."',
'".$_POST['login_client']."',
'".$_POST['nom_etab']."',
'".$_POST['adresse_etab']."',
'".$_POST['ville_etab']."',
'".$_POST['cp_etab']."',
'".$_POST['date_ouverture']."',
'".$date."',
'".$_POST['active']."')"; => 10 valeurs :)

t'aurais pas une date en trop ? ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 186 Messages

01 mars 2007, 17:20

Désolé pour ne pas l'avoir mis plus tôt.
J'ai aussi repéré cette erreur, j'ai donc viré tout ce qui n'allait pas.
Par contre, si je garde cette synthaxe:
$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_".$_POST['type_etab']."(id_etab) VALUES  
                ('".$_POST['id_etab']."');";
et que "tbl_".$_POST['type_etab'] ne correspond pas à une table de ma bd, il me met que la table n'existe pas.
Et si je passe par cette solution:
 
if (($_POST['type_etab']) == "camping") {
$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_camping(id_etab) VALUES 
('".$_POST['id_etab']."');";
} else {
	if (($_POST['type_etab']) == "hotel") {
	$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_hotel(id_etab) VALUES 
	('".$_POST['id_etab']."');";
	} else {
		if (($_POST['type_etab']) == "auberge") {
		$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_auberge(id_etab) VALUES 
		('".$_POST['id_etab']."');";
		} else {
			if (($_POST['type_etab']) == "chambrehote") {
			$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_chambrehote(id_etab) VALUES 
			('".$_POST['id_etab']."');";
			} else {
				if (($_POST['type_etab']) == "gite") {
				$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_gite(id_etab) VALUES 
				('".$_POST['id_etab']."');";
						}
					}
				}
			}
		}

$inserer_fiche_annonceur2 = mysql_query($query_inserer_fiche_annonceur2) or die(mysql_error());
il me met "query empty" (Là j'ai mis le message d'erreur Ryle :oops:) si la table truc n'existe pas

Eléphant du PHP | 186 Messages

01 mars 2007, 17:40

Ce qui me parait bizzare aussi, c'est que l'enregistrement de la fiche s'effectue bien malgré le message.
De plus, si j'enlève "or die(mysql_error())" du code :
$inserer_fiche_annonceur2 = mysql_query($query_inserer_fiche_annonceur2) or die(mysql_error());
Tout se passe bien en apparence, je retrouve mon enregistrement.
Dois-je laisser les choses en l'état ou cela cache-t'il de futurs problèmes??

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 mars 2007, 17:55

En effet, la solution de nommage dynamique de la table ne fonctionne que si c'est toi qui contrôle les valeurs possible de $_POST['type_etab']. Si l'utilisateur peut le changer ou s'il ne correspond pas au nom de tes tables, c'est pas bon :)

Quant à ton message, c'est une simple alerte pour t'informer de l'erreur. Il te dit juste que l'une des requête n'a pu être exécuté car le nom de la table n'existait pas. Ca ne remet pas en cause le reste du code, mais c'est pas terrible :)

donc au choix, tu peux te faire un tableau avec les noms de tables qui existent et tu vérifies que $_POST['type_etab'] en fait parti avant de jouer le insert, ou bien rester sur le choix des if et dans ce cas, je te recommande un switch :
switch ($_POST['type_etab']) { 
  case "camping" :
    $query = "INSERT INTO tbl_camping(id_etab) VALUES (".$_POST['id_etab'].")"; 
    break;
  case "hotel" :
    $query = "INSERT INTO tbl_hotel(id_etab) VALUES (".$_POST['id_etab'].")"; 
    break;
  case "auberge" :
    $query = "INSERT INTO tbl_auberge(id_etab) VALUES (".$_POST['id_etab'].")"; 
    break;
  case "chambrehote" :
    $query = "INSERT INTO tbl_chambrehote(id_etab) VALUES (".$_POST['id_etab'].")"; 
    break;
  case "gite" : 
    $query = "INSERT INTO tbl_gite(id_etab) VALUES  (".$_POST['id_etab'].")"; 
    break;
  default :
    echo "Pas d'insertion";
    break;
} 
Voire :
switch ($_POST['type_etab']) { 
  case "camping" :
  case "hotel" :
  case "auberge" :
  case "chambrehote" :
  case "gite" : 
    $query = "INSERT INTO tbl_".$_POST['type_etab']." (id_etab) VALUES  (".$_POST['id_etab'].")"; 
    break;
  default :
    echo "Pas d'insertion";
    break;
} 
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 693 Messages

01 mars 2007, 18:10

Effectivement, ca peut alléger le code mais je suis pas sur de ta synthaxe quand tu met
$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_{$_POST['type_etab'](id_etab) VALUES  
                ('".$_POST['id_etab']."');";
Ca ne serait pas plutôt:
$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_".$_POST['type_etab']."(id_etab) VALUES  
                ('".$_POST['id_etab']."');";
Les deux syntaxes sont justes. Les accolades permettent d'insérer une variable dans une chaine de caractère et éviter la concaténation.

Enfin, pour vérifier que les variables sont défnie, je te conseille d'utiliser foreach()
Euh..... isSet() plutôt nan ? :)

Dan l'absolu, oui, mais j'ai l'habitude de regarder mes tableaux avec
foreach($tableau as $key=>$value)
print("$key : $value <br>);

Eléphant du PHP | 186 Messages

01 mars 2007, 18:18

J'ai opté pour ta deuxième solution, à savoir
switch ($_POST['type_etab']) { 
  case "camping" :
  case "hotel" :
  case "auberge" :
  case "chambrehote" :
  case "gite" : 
    $query_inserer_fiche_annonceur2 = "INSERT INTO tbl_".$_POST['type_etab']." (id_etab) VALUES  (".$_POST['id_etab'].")"; 
    break;
  default :
    echo "Pas d'insertion";
    break;
}
$inserer_fiche_annonceur2 = mysql_query($query_inserer_fiche_annonceur2) or die(mysql_error());
Ca m'affiche bien "pas d'insertion" quand la table n'existe pas mais aussi "Query empty" à la suite.
Tout semble pourtant fonctionner convenablement que la table existe ou n'existe pas, l'enregistrement est pris en compte.

Mammouth du PHP | 693 Messages

01 mars 2007, 18:23

C'est normal, tu fait une requete avec une variable non définie.
switch ($_POST['type_etab']) {  
  case "camping" : 
  case "hotel" : 
  case "auberge" : 
  case "chambrehote" : 
  case "gite" :  
    $query_inserer_fiche_annonceur2 = "INSERT INTO tbl_".$_POST['type_etab']." (id_etab) VALUES  (".$_POST['id_etab'].")";  
$inserer_fiche_annonceur2 = mysql_query($query_inserer_fiche_annonceur2) or die(mysql_error());
    break; 
  default : 
    echo "Pas d'insertion"; 
    break; 
} 
Comme ca ca devrait aller.

Eléphant du PHP | 186 Messages

01 mars 2007, 18:40

Effectivement, comme ca "query empty" a disparu mais maintenant il me met ca comme erreur (sans pour autant empêcher l'enregistrement des données):

Pas d'insertion
Warning: Cannot modify header information - headers already sent by (output started at C:\...\insertion-fiche-annonceur-processor.php:64) in C:\...\insertion-fiche-annonceur-processor.php on line 67

Je vous met tout mon code de ma page:
<?php require_once('Connections/conn_develop.php');

mysql_select_db($database_conn_develop, $conn_develop);
//Mise à jour de la base de données
$query_inserer_fiche_annonceur = "INSERT INTO tbl_etab(etab_id, type_etab, login_client, nom_etab, adresse_etab, ville_etab, cp_etab) VALUES 
(".$_POST['id_etab'].",
'".$_POST['type_etab']."',
'".$_POST['login_client']."',
'".$_POST['nom_etab']."',
'".$_POST['adresse_etab']."',
'".$_POST['ville_etab']."',
'".$_POST['cp_etab']."');";
$inserer_fiche_annonceur = mysql_query($query_inserer_fiche_annonceur) or die(mysql_error());


		switch ($_POST['type_etab']) { 
  case "camping" :
  case "hotel" :
  case "auberge" :
  case "chambrehote" :
  case "gite" : 
  		$query_inserer_fiche_annonceur2 = "INSERT INTO tbl_".$_POST['type_etab']." (id_etab) VALUES  (".$_POST['id_etab'].");"; 
  		$inserer_fiche_annonceur2 = mysql_query($query_inserer_fiche_annonceur2) or die(mysql_error());
	break;
  default :
    echo "Pas d'insertion";
    break;
} 
header('Location: index.php');
?>
Je commence à préférer les autres message d'erreur :)

Mammouth du PHP | 693 Messages

01 mars 2007, 18:43

Dans ce cas, il faut supprmier le message : "pas d'insertion"

Les header doivent être envoyé avant tout envoi au navigateur.

Eléphant du PHP | 186 Messages

01 mars 2007, 18:50

Ca marche mieux effectivement.
Plus de problème à l'horizon. Pour le moment...
Je vous remercie tous pour votre aide. C'est vraiment sympa de votre part.
Je m'en vais mettre résolu de ce pas.
Par contre, sans avoir l'air d'abuser et si vous avez un avis, une autre question me taraude, allez jeter un coup d'oeil sur ce post:
http://www.phpfrance.com/forums/voir_sujet-27690.php
vers les derniers posts.
Merci encore.