Ajout d'un tableau dynamique en bdd
ismael-ouatt
Messages postés
78
Date d'inscription
Statut
Membre
Dernière intervention
-
ismael-ouatt Messages postés 78 Date d'inscription Statut Membre Dernière intervention -
ismael-ouatt Messages postés 78 Date d'inscription Statut Membre Dernière intervention -
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
Le code Javascript est le suivant :
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:
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 !
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 !
A voir également:
- Ajout d'un tableau dynamique en bdd
- Tableau croisé dynamique - Guide
- Tableau word - Guide
- Exemple tableau croisé dynamique télécharger - Télécharger - Tableur
- Trier un tableau excel - Guide
- Tableau ascii - Guide
2 réponses
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
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
Prenons les soucis un par un
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
Puis,
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 :
Fais donc un ECHO de la requête ... puis teste la DIRECTEMENT dans ta BDD (via phpMyadmin par exemple)
: 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)
en cherchant j'ai essayé de modifier mon code en mettant celui ci:
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:
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
$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
Où as tu vu que tu devais mettre un "." dans l''instruction
Tu fais n'importe quoi !
Donc...
Commence par remplacer tes blocs while par
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
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
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
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
merci, je vais voir avec la gestion des erreur en attendant espérant avoir la reponse à ma question
$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; }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
En même temps... je ne connais pas mais
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...