8792 sujets

Développement web côté serveur, CMS

Bonsoir à tous,

j'ai fait une recherche sur le forum et sur le web, mais je ne trouve pas de réponse à mon petit problème...

J'ai une base de donnée de fiches produits ; quand j'appelle une fiche pour l'éditer (avec un query string du genre : edit.php?id=22 ), tous les champs s'affichent bien dans le formulaire, sauf les listes déroulantes qui ne font pas apparaître l'élément sélectionné.

Pour être plus clair, quand j'appelle la fiche d'un produit dont l'une des caractéristiques est "FRUITÉE" (parmi d'autre possibilités), j'aimerais que ma liste déroulante affiche directement "FRUITÉE". Or, elle n'affiche rien, et je dois sélectionner moi-même à nouveau dans la liste, sans quoi la caractéristique est effacée lors de la mise à jour de la fiche.

Voici le code (simplifié) :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
		<meta http-equiv="content-language" content="fr" />

		<?php include('conf.php'); ?>
		
		<title>DATABASE</title>
		
	</head>
	
	<body>
		
		<?php
			if ((!isset($_GET[id]) || trim($_GET[id]) == '')) { die ('Identifiant manquant !'); }
			
			$connection = mysql_connect($host, $user, $pass) or die ('Impossible de se connecter.');
			mysql_select_db($db) or die ('Impossible de se connecter à la base de données.');
			
			$id = $_GET['id'];
			$query = "SELECT * FROM products WHERE id = '$id'";
			$result = mysql_query($query) or die ('Erreur dans la requête $query.' . mysql_error());
			
			if (mysql_num_rows($result) > 0)
			{
				$row = mysql_fetch_object($result);
		?>
		
			<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
				<table cellspacing="5" cellpadding="5">
					<tr>
						<td>Family : </td>
						
						<td>
							<select name="family">
							<?php
							$query1 = "SELECT DISTINCT family FROM families ORDER BY family";                                                             
							$result1 = mysql_query($query1) or die ('Erreur dans la requête $query.' . mysql_error());                                    
							while ($row1 = mysql_fetch_row($result1)) { echo '<option value="'.$row1[0].'">'.$row1[0].'</option>'; }                      
							?>                                                                                                                         
							</select>
						</td>
						
						<td>&nbsp;(<?php echo($row->family); ?>)</td>
					</tr>                                                                                                           
					
					<tr><td><input name="id" type="hidden" value="<?php echo $id; ?>" /></td></tr>
					<tr><td><input name="submit" type="submit" value="Mettre à jour" /></td></tr>
				</table>
			</form>
			
		<?php
		}
		else {
		/* blablabla... */
		}
		?>
	
	</body>
	
</html>


Je pensais que

<option value="'.$row1[0].'">'.$row1[0].'</option>
serait suffisant, mais apparemment non...

Si quelqu'un sait comment faire...

Merci d'avance,
Lionel
Modifié par Opentype (07 Mar 2007 - 23:43)
Opentype a écrit :
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

T'as une faille de sécurité là... On peut injecter de l'HTML sans problème via genre :
http://pouet.com/tonscript.php/"><script>alert(document.cookie)</script>


N'affiche jamais des choses comme ça dans une page HTML, utilise :
echo htmlspecialchars($_SERVER['PHP_SELF'])

Même chose pour les données, si jamais t'as des caractère genre < ou > (ou même de l'html), ça va exploser :
$value = htmlspecialchars($row1[10]);
echo '<option value="', $value, '">', $value, '</option>';

Note au passage que j'ai mis des virgules et pas des points. La commande echo accepte plusieurs paramètres, donc inutile de concaténer si c'est pour afficher directement Smiley smile
Modifié par FlorentG (08 Mar 2007 - 09:36)
Merci beaucoup pour vos réponses. Smiley smile

Voici les modifications que j'ai apportées :


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
		<meta http-equiv="content-language" content="fr" />

		<?php include('conf.php'); ?>
		
		<title>DATABASE</title>
		
	</head>
	
	<body>
		
		<?php
		if (!$_POST['submit'])
		{
			if ((!isset($_GET[id]) || trim($_GET[id]) == ''))
			{
				die ('Identifiant manquant !');
			}
			
			$connection = mysql_connect($host, $user, $pass) or die ('Impossible de se connecter.');
			mysql_select_db($db) or die ('Impossible de se connecter à la base de données.');
			
			$id = $_GET['id'];
			$query = "SELECT * FROM products WHERE id = '$id'";
			$result = mysql_query($query) or die ('Erreur dans la requête $query.' . mysql_error());
			
			$row = mysql_fetch_object($result);
		?>
		
			[#red]<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">[/#]
		
				<table cellspacing="5" cellpadding="5">					
					<tr>
						<td class="tdright">Identity : </td>
						<td><input name="identity" value="<?php echo $row->identity; ?>" type="text" size="50" maxlength="250" /></td>
					</tr>
															
					<tr>
						<td class="tdright">Family : </td>
						<td>
							<select name="family">                                                                                                                                                 
							[#red]<?php
							$query_fam = "SELECT DISTINCT family FROM families ORDER BY family";                                                             
							$result_fam = mysql_query($query_fam) or die ('Erreur dans la requête $query.' . mysql_error());                                    
							while ($row_fam = mysql_fetch_row($result_fam)) {
								if ($row_fam[0] == $row->family ? $optselect = 'selected="selected"' : $optselect='');
								echo '<option value="', $row_fam[0], '"', $optselect, '>', $row_fam[0], '</option>';
							}                     
							?>[/#]
							</select>
						</td>
					</tr>                                                                                                           
										
					<tr>
						<td><input name="id" type="hidden" value="<?php echo $id; ?>" /></td>
					</tr>
					
					<tr>
						<td><input name="submit" type="submit" value="Mettre à jour" /></td>
					</tr>
				</table>

			</form>
					
		<?php
		}
		else {
		[#red]		
		$identity = htmlspecialchars($_POST['identity']);
		$family = htmlspecialchars($_POST['family']);
		[/#]		
		$id = $_POST['id'];
		
		if ((!isset($_POST['id']) || trim($_POST['id']) == '')) { die ('Identifiant manquant !'); }
		
			$connection = mysql_connect($host, $user, $pass) or die ('Impossible de se connecter !');

			mysql_select_db($db) or die ('Impossible de se connecter à la base de données.');
			$query = "UPDATE products SET identity = '$identity', family = '$family' WHERE id = '$id'";

			$result = mysql_query($query) or die ('Erreur dans la requête $query.' . mysql_error());
			
			echo '<p>Mise à jour réussie !</p>';
			
			mysql_close($connection);
	}
	?>
	
	</body>
	
</html>


Pour selected="selected", ça ne marche qu'avec la condition que j'ai écrite. Je trouve ça un peu lourd, mais c'est la seule solution que j'ai trouvée...

J'ai bien ajouté la fonction htmlspecialchars() là où il fallait ! Smiley smile

Je ne savais pas qu'echo acceptait plusieurs paramètres ; est-ce que tu préconises d'utiliser des virgules (au lieu de concaténer) pour une question de lisibilité ?
Modifié par Opentype (08 Mar 2007 - 21:55)