tableau éditable

tableau éditable - PHP - Programmation

Marsh Posté le 30-04-2014 à 14:57:58    

Bonjour,
 
J'ai une problématique qui est la suivante: je veux avoir un tableau des champ et lorsqu'on s'appuie sur un bouton en ajoute une ligne autre ligne vide semblable à la ligne précédente et puis avoir un bouton submit qui fait l'insertion des tous les données saisies dans la base de données. C'est pour mon application web dynamique svp aidez moi
 
Voici le code du mon tableau

Code :
  1. <table class="dTable">
  2. <thead> <tr> <th> <div align="center"> Code Article </div> </th>
  3.               <th> <div align="center"> Article </div> </th>
  4.     <th> <div align="center"> D&eacutesignation </div> </th>
  5.     <th> <div align="center"> Num&eacutero de S&eacuterie </div> </th>
  6.     <th> <div align="center"> Version </div> </th>
  7.               <th> <div align="center"> Famille </div> </th>
  8.               <th> <div align="center"> Emplacement </div> </th>
  9.     <th></th>
  10. </tr> </thead>
  11. <tfoot> <tr>
  12.  <th colspan="8"><a href="#" onclick="addLigne(this); return false;">Add a line</a></th>
  13. </tr> </tfoot>
  14. <tbody><tr> <td> <div align="center"> <input type="text" name="Code_Article[0]"/> </div> </td>
  15.              <td> <div align="center"> <input type="text" name="Article[0]"/> </div></td>
  16.              <td> <div align="center"> <input type="text" name="Designation[0]"/> </div> </td>
  17.    <td> <div align="center"> <input type="text" name="Numero_Serie[0]"/> </div> </td>
  18.    <td> <div align="center"> <input type="text" name="Version[0]"/> </div> </td>
  19.    <td> <div align="center"> <select name="Famille[0]"> </select> </div> </td>
  20.    <td> <div align="center"> <input type="text" name="Emplacement[0]"/> </div> </td>
  21.    <td><div align="center"><a href="#" onclick="delLigne(this); return false;">Delete</a></div></td>
  22. </tr>
  23. </tbody> </table>

 
 
et ça c'est le code javascript pour l'ajout d'une ligne et ça fonctionne bien :  

Code :
  1. <script>
  2. function getParent(element, parentTagName) {
  3. if ( ! element )
  4.  return null;
  5. else if ( element.nodeType == 1 && element.tagName.toLowerCase() == parentTagName.toLowerCase() )
  6.  return element;
  7. else
  8.  return getParent(element.parentNode, parentTagName);
  9. }
  10. /* ajoute une ligne */
  11. function addLigne(link) {
  12. // 1. récuperer le node "TABLE" à manipuler
  13. var td = link.parentNode;
  14. var table = getParent(td,'TABLE');
  15. // 2. on va manipuler le TBODY
  16. var tbody = table.tBodies[0];
  17. // 3. on clone la ligne de reference
  18. var newTr = tbody.rows[0].cloneNode(true);
  19. tbody.appendChild(newTr);
  20. if ( document.all )
  21.  newTr.style.display = "block"; // pour IE
  22. else
  23.  newTr.style.display = "table-row"; // pour Gecko
  24. }
  25. /* supprimer une ligne */
  26. function delLigne(link) {
  27. // 1. récuperer le node "TABLE" à manipuler
  28. var td = link.parentNode;
  29. var table = getParent(td, 'TABLE');
  30. // 2. récuperer le TBODY
  31. var tbody = table.tBodies[0];
  32. // 3. Supprimer le TR
  33. tbody.removeChild(getParent(td, 'TR'));
  34. }
  35. window.onload = dtableInit;
  36. /* initialise le script */
  37. function dtableInit() {
  38. var table = document.getElementsByTagName('TABLE');
  39. for ( var i = 0; i < table.length; i++ ) {
  40.  // on récupère tous les tableaux dynamiques
  41.  if ( table[i].className == 'dTable' ) {
  42.   var tbody = table[i].tBodies[0];
  43.   var newTr = tbody.rows[0].cloneNode(true);
  44.   // on masque la première ligne du tbody (la ligne de reference)
  45.   tbody.rows[0].style.display = 'none';
  46.   // on en ajoute une
  47.   tbody.appendChild(newTr);
  48.  }
  49. }
  50. }
  51. </script>


 
 
 
 
Mon problème est l'ajout de de tous les données saisies dans ce tableau dans la base de données  
voici mon code php mais ça ne fonctionne pas et ça m'affiche l'erreur suivante: Column count doesn't match value count at row 1
 

Code :
  1. <?php
  2. session_start();
  3. include("conf_site.php" );
  4. include("fonctions.php" );
  5. $bdd = new PDO('mysql:host='.$bdd_hote.';dbname='.$bdd_nmDB, $bdd_user, $bdd_pass);
  6. $Numero_Bon_Entree=$_SESSION['Bon_Entree_N'];
  7. $value=array();
  8. $i=0;
  9. while(isset($_POST['Numero_Serie'][++$i]))
  10. { $value[]="('',
  11. '".mysql_real_escape_string($_POST['Numero_Serie'][$i])."','".mysql_real_escape_string($_POST['Code_Article'][$i])."','".mysql_real_escape_string($_POST['Article'][$i])."','".mysql_real_escape_string($_POST['Famille'][$i])."','".mysql_real_escape_string($_POST['Version'][$i])."','".mysql_real_escape_string($_POST['Emplacement'][$i])."','".mysql_real_escape_string($_POST['Designation'][$i])."')";}
  12. mysql_query("INSERT INTO `articles` (`Numero_Serie`, `Code_Article`,`Carte`,`Famille`,`Version`, `Emplacement`, `Designation`,`Numero_Bon_Entree`) VALUES ('".implode(',',$value)."','".$Numero_Bon_Entree."')" ) or die (mysql_error());
  13. ?>

Reply

Marsh Posté le 30-04-2014 à 14:57:58   

Reply

Marsh Posté le 30-04-2014 à 15:36:30    

L'ajout de ce qui sera saisit dans la nouvelle ligne doit être enregistré dans la BD sur une requête Ajax : sur le clic du bouton submit, ça envoie la requête ajax avec le contenu de la nouvelle ligne à enregistrer (en XML ou en JSON, par ex) à un script php qui se chargera de traiter la requête ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-04-2014 à 16:01:26    

Svp est ce que vous pouvez m'aider puisque j'ai aucune idée sur les principes et l'utilisation d'Ajax. Svp c'est urgent

Reply

Marsh Posté le 30-04-2014 à 16:26:06    

Comme rufo le souligne c'est plus pratique de faire appel a une requete ajax avec du json (regarde avec jquery).
Mais si c'est urgent et que tu n'a pas le temps de tout refaire, commence par faire un  print_r($_POST); dans ton code php juste avant la boucle pour voir deja si tu recuperes toutes tes données.

Reply

Marsh Posté le 30-04-2014 à 16:29:38    

j'ai essayé avec print_r($_POST) mais ça n'affiche rien !!! :??:

Reply

Marsh Posté le 30-04-2014 à 16:31:14    

donc tu récupères aucune données, tu as un bien une balise form avant ton tableau?

Reply

Marsh Posté le 30-04-2014 à 16:37:20    

oui, j'ai une balise form qui a comme action l'appel du fichier add.php qui contient le code d'ajout inséré ci dessus.

Reply

Marsh Posté le 30-04-2014 à 16:45:28    

Un Mok sur ajax : http://fr.openclassrooms.com/infor [...] javascript


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-04-2014 à 16:46:43    

bizarre...
et ca

Code :
  1. print_r($_POST['Numero_Serie'])

Reply

Marsh Posté le 30-04-2014 à 17:28:46    

j'ai remplacé Numero_Serie[0] par Numero_Serie[] et c'est bon pour la récupération des données mais maintenant il y a l'erreur svte: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use

Reply

Marsh Posté le 30-04-2014 à 17:28:46   

Reply

Marsh Posté le 30-04-2014 à 17:39:43    

$i=0;
while(isset($_POST['Numero_Serie'][++$i]))
 
=> j'ai un doute sur le fait que tu génères bien la requête pour la valeur 0 de l'indice $i :/
 
$_POST['Article'][$i] et $_POST['Designation'][$i] m'intriguent aussi. Dans ton code html, je vois pas comment les indices évoluaient ?
 


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-04-2014 à 17:41:21    

Au passage, ce genre de HTML <th> <div align="center"> Emplacement </div> </th> est vraiment très laid :fou:  
Mettre un div dans un th alors que pour ce que tu fais, un simple style css sur le th suffit :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-04-2014 à 17:46:16    

ok @rufo pour les div c'est simplement une solution instantanée pour l'affichage :/  
Mais ce que j'ai compris que l'erreur provient de la requête sql non plus la récupération des données

Reply

Marsh Posté le 30-04-2014 à 19:02:19    

fais
 

Code :
  1. echo "INSERT INTO `articles` (`Numero_Serie`, `Code_Article`,`Carte`,`Famille`,`Version`, `Emplacement`, `Designation`,`Numero_Bon_Entree`) VALUES ('".implode(',',$value)."','".$Numero_Bon_Entree."')";


 
compare ton nombre d'arguments par rapport a values et si tu trouves pas d'erreur executes la sur mysql directement il te sortiras l'erreur exacte.

Reply

Marsh Posté le 02-05-2014 à 11:26:58    

Je pense que le problème est en fait au niveau du parcours des tableaux;, il ya toujours une erreur au niveau de l'indice 0

Reply

Marsh Posté le 02-05-2014 à 11:45:25    

svp aidez moi c'est urgent :/

Reply

Marsh Posté le 02-05-2014 à 13:33:08    

LolitaLoulou a écrit :

j'ai remplacé Numero_Serie[0] par Numero_Serie[] et c'est bon pour la récupération des données mais maintenant il y a l'erreur svte: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use


 
Si c'est toujours la même erreur affiche ta requete executée et regarde si tu n'as pas une erreur de syntaxe.

Reply

Marsh Posté le 02-05-2014 à 13:36:31    

Et si c'est une erreur de boucle comme tu dis utilises plutot foreach que while, c'est le plus adapté pour parcourir un array  

Reply

Marsh Posté le 02-05-2014 à 14:54:29    

lorsque j'ai fait un echo pour la requete seulement la dernière ligne remplie est affichée, et je sais pas comment remplacer la boucle qui j'ai utilisé par la boucle foreach  

Reply

Marsh Posté le 02-05-2014 à 15:09:18    

Comme ton code n'était pas très lisible .... j'avais pas remarquer que ton mysql_query était en dehors de la boucle donc il ne te fais qu'un insert...
je te poste le code plus tard
 
edit:
c'est bon j'ai compris ce que tu voulais faire, je te poste le code dans une dizaine de minutes.


Message édité par deejay59 le 02-05-2014 à 15:15:19
Reply

Marsh Posté le 02-05-2014 à 15:20:08    

Ah oui c'était ça le problème maintenant lorsque j'ai inclus la requete dans la boucle , le code marche et l'ajout se fait avec succès.  
Merci infiniment pour votre aide Deejay59 :)
J'aime bien voir ton code, merci de le poster jtt


Message édité par LolitaLoulou le 02-05-2014 à 15:20:58
Reply

Marsh Posté le 02-05-2014 à 15:22:08    

tiens un code plus propre:
 

Code :
  1. foreach($_POST['Numero_Serie'] AS $key => $valeur){
  2. $value[]="('',
  3. '".mysql_real_escape_string($valeur)."','".mysql_real_escape_string($_POST['Code_Article'][$key])."','".mysql_real_escape_string($_POST['Article'][$key])."','".mysql_real_escape_string($_POST['Famille'][$key])."','".mysql_real_escape_string($_POST['Version'][$key])."','".mysql_real_escape_string($_POST['Emplacement'][$key])."','".mysql_real_escape_string($_POST['Designation'][$key])."','".$Numero_Bon_Entree."')";
  4. }
  5. mysql_query("INSERT INTO `articles` (`Numero_Serie`, `Code_Article`,`Carte`,`Famille`,`Version`, `Emplacement`, `Designation`,`Numero_Bon_Entree`) VALUES ".implode(',',$value).";" ) or die (mysql_error());


 
ce code est plus rapide car une seule requete d'insertion.


Message édité par deejay59 le 02-05-2014 à 15:23:51
Reply

Marsh Posté le 02-05-2014 à 15:35:40    

oui ça marche aussi, merci pour l'aide . C'est résolu :)

Reply

Marsh Posté le 02-05-2014 à 15:39:59    

je viens de remarquer une erreur en plus dans ta requetes, tu veux inserer 8 champs tu indiques en values 9 valeurs... je presume que c'est le '' du début qui est inutile
 
 

Code :
  1. foreach($_POST['Numero_Serie'] AS $key => $valeur){
  2.     $value[]="('".mysql_real_escape_string($valeur)."','".mysql_real_escape_string($_POST['Code_Article'][$key])."','".mysql_real_escape_string($_POST['Article'][$key])."','".mysql_real_escape_string($_POST['Famille'][$key])."','".mysql_real_escape_string($_POST['Version'][$key])."','".mysql_real_escape_string($_POST['Emplacement'][$key])."','".mysql_real_escape_string($_POST['Designation'][$key])."','".$Numero_Bon_Entree."')";
  3.     }
  4.     mysql_query("INSERT INTO `articles` (`Numero_Serie`, `Code_Article`,`Carte`,`Famille`,`Version`, `Emplacement`, `Designation`,`Numero_Bon_Entree`) VALUES ".implode(',',$value).";" ) or die (mysql_error());

Reply

Marsh Posté le 02-05-2014 à 17:16:32    

Bon j'ai tapé ce code et ça marche bien:

Code :
  1. while(isset($_POST['Numero_Serie'][++$i]))
  2. {
  3. $value ="".mysql_real_escape_string($_POST['Numero_Serie'][$i])."','".mysql_real_escape_string($_POST['Code_Article'][$i])."','".mysql_real_escape_string($_POST['Article'][$i])."','".mysql_real_escape_string($_POST['Famille'][$i])."','".mysql_real_escape_string($_POST['Version'][$i])."','".mysql_real_escape_string($_POST['Emplacement'][$i])."','".mysql_real_escape_string($_POST['Designation'][$i]).""; 
  4. $value=substr($value,0,-1);
  5. mysql_query( "INSERT INTO `articles`(`Numero_Serie`, `Code_Article`,`Carte`,`Famille`,`Version`, `Emplacement`, `Designation`,`Numero_Bon_Entree`) VALUES ('".$value."','".$Numero_Bon_Entree."')" ) ; }


Message édité par LolitaLoulou le 02-05-2014 à 17:17:47
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed