Enregistrement partiel dans la base

Eléphant du PHP | 179 Messages

04 août 2005, 14:02

Re-bonjour à tous.

J'ai décidément la fâcheuse habitude comme Pénélope et son bout de tissu de faire le jour et de défaire la nuit. J'ai des problèmes résolus qui ressurgissent et comme demain j'ai des comptes à rendre, la situation devient délicate. 8-[

J'ai une interface administrateur où je suis censée faire un enregistrement dans ma table "sociétés".

Tout se passe bien pendant l'enregistrement sauf la "Spécialité". Elle se caractérise par un "select name".

Notez que lorsque je veux modifier le champ "Type de bases" de ma table "Produits" (select name également), ça ne s'enregistre pas non plus.

Je suppose que le problème est le même dans les deux cas.

Voici mon code pour le premier exemple:

1. Le formulaire d'entrée des données
<form action="b_produits_add2.php" method="post">

<table>
<tr>
<td><h4>Nom du produit : </h4></td> 
<td><input type="text" name="NomProduit" size=60></td>
</tr>


<tr>
<td><h4>Nom de la société : </h4></td>
<td><select name="IdSociete">
<option value="">

<?
#Relation à la table societes#
$lien = mysql_connect("xx","xx","xx");
mysql_select_db("xx", $lien);
$requete="SELECT * FROM societes";
$result=mysql_query($requete);
while ($val=mysql_fetch_array($result)){
	print ('<option value="'.$val["IdSociete"].'">');
	print ($val["NomSociete"]);	
}mysql_close($lien);
?>
</option></select></td></tr>

<tr>
<td><h4> Disciplines des bases : </h4></td>

<td><select name="DisciplinesBases">	
	<option value="Chimie">Chimie</option>
	<option value="Economie et gestion">Economie et gestion</option>
	<option value="Mathématiques">Mathématiques</option>
	<option value="Multidisciplinaire">Multidisciplinaire</option>
	<option value="Physique">Physique</option>
	<option value="Sciences appliquées">Sciences appliquées</option>
	<option value="Sciences biologiques">Sciences biologiques</option>
	<option value="Sciences humaines">Sciences humaines</option>
	<option value="Sciences médicales">Sciences médicales</option>
	<option value="Sciences sociales">Sciences sociales</option>
	<option value="Sciences de la terre">Sciences de la terre</option>
	<option value="Sciences de l\'environnement">Sciences de l'environnement</option>
	<option value="Sciences de l\'information et de l\éducation">Sciences de l'information et de l'éducation</option>
</select></td></tr>


<tr>
<td><h4> Types de bases : </h4></td>
<td><select name="TypeBases">	
	<option value="Base de données bibliographiques">Base de données bibliographiques</option>
	<option value="Base de données d\'images et/ou de sons">Bases de données d'images et/ou de sons</option>
	<option value="Base de données factuelles et/ou numériques">Bases de données factuelles et/ou numériques</option>
	<option value="Base de données de sommaires">Bases de données de sommaires</option>	
	<option value="Base de données textuelles (en texte intégral)">Bases de données textuelles (en texte intégral)</option>
</select></td></tr>

<tr>
<td><h4> Type d'accès au produit : </h4></td>
<td><select name="TypeAcces">	
	<option value="Accès libre">Accès libre</option>
	<option value="Reconnaissance IP">Reconnaissance IP</option>
	<option value="Reconnaissance identifiant et mot de passe">Reconnaissance identifiant et mot de passe</option>
</select></td></tr>


<tr>
<td><h4> Présentation : </h4></td>
<td><textarea name="Presentation" rows="8" cols="45"></textarea></td>
</tr>


<tr>
<td><h4> Type de recherche : </h4></td>
<td><select name="TypeRecherche">	
	<option value="Recherche gratuite">Recherche gratuite</option>
	<option value="Recherche payante">Recherche payante</option>
</select></td></tr><br>


<tr>
<td><h4> Site : </h4></td>
<td><input type="text" name="Site" size=60></td>
</tr>
</table>

<br><center><input type="submit" value="Enregistrer"></center>
</form>
Voici la page de traitement des données:
<html><body>
<style type="text/css">
  body { margin-left:80px; }
</style>
<?
#recupération des données#
$NomProduit = $_POST['NomProduit'];
$IdSociete = $_POST['IdSociete'];
$DisciplinesBases = $_POST['DisciplinesBases'];
$TypeBases = $_POST['TypeBases'];
$TypeAcces = $_POST['TypeAcces'];
$Presentation = $_POST['Presentation'];
$TypeRecherche = $_POST['TypeRecherche'];
$Site=$_POST['Site'];

if(!$NomProduit)
{
	print("<h3><center>Veuillez donner un nom</center>");
} 
else 
{
	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);
	
	$requete = "INSERT INTO produits VALUES('', '$NomProduit','$IdSociete','$DisciplinesBases',
	'$TypeBases','$TypeAcces','$Presentation','$TypeRecherche','$Site')";
	$result = mysql_query($requete) or die('Il y a eu une erreur : <strong>' . mysql_error() . '</strong><br>Dans : <br>' . $requete);
	print ("<h3><center>Le produit a été enregistré</center><h3>");
}
mysql_close($lien);
?>
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 14:06

débuggage :

- vérification du code source de la liste déroulante pour voir si les "value" sont bien renseignées
- affichage des variables du formulaire pour voir si elles sont bien transmises
- affichage du code SQL de la requête pour voir s'il n'y a rien qui choque, et éventullement pour voir l'exécuter directement dans phpMyAdmin
- affcihage des éventuelles erreurs MySQL, qui sont bien pratiques pour situer le problème :
mysql_query($requete) or die(mysql_error());
comme ce dernier point est déjà fait : y'a-t'il une erreur ?

avec ça, on aura déjà plus d'infos pour t'aider, et peut-être même que tu t'en sortiras toute seule ;)

une première remarque : les balises <option> de la liste déroulante ne sont pas fermées

Eléphant du PHP | 147 Messages

04 août 2005, 14:09

Je vais peut etre dire une conerie mais je sais pas si c'est utile de mettre value="..." dans tes liste deroulante car a mon avis la value tu la retrouve entre les balises <option></option>

Autre chose que j'ai vu après avoir envoyé le message la balise option sont ouvete avant le while (pas bon a mon avis) puis ouvert dans le while (corect) puis fermé apres le while alors que cela devrai etre fermé dans le while
Modifié en dernier par NoNos le 04 août 2005, 14:12, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 14:11

Je vais peut etre dire une conerie mais je sais pas si c'est utile de mettre value="..." dans tes liste deroulante car a mon avis la value tu la retrouve entre les balises <option></option>
généralement, on affiche entre les balises un nom, un libellé, quelque chose de lisible par un humain
et on manipule plutôt un code, un identifiant, d'où l'intéreêt de l'attribut value

c'est le cas ici pour société ;)

maintenant c'est vrai que pour les autres ça se retrouvent, mais je conseillerai plutôt d'utilser quelquechose de plus facilement manipulable dans l'attribut value (un identifiant par exemple)

Eléphant du PHP | 147 Messages

04 août 2005, 14:14

Ok

J'ai dis sa car j'avais une liste deroulante sur mon site qui marché très bien sans value c'est tout

Eléphant du PHP | 179 Messages

04 août 2005, 14:29

débuggage :

- vérification du code source de la liste déroulante pour voir si les "value" sont bien renseignées
J'ai vérifié et j'ai même comparé avec d'autres scripts qui fonctionnent.
- affichage des variables du formulaire pour voir si elles sont bien transmises
Il y a une méthode particulière (requête?) pour ça?
- affichage du code SQL de la requête pour voir s'il n'y a rien qui choque, et éventullement pour voir l'exécuter directement dans phpMyAdmin
J'ai fait un enregistrement directement dans la base: et ça fonctionne. Donc le souci se pose avec les scripts.

- affcihage des éventuelles erreurs MySQL, qui sont bien pratiques pour situer le problème :
mysql_query($requete) or die(mysql_error());
comme ce dernier point est déjà fait : y'a-t'il une erreur ?
Non il n'y a pas d'erreur, d'où mon coup de blues :(
avec ça, on aura déjà plus d'infos pour t'aider, et peut-être même que tu t'en sortiras toute seule ;)

une première remarque : les balises <option> de la liste déroulante ne sont pas fermées


Pourtant il me semblait les avoir toutes observées attentivement en me disant que l'erreur venait probablement de là...
Autre chose que j'ai vu après avoir envoyé le message la balise option sont ouvete avant le while (pas bon a mon avis) puis ouvert dans le while (corect) puis fermé apres le while alors que cela devrai etre fermé dans le while
Ca fonctionne sur mes autres scripts... :?:
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 14:46

NoNos a raison, fais ça plus clairement :
<td>
	<select name="IdSociete">
	<?
	#Relation à la table societes#
	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);
	$requete="SELECT * FROM societes";
	$result=mysql_query($requete);
	while ($val=mysql_fetch_array($result)){
	    print ('<option value="'.$val["IdSociete"].'">');
	    print ($val["NomSociete"]);
	    print ('</option>');
	}
	mysql_close($lien);
	?>
	</select>
pour info : si la balise option n'a pas d'attribut "value", c'est effectivement la valeur entre les balises qui sera transmise

pour afficher les variables du formulaire : echo $_POST ['variable']

et afficher le code SQL crée mettra peut-être à jour un problème

Invité
Invité n'ayant pas de compte PHPfrance

04 août 2005, 15:55

J'ai compris pourquoi je ne détecte pas d'erreur dans ce que je vous ai envoyé: je suis tellement épuisée que je ne vous ai pas envoyé les bons scripts. :oops: Je m'excuse platement.

Ceci dit je prends en compte vos remarques précédentes.
Donc je reprends: lorsque j'enregistre: pas de problème. Lorsque je modifie le "Type de bases de données" ne s'enregistre plus. D'où un problème dans les pages de modification et non d'enregistrement.

J'ai tout repassé au crible, j'ai apporté les modifications en fonction de ce que nous avons fait précédemment.

1. Liste des enregistrements à sélectionner
<h3>Choisir le produit à modifier :</h3>


<form action="b_produits_mod2.php" method="post">
<select name="IdProduit">
<?

$lien = mysql_connect("localhost","admin","JPLsin05");
mysql_select_db("sinbad", $lien);
$requete = "SELECT * FROM produits ORDER BY NomProduit";
$result = mysql_query($requete);
while($val = mysql_fetch_array($result)){
	print('<option value='.$val["IdProduit"].'>');
	print($val["NomProduit"]." ");
	print ('</option>');
}
mysql_close($lien);
?>
</select>
<input type="submit" value="Afficher">
</form>
2. Une fois sélectionnée, affichage des données à modifier et modification:

REMARQUE: J'ai un souci pour afficher les noms de sociétés sous forme de liste déroulante car j'ai profondément modifié le script.
<?php 
#recupération des données
$IdProduit = $_POST['IdProduit'];
?>

<form action="b_produits_mod3.php" method="post">
<input type="hidden" name="IdProduit" value="<?php echo $IdProduit;?>">

<?php 
#connection à la base#
$lien = mysql_connect("xx","xx","xx");
mysql_select_db("xx", $lien);

#affichage table produits: première partie#
$requete="SELECT IdProduit, NomProduit, NomSociete, DisciplinesBases, TypeBases, TypeAcces, p.Presentation, TypeRecherche, Site 
FROM produits p, societes s WHERE p.RefSociete=s.IdSociete";
$result=mysql_query($requete);
$val=mysql_fetch_array($result)or die(mysql_error());
mysql_close($lien);
?>

<table>
<tr>
<td><h4>Nom du produit : </h4></td>
<td><?php echo '<input type="text" size=60 name="NomProduit" value="'.$val["NomProduit"].'">';?></td>
</tr>

<tr>
<td><h4>Société d'appartenance : </h4></td>
<td>print ('<option value='.$val2["IdSociete"]);
    <?php if ($val2["IdSociete"] == $val["RefSociete"]) { 
		print (' selected');
		print ('>'.$val2["NomSociete"]."\n");</td>
		}?>
</tr>

<tr>
<td><h4>Disciplines des bases : </h4></td>
<td> <select name="DisciplinesBases">	
	<option value="Chimie">Chimie</option>
	<option value="Economie et gestion">Economie et gestion</option>
	<option value="Mathématiques">Mathématiques</option>
	<option value="Multidisciplinaire">Multidisciplinaire</option>
	<option value="Physique">Physique</option>
	<option value="Sciences appliquées">Sciences appliquées</option>
	<option value="Sciences biologiques">Sciences biologiques</option>
	<option value="Sciences humaines">Sciences humaines</option>
	<option value="Sciences médicales">Sciences médicales</option>
	<option value="Sciences sociales">Sciences sociales</option>
	<option value="Sciences de la terre">Sciences de la terre</option>
	<option value="Sciences de l\'environnement">Sciences de l'environnement</option>
	<option value="Sciences de l\'information et de l\éducation">Sciences de l'information et de l'éducation</option>
</select></td>
</tr>

<tr>
<td><h4>Types de bases : </h4></td>
<td> <select name="TypeBases">	
	<option value="Bases de données bibliographiques">Base de données bibliographiques</option>
	<option value="Bases de données d'images et/ou de sons">Bases de données d'images et/ou de sons</option>
	<option value="Bases de données factuelles et/ou numériques">Bases de données factuelles et/ou numériques</option>
	<option value="Bases de données de sommaires">Bases de données de sommaires</option>	
	<option value="Bases de données textuelles (en texte intégral)">Bases de données textuelles (en texte intégral)</option>
</select></td>
</tr>

<tr>
<td><h4>Type d'accès au produit : </h4></td>
<td><select name="TypeAcces">	
	<option value="Accès libre">Accès libre</option>
	<option value="Reconnaissance IP">Reconnaissance IP</option>
	<option value="Reconnaissance identifiant et mot de passe">Reconnaissance identifiant et mot de passe</option>
</select></td>
</tr>

<?php $Presentation = mysql_result($result,0,'Presentation');?>
<tr>
<td><h4>Présentation : </h4></td>
<td><textarea name="Presentation" rows="8" cols="45"><? echo $Presentation;?></textarea></td>
</tr>

<tr>
<td><h4>Type de recherche : </h4></td>
<td><select name="TypeRecherche">	
	<option value="Recherche gratuite">Recherche gratuite</option>
	<option value="Recherche payante">Recherche payante</option>
</select></td>
</tr>

<tr>
<td><h4>Site : </h4></td>
<td><?php echo '<input type="text" name="Site" value="'.$val["Site"].'">';?></td>
</tr>

</table>

<br><br><center><input type="submit" value="Modifier"></center>
</form>
3. Enregistrement de la modification
<?
#recupération des données#
$IdSociete = $_POST['IdSociete'];
$NomSociete = $_POST['NomSociete'];
$AutreNomSociete = $_POST['AutreNomSociete'];
$IdGroupe = $_POST['IdGroupe'];
$Specialite = $_POST['Specialite'];
$Presentation = $_POST['Presentation'];
$InfCompl = $_POST['InfCompl'];
$PaysOrigine = $_POST['PaysOrigine'];
$Adresse = $_POST['Adresse'];
$Tel = $_POST['Tel'];
$Fax = $_POST['Fax'];
$SiteSociete = $_POST['SiteSociete'];
$NomReprFr = $_POST['NomReprFr'];
$AdresseReprFr= $_POST['AdresseReprFr'];
$TelReprFr = $_POST['TelReprFr'];
$FaxReprFr = $_POST['FaxReprFr'];


if(!$NomSociete){
	print("<h3><center>Vous n'avez pas rempli le champ nom</h3></center>");
} else {
	$lien = mysql_connect("xx","xx","xx");
	mysql_select_db("xx", $lien);
	$requete="UPDATE societes SET
NomSociete='$NomSociete',
AutreNomSociete='$AutreNomSociete',
RefGroupe='$IdGroupe',
Specialite='$Specialite',
Presentation='$Presentation',
InfCompl='$InfCompl',
PaysOrigine='$PaysOrigine',
Adresse='$Adresse',
Tel='$Tel',
Fax='$Fax',
SiteSociete='$SiteSociete',
NomReprFr='$NomReprFr',
AdresseReprFr='$AdresseReprFr',
TelReprFr='$TelReprFr',
FaxReprFr='$FaxReprFr'
	WHERE IdSociete='$IdSociete'";

$result=mysql_query($requete) or die('Il y a eu une erreur : <strong>' . mysql_error() . '</strong><br>Dans : <br>' . $requete);
	print ("<h2><center>La société a été modifiée </center></h2>");
	}
mysql_close($lien);
?>
4. Tout est modifié SAUF le type de bases de données (il s'affiche vide)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 16:07

je ne vois pas de $_POST['TypeBases'] récupéré dans le dernier fichier

Eléphant du PHP | 179 Messages

04 août 2005, 16:10

Voilà, encore une erreur. Pourtant j'ai fait attention... Je crois que je vais faire un tour un quart d'heure et puis je reviendrai parce que là je fais n'importe quoi.
<?
#recupération des données#
$IdProduit = $_POST['IdProduit'];
$NomProduit = $_POST['NomProduit'];
$IdSociete = $_POST['IdSociete'];
$DisciplinesBases = $_POST['DisciplinesBases'];
$TypeBases = $_POST['TypeBases'];
$TypeAcces = $_POST['TypeAcces'];
$Presentation = $_POST['Presentation'];
$TypeRecherche = $_POST['TypeRecherche'];
$Site = $_POST['Site'];


if(!$NomProduit){
	print("<h3><center>Vous n'avez pas rempli le champ nom</h3></center>");
} else {
	$lien = mysql_connect("localhost","admin","JPLsin05");
	mysql_select_db("sinbad", $lien);
	$requete="UPDATE produits SET 
NomProduit='$NomProduit',
RefSociete='$IdSociete',
DisciplinesBases='$DisciplinesBases',
TypeBases='$TypeBases',
TypeAcces='$TypeAcces',
Presentation='$Presentation',
TypeRecherche='$TypeRecherche',
Site='$Site' 
	WHERE IdProduit='$IdProduit'";
	$result=mysql_query($requete) or die('Il y a eu une erreur : <strong>' . mysql_error() . '</strong><br>Dans : <br>' . $requete);
	print ("<h2><center>Le produit a été modifié</center></h2>");
	mysql_close($lien);
}
?>
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

04 août 2005, 16:24

quelques idées pour débugger :
<?
#recupération des données#
$IdProduit = $_POST['IdProduit'];
$NomProduit = $_POST['NomProduit'];
$IdSociete = $_POST['IdSociete'];
$DisciplinesBases = $_POST['DisciplinesBases'];
$TypeBases = $_POST['TypeBases'];
$TypeAcces = $_POST['TypeAcces'];
$Presentation = $_POST['Presentation'];
$TypeRecherche = $_POST['TypeRecherche'];
$Site = $_POST['Site'];

// va afficher toutes tes variables POST facilement
echo '<pre>';
print_r($_POST);
echo '</pre>';

if(!$NomProduit){
    print("<h3><center>Vous n'avez pas rempli le champ nom</h3></center>");
} else {
    $lien = mysql_connect("localhost","admin","JPLsin05");
    mysql_select_db("sinbad", $lien);
    $requete="UPDATE produits SET
				NomProduit='".$NomProduit."',
				RefSociete='".$IdSociete."',
				DisciplinesBases='".$DisciplinesBases."',
				TypeBases='".$TypeBases."',
				TypeAcces='".$TypeAcces."',
				Presentation='".$Presentation."',
				TypeRecherche='".$TypeRecherche."',
				Site='".$Site."'
		    	WHERE IdProduit=".$IdProduit;
	// affichage du code SQL généré pour contrôler
	echo "requête exécutée : ".$requete."<br>";
    $result=mysql_query($requete) or die('Il y a eu une erreur : <strong>' . mysql_error() . '</strong><br>Dans : <br>' . $requete);
    print ("<h2><center>Le produit a été modifié</center></h2>");
    mysql_close($lien);
}
?>
Bonne idée d'aller faire un tour ;)

Eléphant du PHP | 179 Messages

04 août 2005, 17:47

Il ne me détecte rien du tout :( Le seul souci, c'est ce que je pointais un peu au-dessus pour la modification du nom de la société à laquelle appartient le produit.
Notice: Undefined index: IdSociete in c:\program files\easyphp1-8\www\sinbad\admin\produits\b_produits_mod3.php on line 11

Array
(
[IdProduit] => 1
[NomProduit] => Essai
[DisciplinesBases] => Chimie
[TypeBases] => Bases de données bibliographiques
[TypeAcces] => Accès libre
[Presentation] => Nouvel essai
[TypeRecherche] => Recherche gratuite
[Site] =>
)

requête exécutée : UPDATE produits SET NomProduit='Essai', RefSociete='', DisciplinesBases='Chimie', TypeBases='Bases de données bibliographiques', TypeAcces='Accès libre', Presentation='Nouvel essai', TypeRecherche='Recherche gratuite', Site='' WHERE IdProduit='1'
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

ViPHP
pjl
ViPHP | 2119 Messages

04 août 2005, 18:21

Question comme ca :
cette données "Bases de données factuelles et/ou numériques", tu comptes la répéter combien de fois dans ta table produits ?

Eléphant du PHP | 179 Messages

04 août 2005, 18:28

C'est un menu déroulant: on la répète donc tant qu'on veut...
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

ViPHP
pjl
ViPHP | 2119 Messages

04 août 2005, 18:30

Je parlais de données contenues dans ta base de données.
Ca n'a rien à voir avec un nenu déroulant.