Bonjour,

je dois créer un formulaire pour permettre la saisie d'une photo. J'ai une base SQL appelée projetphp qui contient 2 tables :
Photo avec pour colonnes
- codephoto PK
- titrephoto
- nomfichier
- datecreationfichier
- codetheme FK
Theme avec pour colonnes
- codetheme PK
- nomtheme

J'ai construit le formulaire suivant saisiephoto.html :

<!DOCTYPE html>
<html>
 <head>
   <meta charset="utf-8">
 </head>
 <body>
 
 <form action="saisiephoto.php" method="post">

Titre de la photo : <input type="text" name="ztitrephoto"></br>
Nom du fichier : <input type="text" name="znomfichier"></br>
Code du thème : <input type="text" name="zcodetheme"></br>
<!--
Code du thème : <select name="zone" size="10">
<option value="1">'SELECT codetheme,nomtheme FROM Theme WHERE codetheme=001;'</option>
<option value="2">'SELECT codetheme,nomtheme FROM Theme WHERE codetheme=002;'</option>
<option value="3">'SELECT codetheme,nomtheme FROM Theme WHERE codetheme=003;'</option>
<option value="4">'SELECT codetheme,nomtheme FROM Theme WHERE codetheme=004;'</option>
<option value="5">'SELECT codetheme,nomtheme FROM Theme WHERE codetheme=005;'</option>
-->

</select>
</br>
</br>
</br>

		<input type="submit">
		<input type="reset">
</form>

</body>
</html>


Et mon fichier PHP saisiphoto.php

<!DOCTYPE html>
<html>
 <head>
   <meta charset="utf-8">
 </head>
 <body>
	
	<?php
	try{
	$cx=new PDO(		
	"mysql:host=localhost;dbname=projetphp","root","root");
	}catch(PDOExecption $e)
	{
	die("erreur") ;	
	}
	
		

	$titrephoto=$_POST["ztitrephoto"];
	$nomfichier=$_POST["znomfichier"];
	$codetheme=$_POST["zcodetheme"];
	
	$requete="INSERT INTO Photo VALUES ('','$titrephoto','$nomfichier',NOW(),'$codetheme')";
	echo $requete;
	$resultat=$cx->exec($requete);
	echo $resultat;
	
	$cx=null;
	
	?>

</body>
</html>


Tout fonctionne pour le moment. Comme mis en commentaire dans la partie HTML, je veux faire un menu déroulant qui va récupérer tout mes codetheme - idéalement j'aimerais afficher dans ce menu déroulant une concaténation codetheme+nomtheme - mais je ne vois pas comment faire..

Est-ce que quelqu'un peut m'aider SVP ?
Merci pour ta réponse. Je ne comprends pas bien la doc, j'ai construit une 1ère fonction :

	<?php
	function getTheme() {
			$sql='SELECT nomtheme FROM Theme ORDER BY codetheme;'
			foreach  ($codetheme->query($sql) as $row) {
				//print $row['codetheme'] . "\t";
				print  $row['nomtheme'] . "\t";
		  }
	echo "Thème : <select name='znomtheme' size='10'>
	<option value='1'>"$sql"</option>
	<option value='2'>"$sql"</option>
	<option value='3'>".$sql"</option>
	<option value='4'>".$sql"</option>
	<option value='5'>".$sql"</option>
	<option value='6'>".$sql"</option>"
	}
	?>


qui ne fonctionne pas car dans mon fichier HTML, à cause du '->' je pense, il le prends en compte comme un commentaire Smiley rolleyes donc à partir de "query" il affiche ma fonction dans la page HTML comme du texte...

Puis en regardant un vieux forum, j'ai fait ça mais là rien ne s'affiche dans mon menu déroulant :

<form action="saisiephoto.php" method="post">

Titre de la photo : <input type="text" name="ztitrephoto"></br>
Nom du fichier : <input type="text" name="znomfichier"></br>
	[b]<?php
	$requete="SELECT nomtheme FROM Theme ORDER BY codetheme;"
	$result=mysql_query($requete);
	while($donnees=mysql_fetch_array($result) ){
		?>
Thème : 
	<select name="zcodetheme">
	<option value="<?php echo $result['valeur']; ?>"<?php echo $result['valeur'];?></option>
	<?php } ?>
	</select>[/b]


J'ai un doute sur l'utilisation de ['valeur']

Aussi une petite question :
est-ce qu'on peut faire appel à une fonction PHP dans une page .html comme on le fait avec JS ? il me semble que non mais bon..
Oula... J'ai l'impression que tu as loupé quelques cours sur le PHP, d'autant plus que la structure de ton code est incohérente ! Tu devrais revoir les bases de PHP avant de te lancer dans de tel projet.

Pour répondre à ta question, tu t'es emmêlé les pinceaux. Si j'ai bien compris, ce que tu essayes de faire là est de présenter depuis la base de données les différents thèmes (nom et code) dans une liste de sélection.

Grossièrement, pour un code très rustre, cela ressemblerait plutôt à cela...

Du coté du traitement :

	<?php 
	function getThemesAsOptions(){
		try {
			$pdo = new PDO("mysql:host=localhost;dbname=projetphp", "root", "root");
			$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
			
			$sql = 'SELECT nomtheme, codetheme FROM Theme ORDER BY codetheme';
			$results = $pdo->query($sql);
			
			foreach ($results as $row) {
				echo '<option value="'.$row["codetheme"].'">'.$row["nomtheme"].'</option>';
			}
		}
        catch (Exception $e) {
			print("Erreur : " . $e->getMessage());
        }
	}
	?>


Et du coté de ton interface :

	<form action="saisiephoto.php" method="post">

		<label>Titre de la photo :</label><input type="text" name="ztitrephoto"><br />
		<label>Nom du fichier :</label><input type="text" name="znomfichier"><br />
		<label>Thème</label>
		<select name='znomtheme' size='10'>
			<?php getThemesAsOptions(); ?>
		</select>
		
		<!-- ... La suite de ton formulaire ... -->

                <button type="submit">Ajouter</button>
	
	</form>

Modifié par Nolan (11 Jun 2018 - 00:54)
Regroupe les 2 fichiers en un seul pour simplifier
Si tu veux alimenter <select> du theme à partir de la base de données, c'est php obligatoire
On filtre les entrées d'un de façon systématique
Pour la date de la photo utiliser la valeur par défaut qui va bien
Exemple complet ( corriger les petits bugs éventuels ) :
<!DOCTYPE html>
<html lang="fr"><head>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
	<title>Saisie photo</title>
</head><body>
<?php

/* ------ Parametres connexion à la base de données (bdd)) --------- */
const PHOTOS_DSN = 'mysql:host=localhost;dbname=projetphp';
const LOGIN = 'root';
const PASSWD = 'root';

/* -----  Requêtes SQL ------- */
# pour MySQL
const CREATE_TABLES_SQL = <<< CREATE
create table theme_photo(
	theme_id int not null auto_increment primary key,
	theme_titre varchar(64) not null
);
create table photo(
	photo_id int not null auto_increment primary key,
	photo_titre varchar(64) not null,
	photo_fichier varchar(64) not null,
	photo_date timestamp default CURRENT_TIMESTAMP,
	theme_id int
);
alter table photo
	add foreign key fk_theme(theme_id) references theme_photo(theme_id);
CREATE;
const SELECT_THEMES_SQL = 'SELECT theme_id, theme_titre FROM theme_photo ORDER BY theme_titre;';
const INSERT_PHOTO_SQL = 'INSERT INTO photo(photo_titre, photo_fichier, theme_id) VALUES(:titre, :fichier, :theme);';

/* ------- Youpi ! On nous a posté une photo. ---------- */
# On vérifie qu'on nous a envoyé un formulaire avec les bons paramètres
# et on filtre les valeurs reçues au maximum
if(
	filter_has_var(INPUT_POST, 'ztitrephoto') and
	filter_has_var(INPUT_POST, 'znomfichier') and
	filter_has_var(INPUT_POST, 'znomtheme')
) {
	$params = array(
		':titre'	=> filter_input(INPUT_POST, 'ztitrephoto', FILTER_SANITIZE_STRING),
		':fichier'	=> filter_input(INPUT_POST, 'znomfichier', FILTER_SANITIZE_STRING),
		':theme'	=> filter_input(INPUT_POST, 'znomtheme', FILTER_SANITIZE_STRING)
	);
	/* --- Dans la bdd, */
	$cnx = new PDO(PHOTOS_DSN, LOGIN, PASSWD);
	$stmt = $cnx->prepare(INSERT_PHOTO_SQL);
	$stmt->exec($params);
?>
	<div>
		Photo enregistrée
	</div>
<?php
} else {
/* ----- Création du formulaire pour une nouvelle photo ------- */
?>
	<form method="post">
		<div>
			<label for="titre">Titre de la photo</label>
			<input id="titre" type="text" name="ztitrephoto" />
		</div>
		<div>
			<label for="fichier">Nom du fichier</label>
			<input id="fichier" type="text" name="znomfichier" />
		</div>
		<div>
			<label for="theme">Code du thème</label>
			<select id="theme" name="znomtheme" size="10">
<?php
/* ---- on alimente la balise <select> en créant des <option> à partir des valeurs de la bdd --- */
try {
	$cnx = new PDO(PHOTOS_DSN, LOGIN, PASSWD);
	foreach($cnx->query(SELECT_THEMES_SQL) $as $row) {
		echo <<< ROW
				<option value="{$row['theme_id']}">{$row['theme_titre']}</option>\n
ROW;
	}
} catch(PDOException $e) {
	echo "<pre>\n";
	print_r($cnx->errorInfo());
	echo "</pre>\n";
	die("erreur n°".$cnx->errorCode()) ;
}
?>
			</select>
		</div>
		<div>
			<input  type="submit" value="Envoi" />
		</div>
	</form>
<?php
}
?>
</body></html>

Pense à réviser tes cours de PHP, et éventuellement de SQL
Reste à rajouter la gestion des erreurs.
Modifié par bazooka07 (11 Jun 2018 - 09:55)
bazooka07 a écrit :
Regroupe les 2 fichiers en un seul pour simplifier


J'aurais tendance à dire l'inverse Smiley rolleyes