IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Insertion de variables dynamiques dans une base [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 12
    Points : 13
    Points
    13
    Par défaut Insertion de variables dynamiques dans une base
    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

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    D'un point de vue conception, tout mettre dans une seule table ne me parait pas super optimisé : que va-t-il se passer si la semaine prochaine, tu décides d'autoriser davantage de questions dans ton QCM ? ou davantage d'items ?
    Le plus simple, ce serait à mon avis de travailler avec plusieurs tables. Par exemple :
    - 1 table exercice : contient les informations liées à l'exercice (titre, description...)
    - 1 table question : contient l'énoncé de la question, est liée à la table exercice (une question appartient à un exercice)
    - 1 table reponse : contient l'énoncé d'une réponse possible à une question et un flag "bonne réponse" qui indique si c'est ou non une réponse juste, est liée à la table exercice (une réponse appartient à une question)

    Du coup, pour créer un QCM avec 16 questions à 4 réponses possibles par question, tu crées :
    - 1 ligne dans exercice
    - 16 lignes dans question
    - 16*4 lignes dans reponse

    Mais, ça c'est juste mon avis.

    Sinon, techniquement, tu as vraiment des parenthèses dans tes noms de colonnes en base ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2013
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    " D'un point de vue conception, tout mettre dans une seule table ne me parait pas super optimisé : que va-t-il se passer si la semaine prochaine, tu décides d'autoriser davantage de questions dans ton QCM ? ou davantage d'items "

    A ce niveau aucun risque : c'est standardisé et les modalités ne vont pas changer

    Sinon euh ... oui j'avais mis des parenthèses. Ce serait la raison pour laquelle les insertions déconnent ?

    L'idée des 3 tables me plaît car les données seront mieux organisées, mais le problème restera le même, puisque même les questions ne veulent pas passer. Et comme le nombre de question rentrées sera variable, j'ai besoin que leur nom de variable varie lui aussi grâce à la variable $i et je me demande si ce n'est pas la raison pour laquelle PDO n'accepte pas ma requête.

    En attendant je vais essayer de faire tout cela sans parenthèse. En espérant que ce soit la raison de l'échec de mes requêtes sinon c'est retour case départ !

    Merci à vous de m'avoir répondu en tous les cas. Je vais essayer de modifier tout ça ce soir ou demain

    EDIT : Je suis parti sur 3 tables comme vous me l'avez conseillé et ça fonctionne nickel ! Déjà c'est moins bordélique au niveau de la base et surtout ça m'évite d'avoir à intégrer des variables dans les instructions de mes requêtes (à part les valeurs à entrer bien sûr) donc encore merci à vous !

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tant mieux !

    Pour information, après vérification, MySQL accepte à peu près n'importe quoi comme nom de colonne Toutefois, il faut encadrer le nom de colonne par des backquotes si il ya des caractères spéciaux dedans :
    Notez que si un identifiant est un mot réservé, ou contient des caractères spéciaux, vous devez absolument le protéger avec ‘`’ :

    Le caractère de protection des identifiants est le guillemet oblique ‘`’ :

    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql> SELECT * FROM `select` WHERE `select`.id > 100;
    Les caractères spéciaux sont hors de la plage des caractères alpha-numérique et ‘_’ et ‘$’.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Conception] Insertion de champs d'un tableau dynamique dans une base de données
    Par loreleï85 dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 12/05/2011, 14h39
  2. [SQL] Modification de champs d'un tableau dynamique dans une base de données
    Par loreleï85 dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 27/06/2006, 16h55
  3. Réponses: 1
    Dernier message: 23/06/2006, 11h19
  4. [Conception] insertion sql en php, dans une base de donnée ?
    Par artotal dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/10/2005, 04h34
  5. variable dynamique dans une fonction javascript
    Par Shivaneth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/04/2005, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo