Signaler

Ajout d'un tableau dynamique en bdd

Posez votre question ismael-ouatt 39Messages postés mercredi 18 novembre 2015Date d'inscription 3 décembre 2016 Dernière intervention - Dernière réponse le 3 déc. 2016 à 12:14
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 !
Afficher la suite 
Utile
+0
moins plus
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: http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs




jordane45 15400Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 3 décembre 2016 Dernière intervention - 1 déc. 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;
  
}
Répondre
ismael-ouatt 39Messages postés mercredi 18 novembre 2015Date d'inscription 3 décembre 2016 Dernière intervention - 1 déc. 2016 à 18:49
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
Répondre
jordane45 15400Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 3 décembre 2016 Dernière intervention - 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++
Répondre
ismael-ouatt 39Messages postés mercredi 18 novembre 2015Date d'inscription 3 décembre 2016 Dernière intervention - 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...
Répondre
ismael-ouatt 39Messages postés mercredi 18 novembre 2015Date d'inscription 3 décembre 2016 Dernière intervention - 2 déc. 2016 à 13:43
j'ai cincu mon tableau à partir de ce site, je l'ai réadapté à mon code
http://www.cloudconnected.fr/2005/09/18/une-interface-de-formulaire-a-base-de-tableaux-dynamiques/
Répondre
Ajouter un commentaire
Utile
+0
moins plus
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 :
http://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 :
http://www.commentcamarche.net/faq/1391-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)

ismael-ouatt 39Messages postés mercredi 18 novembre 2015Date d'inscription 3 décembre 2016 Dernière intervention - 3 déc. 2016 à 10:32
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
Répondre
jordane45 15400Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 3 décembre 2016 Dernière intervention - 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
Répondre
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !