Ajout d'un tableau dynamique en bdd

Fermé
ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018 - 1 déc. 2016 à 16:58
ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018 - 4 déc. 2016 à 13:45
Bonjour, Je reviens encore vous déranger avec mes histoires ennuyeux
A partir de certain tuto j'ai pu concevoir ce code. il s'agit d'un tableau dynamique. il va permettre d'enregistrer les données d'une opération. La troisième colonne est la différence des deux premières colonnes. L'ajout et la suppression de ligne sont effectué de façon dynamique.
le tableau a été conçu avec HTML et javascript
voici le code HTML
<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="#" rel="nofollow noopener noreferrer" target="_blank" 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="#" rel="nofollow noopener noreferrer" target="_blank" onclick="delLigne(this)">Supp</a></td>
        </tr>
    </tbody>
</table>


Le code Javascript est le suivant :
/*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;
}


Le problème est que je veux envoyer toutes les informations du tableau dans ma bdd.
mais je ne sais comment m'y prendre

jeme suisinspirer d'un code obtenu sur un forum, et j'ai tous fais pour bricoler un code php pour la sauvegarde en bdd mais rien ne marche. voici le php:
$value = array();
$i = 0;
while(isset($_POST['vst'][++$i])) {
 $value[] = "('', '".mysql_real_escape_string($_POST['vst'][$i])."', '".mysql_real_escape_string($_POST['ve'][$i])."', '".mysql_real_escape_string($_POST['ecart'][$i])."')";
}
 
//mysql_query("INSERT INTO tableau VALUES ".implode(', ', $value)) or die(mysql_error());
$req=$bdd->prepare('INSERT INTO tableau(val_st,val_et,ecart) VALUES(".implode(",",$value).")');


j'espère avoir donnée suffisamment d'info, désolé pour le dérangement mais ça fait maintenant plusieurs jours que je cherche à sauvegarder un tableau dynamique en bdd.
J'utilise wampserver
merci !

2 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
1 déc. 2016 à 17:38
Bonjour,

Déjà.. comme indiqué dans ta discussion précédente... pourquoi vouloir stocker le calcul en BDD alors qu'il ne s'agit que d'une soustraction .. et donc qu'une simple requete permet de connaitre le résultat....

Ensuite... tu mélanges l'ancienne extension MYSQL considérée comme obsolète... avec du PDO......

Je ne vois d'aillleurs pas dans ton code... le code qui te sert à te connecter à ta BDD.
regardes ici comment faire proprement: https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs




0
ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018 1
Modifié par ismael-ouatt le 1/12/2016 à 18:13
juste un aperçu pour l'utilisateur, on peux neanmoin utiliser une requete qui va nous permettre d'enregistrer les deux premieres cellules ??? c'est la methode pour l'incersion que je cherche
merci, je vais voir avec la gestion des erreur en attendant espérant avoir la reponse à ma question
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018
Modifié par jordane45 le 1/12/2016 à 18:23
Lorsque tu auras activé la gestion des erreurs... tu verras que tu as un souci sur ta requête
$req=$bdd->prepare('INSERT INTO tableau(val_st,val_et,ecart) VALUES(".implode(",",$value).")')


A la limite...ça serait plutôt comme ça :
$datas = implode(",",$value);
$sql = "INSERT INTO tableau(val_st,val_et) VALUES ".$datas;
try{
  $req=$bdd->prepare($sql);
  $req->execute();
}catch(Exception $e){
  echo "Erreur :".$e->getMessage();
  echo "<br>Requete :".$sql;
  
}
0
ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018 1
Modifié par ismael-ouatt le 1/12/2016 à 18:52
L'erreur affichée est maintenant
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) VALUES


je cherche toujours comment remedier à celà
pauvre débutant, ma tete est tellement surchargé avec la fatigue que je n'arrive plus à trouver aussi vite les solution pffffff
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018
1 déc. 2016 à 19:28
Il semble que la variable $datas soit vide.

En même temps... je ne connais pas
++i
mais
$i++
0
ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018 1
2 déc. 2016 à 13:29
desolé pour le temps mis avant de répondre, j'etais beaucoup pris
je revien sur mon fameux code
voila d'abord desolé pour le $i++, ça m'avait echappé, c'est corigé mais malgré ma recherche toujour un message d'erreur 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 un donnée et que je la valide avec submit on me signale plusieurs erreurs à ce niveau: $value[] = "('', '".mysql_real_escape_string($_POST['vst'][$i])."', '".mysql_real_escape_string($_POST['ve'][$i])."')";

: Deprecated: mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in .c:\...

Warning: mysql_real_escape_string(): Acc�s refus� pour l'utilisateur: ''@'@localhost' (mot de passe: NON) in c:\...

Warning: mysql_real_escape_string(): A link to the server could not be established in C:\....

Deprecated: mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\.....


Warning: mysql_real_escape_string(): Acc�s refus� pour l'utilisateur: ''@'@localhost' (mot de passe: NON) in C:\.....


Warning: mysql_real_escape_string(): A link to the server could not be established in C:\....


Notice: Undefined offset: 2 in C:\w.....

et ainsi de suite...

je crois que l'erreur doit etre au niveau de mysql_real_escape_string(), je cherche à mieux connetre cette methode pour voire l'erreur...
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
2 déc. 2016 à 14:05
Prenons les soucis un par un
: Deprecated: mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in .c:\..

Voir ceci :
https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete#top

Le souci étant que tu as laissé des instructions mysql_.... dans ton code.
Alors que le reste est fait en PDO....


Une fois que tu auras correctement réécris le code... en retirant les appels à de vielles fonctions mysql (et dont que tu laissera tout en PDO)
tous ces messages d'erreur disparaîtront

: Deprecated: mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in .c:\...

Warning: mysql_real_escape_string(): Acc�s refus� pour l'utilisateur: ''@'@localhost' (mot de passe: NON) in c:\...

Warning: mysql_real_escape_string(): A link to the server could not be established in C:\....

Deprecated: mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\.....


Warning: mysql_real_escape_string(): Acc�s refus� pour l'utilisateur: ''@'@localhost' (mot de passe: NON) in C:\.....


Warning: mysql_real_escape_string(): A link to the server could not be established in C:\....


Puis,
Notice: Undefined offset: 2 in C:\w.....

Même si cela est très certainement lié au précédents messages d'erreur (voir ci-dessus)... tu peux tout de même éviter ce genre de message en traitement correctement les array
voir ici :
https://forums.commentcamarche.net/forum/affich-37636387-php-notice-undefined-index


Pour finir :

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)

Fais donc un ECHO de la requête ... puis teste la DIRECTEMENT dans ta BDD (via phpMyadmin par exemple)

0
ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018 1
Modifié par ismael-ouatt le 3/12/2016 à 11:21
en cherchant j'ai essayé de modifier mon code en mettant celui ci:
$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:
$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
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018
3 déc. 2016 à 12:14
Où as tu vu que tu devais mettre un "." dans l''instruction
while (isset($_POST['vst'][$i++])) 
{
    $vst[].=$_POST['vst'][$i];
}


Tu fais n'importe quoi !

Donc...
Commence par remplacer tes blocs while par
$vst = !empty($_POST['vst']) ? $_POST['vst'] : NULL;
$ve = !empty($_POST['ve']) ? $_POST['ve'] : NULL;
$ecart = !empty($_POST['ecart']) ? $_POST['ecart'] : NULL;


Ensuite.. fais des print_r de ces variables pour que tu vois ce qu'elles contiennent et viens nous poster le code modifier + le résultat des print ici
0
ismael-ouatt Messages postés 78 Date d'inscription mercredi 18 novembre 2015 Statut Membre Dernière intervention 26 juillet 2018 1
4 déc. 2016 à 13:45
désolé pour le temps mis avant de répondre,
en entrant comme valeur 12 dans vst et 11.5 dans ve, j’obtiens comme résultat avec print_r:

Array
(
[0] =>
[1] => 12
)

Array
(
[0] =>
[1] => 11.5
)


lorsque j'ajoute une ligne de plus pour y mettre des valeurs, l'index [0] ne contient aucune valeur, il commence à partir de l'index [1]
merci
0