Bonjour

Je cherche à simplifier l'insertion de plus de 150 variables d'un coup dans une table SQL en les envoyant par groupes mais je n'y arrive pas et je n'ai trouvé nulle part de solution à mon problème. Pas davantage dans la doc de PDO ou les cours de PDO de développez.com ...

Voilà le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
 
         if (isset($_POST['exercice_submit'])) {
 
		$texte=$_POST['exercice'];
		$titre=$_POST['titre'];
		$commentaire=$_POST['commentaire'];
		$specialite=$_POST['specialite'];
 
		$image1=$_POST['image1'];
		$image2=$_POST['image2'];
		$image3=$_POST['image3'];
 
		setlocale (LC_TIME, 'fr_FR.utf8','fra'); 
		date_default_timezone_set('UTC');
 
		$date=date('j/m/y');					
		$auteur=$_SESSION['utilisateur'];
 
	        try {
 
		     $bdd = new PDO ('mysql:host=localhost;dbname=nom_base', 'root', '');
		     $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	        }
 
	        catch (Exception $e) {
 
		die(); 
        }
 
                // fonctionne bien
 
                $exec=$bdd->prepare('INSERT INTO liste_exercices (auteur, date, titre, commentaire) VALUES (?, ?, ?, ?)');
		$exec->execute(array($auteur, $date, $titre, $commentaire));
 
                for ($i=1;$i<17;$i++) {
 
			if (!empty($_POST['question'.$i.''])) {
 
				${'question'.$i} = $_POST['question'.$i.''];
 
// PDOException : SQLSTATE[42000]: Syntax error or access violation: 1064 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 ''question(1)') VALUES ('Intitulé 1')' at line 1' in C:\wamp\www\Dossier\saisie_exercice.php on line 34
 
				$exec=$bdd->prepare('INSERT INTO liste_exercices (:question) VALUES (:question_value)');
				$exec->bindValue(':question', "question($i)", PDO::PARAM_STR);
				$exec->bindValue(':question_value', ${'question'.$i}, PDO::PARAM_STR);
				$exec->execute();
 
				echo "${'question'.$i}"; // vérification de la valeur de la variable (s'affiche correctement)
				echo "question($i)"; // vérification de l'affichage du paramètre (correct)
			}
 
			if (!empty($_POST[''.$i.'a']) AND !empty($_POST[''.$i.'b']) AND !empty($_POST[''.$i.'c']) AND !empty($_POST[''.$i.'d']) AND !empty($_POST[''.$i.'e'])) {
 
				${$i.'a'}=$_POST[''.$i.'a'];
				${$i.'b'}=$_POST[''.$i.'b'];
				${$i.'c'}=$_POST[''.$i.'c'];
				${$i.'d'}=$_POST[''.$i.'d'];
				${$i.'e'}=$_POST[''.$i.'e'];
 
				${'items('.$i.')'}=${$i.'a'}.'-'.${$i.'b'}.'-'.${$i.'c'}.'-'.${$i.'d'}.'-'.${$i.'e'}; // création d'une chaîne englobant les 5 items avec le séparateur " - " pour les séparer plus tard
 
				echo "${'items('.$i.')'}"; // vérification affichage de la valeur de la variable (correct)
				echo "items($i)"; // vérification affichage du paramètre (correct)
 
 
                                // PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp\www\Dossier\saisie_exercice.php on line 56
 
				$exec=$bdd->prepare('INSERT INTO liste_exercices (:items) VALUES (:items_value)');
				$exec->bindValue(':items', "items($i)", PDO::PARAM_STR);
				$exec->bindValue(':items', ${'items('.$i.')'}, PDO::PARAM_STR);
				$exec->execute();
 
			}
		}	
	}
?>
Le but de ce programme c'est d'insérer dans une base de données des exercices de QCM que l'utilisateur puisse sélectionner et exécuter plus tard. Le formulaire comprend des informations uniques et faciles à mettre dans la base. Le problème c'est les questions. Je peux entrer jusque à 16 questions (12 minimum) et chacune d'entre elles comprend les variables suivantes :

- intitulé de la question (${'question'.$i}).
- intitulé de l'item a (${$i.'a'}).
- intitulé de l'item b (${$i.'b'}).
- intitulé de l'item c (${$i.'c'}).
- intitulé de l'item d (${$i.'d'}).
- intitulé de l'item e (${$i.'e'}).
- la valeur de chacun de ces items (1 ou 0)

Donc un total de 176 variables pour les 16 questions (en plus des autres) et j'ose croire qu'il y a des moyens plus commodes que de créer 176 colonnes dans la table et les faire remplir une par une par le script PHP.

J'ai donc prévu de saisir dans le formulaire l'intitulé de chaque item sous la forme " intitulé " / x (avec x égal à 0 ou 1) afin d'économiser 80 colonnes dans la table et séparer plus tard les variables au moment de l'exécution de l'exercice. Comme je serai le seul à rentrer les exercices dans la base je me permets d'utiliser cette méthode que je n'appliquerais pas pour des données venant de l'utilisateur. Ensuite je comptais créer une variable ${'items('.$i.')'} sous la forme ${$i.'a'} - ${$i.'b'} - ${$i.'c'} - ${$i.'d'} - ${$i.'e'}.

Ce qui donnerait au final 2 variables au lieu de 11 pour chaque question. Par exemple pour la question 1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
$question(1) = "Intitulé 1";
$items(1) = " Item a / 0 - Item b /1 - Item c / 1 - Item d / 1 - Item e / 0 "
Et là c'est le drame parce que je ne peux insérer aucune d'entre elles dans ma base. J'ai essayé les requêtes préparées ou non préparées, les variables liées ou entrées directement dans la requête, le résultat est toujours le même. J'ai mis les messages d'erreur obtenus en commentaires devant chaque requête. Je m'adresse donc à tous ceux acceptant de m'aider dans l'espoir de savoir ce qui cloche et finaliser mon code, ou bien me voir conseiller une meilleure méthode pour arriver au résultat que je souhaite. Merci par avance