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 d'un tableau dynamique en bdd


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Informatique
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 0
    Points
    0
    Par défaut Insertion d'un tableau dynamique en bdd
    Bonjour, J'ai suivi le sujet sur ce lien: dont le thème est calcul automatique dans un tableau dynamique. ke l'ai réadapté à mon code qui est le suivant :
    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
     
    <?php
    try
    {
        $bdd=new PDO('mysql:host=127.0.0.1;dbname=my_ddb','root','');
     	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     	$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
    } catch(PDOException $e) {
        die('Erreur : ' . $e->getMessage());
    }
    $vst = isset($_POST['vst']) ? $_POST['vst'] : NULL;
    $ve = isset($_POST['ve']) ? $_POST['ve'] : NULL;
    $value = array();
    $i = 0;
     
    while(isset($_POST['vst'][$i++])) {
     $value[] = "('', '".$_POST['vst'][$i]."', '".$_POST['ve'][$i]."')";
    }
     
    $datas = implode(",",$value);
    //$value = substr($value, 0, -1); // Pour virer la dernière virgule
    $sql = "INSERT INTO tableau(val_st,val_et) ".$datas;
    try{
      $req=$bdd->prepare($sql);
      $req->execute();
    }catch(Exception $e){
      echo "Erreur :".$e->getMessage();
      echo "<br>Requete :".$sql;
     
     
    }
     
     
    ?>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Une interface de formulaire à base de tableau dynamique</title>
    <script language="JavaScript" src="dtable.js"></script>
    </head>
     
    <body>
    <form action="" method="POST">
    <table class="dTable">
    	<thead>
        	<tr>
            	<th>Valeurs sous test</th>
                <th>Valeurs étalon</th>
                <th>Ecart</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tfoot>
        	<tr>
            	<th colspan="5"><a href="#" onclick="addLigne(this)">Ajouter une ligne</a></th>
            </tr>
        </tfoot>
        <tbody>
        	<tr>
            	<td><input name="vst[]" id="vst[]" type="text" /></td>
                <td><input name="ve[]" id="ve[]" type="text" value = "" onkeyup = "calcul(this);" /></td>
                <td><input name="ecart[]" id="ecart[]" type="text" readonly="readonly" /></td>
     
                <td><a href="#" onclick="delLigne(this)">Supp</a></td>
            </tr>
        </tbody>
    </table>
    <input type="submit" value="Ok">
    <form>
     
     
    </body>
    </html>
    Mon code js :
    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
    78
    79
     
    /*Trouve le tag "parentTagName" parent de "element"*/
    function getParent(element, parentTagName)
    {
    	if(!element)
    	return null;
    	else if(element.nodeType==1 && element.tagName.toLowerCase()==parentTagName.toLowerCase())
    	return element;
    	else
    	return getParent(element.parentNode, parentTagName);
    }
     
    /*Ajout d'une ligne*/
    function addLigne(link)
    {
    	//1. récupérerle node "TABLE" à manipuler
    	var td=link.parentNode;
    	var table= getParent(td,'TABLE');
    	//2. On va manipuler le TBODY
    	var tbody=table.tBodies[0];
    	//3. On clone laligne de référence
    	var newTr = tbody.rows[0].cloneNode(true);
    	tbody.appendChild(newTr);
    	/*Un dernier problème subsiste : lorsqu'on clone cette ligne, son style est cloné également. Toutes les lignes sont donc invisibles ! Il faut ajouter à la fin de addLigne de quoi les remettre visibles */
    	if ( document.all )
    		newTr.style.display = "block"; // pour IE
    	else
    		newTr.style.display = "table-row"; // pour Gecko
    }
     
     
    /*Supprimer une ligne*/
    function delLigne(link) {
    	// 1. récuperer le node "TABLE" à manipuler
    	var td = link.parentNode;
    	var table = getParent(td, 'TABLE');
    	// 2. récuperer le TBODY
    	var tbody = table.tBodies[0];
    	// 3. Supprimer le TR
    	tbody.removeChild(getParent(td, 'TR'));
    }
    /*On va donc masquer la première ligne avec la propriété CSS display="none" et en ajoute une vide supplémentaire.*/
     
    window.onload = dtableInit;
    /* initialise le script */
    function dtableInit() {
    	var table = document.getElementsByTagName('TABLE');
    	for ( var i = 0; i < table.length; i++ ) {
    		// on récupère tous les tableaux dynamiques
    		if ( table[i].className == 'dTable' ) {
    			var tbody = table[i].tBodies[0];
    			var newTr = tbody.rows[0].cloneNode(true);
    			// on masque la première ligne du tbody (la ligne de reference)
    			tbody.rows[0].style.display = 'none';
    			// on en ajoute une
    			tbody.appendChild(newTr);
    		}
    	}
    }
     
     
    function calcul(obj){
      // recherche TD parente de l'input (obj) passé en paramètre
      var oTD = obj.parentNode;
      // recherche TR parente de la TD
      var oTR = oTD.parentNode;
      // récup de la position de la TD sur la ligne
      var ind = oTD.cellIndex;
      // récup. TD précédente
      var oTDavant = oTR.cells[ind-1];
      // récup. TD suivante
      var oTDapres = oTR.cells[ind+1];
      // récup de l'INPUT de la TD précédente
      var oInputAvant = oTDavant.firstChild;
      // récup. de l'INPUT de la TD suivante
      var oInputApres = oTDapres.firstChild;
      // OUF!!! enfin le calcul
      oInputApres.value = oInputAvant.value - obj.value;
    }
    Je tien à rappeler que mon code js marche. le problème c'est l'enregistrement des données entrées dans ma base de données. j'utilise WampServer 3.0.6.
    Quand j'exécute mon code PHP, j'ai le message suivant au chargement de la page:
    Erreur :SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe pr�s de '' � la ligne 1
    Requete :INSERT INTO tableau(val_st,val_et)

    quand je rentre les valeurs dans les dux premiers input et que je valide avec mon submit "ok", j'ai le message d'erreur suivant:
    Notice: Undefined offset: 2 in C:\wamp64\www\tableau\index.php on line 16

    et le premier message d'erreur devient:
    Erreur :SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe pr�s de ''', '12', '13'),('', '', '')' � la ligne 1
    Requete :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO tableau(val_st,val_et) ('', '12', '13'),('', '', '')

    12 et 13 représentent les valeurs entrées dans les deux input dont le name est vst et ve

    Voici mon code SQL concernant la table tableau en bdd (la structure de ma table tableau si vous voulez):

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `tableau` (
      `id_tableau` int(11) NOT NULL,
      `val_st` text NOT NULL COMMENT 'valeurs sous test',
      `val_et` text NOT NULL COMMENT 'valeurs étalon',
      `ecart` text NOT NULL COMMENT 'écacrts',
      `id_operation` int(11) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Voila ça fait des jours que je cherche enfin à insérer les valeurs du tableau dans la bdd. la troixième colonne n'est pas importante, elle effectu juste un calcul de difference entre les deux premieres colonnes, juste un aperçu pour l'utilisateur, le calcul s'effectuera au niveau de la bdd..
    voila j'espere avoir donné suffisament d'info, merci de bien vouloir m'aider, ça fait des jour que je cherche, et debutant en php que je suis je n'arrive pas à trouver une solution, j'ai parcouru beaucoup de forum, aujourd'hui je viens à vous...
    merci de bien vouloir m'aider ! je compte sur vous

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Bonjour,

    le nombre d'éléments insérés (3) n'est pas le même que le nombre d'éléments déclarés (2).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $value[] = "('', '".$_POST['vst'][$i]."', '".$_POST['ve'][$i]."')";
    // 2 virgules => 3 éléments : '', vst et ve
     
    $datas = implode(",",$value);
    $sql = "INSERT INTO tableau(val_st,val_et) ".$datas;
    // 1 virgule => 2 éléments : val_st et val_et
    Il faut donc supprimer "'', " de la première ligne ou ajouter une colonne dans la dernière.
    Christophe

    Pensez à mettre quand c'est le cas.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Informatique
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Merci Christophe pour votre réponse,
    en supprimant "'', " de la première ligne
    j'ai toujours le meme code d'erreur

    Erreur :SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe pr�s de '14', '4555'),(', '')' � la ligne 1
    Requete :INSERT INTO tableau(val_st,val_et) (14', '4555'),(', '')
    avec un autre message d'erreur:

    Notice: Undefined offset: 2 in C:\wamp64\www\tableau\index.php on line 16

    ligne 16 correspond à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $value[] = "(".$_POST['vst'][$i]."', '".$_POST['ve'][$i]."')";
    je cherche toujours la source de mon erreur
    merci

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Informatique
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    en cherchant j'ai essayé de modifier mon code en mettant celui ci:
    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
     
    $vst=array();
    $ve=array();
    $ecart=array();
    $value = array();
    $i = 0;
     
     
    while (isset($_POST['vst'][$i++])) 
    {
        $vst[].=$_POST['vst'][$i];
    }
     
    while (isset($_POST['ve'][$i++])) 
    {
        $ve[].=$_POST['ve'][$i];
    }
     
    while (isset($_POST['ve'][$i++])) 
    {
        $ecart[].=$_POST['ecart'][$i];
    }
     
    $data_vst=implode(";", $vst);
    $data_ve=implode(";", $ve);
    $data_ec=implode(";", $ecart);
    $sql = "INSERT INTO tableau(val_st,val_et,ecart,id_operation) VALUES (?,?,?,?) ";
    try{
      $req=$bdd->prepare($sql);
      $req->execute(array($data_vst,$data_ve,$data_ec,'1'));
    }catch(Exception $e){
      echo "Erreur :".$e->getMessage();
      echo "<br>Requete :".$sql;
    }
    La il ne m'affiche plus d'erreur au chargement de la page mais l'orsque je rentre les données de façon pas à pas et que je valide il maffiche une erreur du genre
    Notice: Undefined offset: 2 in C:\wamp64\www\tableau\index.php on line 24
    ligne 24:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $vst[].=$_POST['vst'][$i];
    au départ j'avais mi "=" c'était la meme erreur, j'ai essaié de mettre un ".=" pour voir mais il me met la meme erreur. dans ma requete j'ai tout fait pour remplir tou les champ pour le moment puisque'il m'affichait des erreurs au chargement de la page du genre 'ecart' / 'id_operation' as not a default value. pour le moment, juste pour le test, j'ai inséré des donnée dans ces colonnes, si lecode marche je vais songer à le modifier
    merci

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (isset($_POST['vst'][$i++])) 
    {
        $vst[].=$_POST['vst'][$i];
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (isset($_POST['vst'][$i])) 
    {
        $vst[].=$_POST['vst'][$i++];
    }
    A+.

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Informatique
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    merci
    mai j'ai toujour une erreur a part undefind index qui a disparu
    Erreur :SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1
    Requete :INSERT INTO tableau(val_st,val_et,ecart,id_operation) VALUES ('', '39','')

    39 coorespond à la valeur rentrée dans ve

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Le code montré ne correspond pas à l'erreur.
    Citation Envoyé par Ismaelouatt Voir le message
    ...
    INSERT INTO tableau(val_st,val_et,ecart,id_operation) VALUES ('', '39','')
    ...
    3 valeurs insérées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = "INSERT INTO tableau(val_st,val_et,ecart,id_operation) VALUES (?,?,?,?) ";
    try{
      $req=$bdd->prepare($sql);
      $req->execute(array($data_vst,$data_ve,$data_ec,'1'));
    }
    4 valeurs insérées et la dernière est '1'.
    Christophe

    Pensez à mettre quand c'est le cas.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. récupérer la memoire et tableau dynamique
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 06/01/2003, 08h02
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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