Utilisateur anonyme
-
Modifié par dinolam le 12/11/2016 à 16:37
Utilisateur anonyme -
16 nov. 2016 à 15:09
Bonjour à tous,
Je suis en train de réaliser un système de contrôle en ligne de mon tableau html5. J'aimerais quand je clique dans une cellule de mon tableau que je puisse éditer son contenu et l'enregistrer automatiquement dans la base de données.
J'arrive à avoir le focus sur une cellule et modifier son contenu. Mon problème c'est au niveau de l'update. Je pense que le souci vient de mes cellules puisqu'elles ont des indexes différents (col-index). Hors au niveau de ma BD mes champs ont le même id donc ils sont sur la même ligne dans une même table. Quand je fais une modification dans le première cellule tout va bien mais dès que je modifie la deuxième cellule son contenu est enregistré dans la première. Vu qu'elles ont le même id mais c'est juste les indexes des cellules qui sont différents.
Si quelqu'un peut m'aider à corriger ce problème. Je vous remercie par avance.
Ci-dessous le code:
Merci d'avoir pris le temps de me répondre.
Je n'ai pas de message d'erreur dans mon code. L'update se passe bien et ma requête ajax m'envoie un message de succès.
Le problème se situe au niveau de l'attribut l'attribut data-row-id :
<tr data-row-id="<?=$row['info_id'];?>">
. Mes deux cellules ont le même id (la même ligne) dans la table infos. Vu que dans le where de mon update je fais référence avec ce même id. Du coup quand je fais une modification dans une des cellules il l'enregistre toujours dans la première par defaut. Est-ce qu'il y a une alternative pour je puisse utiliser l'id mais distinguer mes cellules? Merci.
L'echo de $sql m'affiche ceci:
UPDATE infos SET info_titre = 'Je suis le titre de la cellule' WHERE info_id='1'
La ligne 18 correspond à l'index d'une cellule et l'id correspondant à un champ. Je les initialise à 0. Ils prennent les valeurs de col-index et info_id respectivement en fonction des cellules à modifier.
En fait mon problème est que les 2 cellules ont le même id dans ma table. C-à-d qu'elles représentent les contenus de mes colonnes. Vu que j'ai une seule ligne dans ma table je ne fais pas de boucle. Du coup il y a un seul id pour mes 2 cellules et si je fais un update avec la condition where, il l'enregistre toujours dans la première colonnes quelque soit la cellule modifiée.
En fait mon problème est que les 2 cellules ont le même id dans ma table. C-à-d qu'elles représentent les contenus de mes colonnes
Tu radotes.....
Du coup il y a un seul id pour mes 2 cellules
Tu as un seul ID .. qui correspond donc à la LIGNE correspondante de ta table.
Par contre, tes deux cellules sont identifiées (ou sont du moins sensées l'être...) par le "col-index"
Donc... je t'ai demandé si dans tes variables envoyées en POST à ton fichier php si la variable INDEX = 0 est bien la bonne valeur ou non ????
Perso.. dans le code html de te cellules, je remplacerai
col-index='1'
par :
data-index='1'
puis dans le code javascript :
data['index'] = $(this).attr('col-index');
A remplacer par :
data['index'] = $(this).data('index');
Une fois cela fait, vérifie que la cellule que tu modifie envoie bien le bon INDEX en ajax à ton fichier PHP..
J'étais bien répondu à propos de la variable index dans mon fichier php. Je récupère bien l'index qui correspond à une cellule. Mon problème est au niveau de l'enregistrement en base de données !!!
Dans ma requête update j'ai une condition where qui fait référence à l'id de ma table (info_id). Quand je fais une modification dans une cellule je veux l'enregistrer dans la colonne correspondante dans ma table. Mais ce n'est pas le cas parce que l'update se fait toujours dans la (première) colonne info_titre ou de fois dans toutes les colonnes en même temps. J'ai même enlevé la condition where pour tester mais sans résultat :
UPDATE infos SET ".$columns[$colIndex]." = '".$colVal."'
- Résultat de la requête première cellule: info_titre
id: 1
index : 0
val: Je suis le titre modifié de la cellule info_titre
- Résultat de la requête première cellule: info_contenu
id: 1
index : 1
val: Je suis le titre modifié de la cellule info_contenu
Puisque je n'arrive pas à me faire comprendre malgré les explications. Est-ce qu'il y a possibilité d'enregistrer mes infos dans un fichier à partir de mon tableau ?
Je récupère bien les bons indexes en fonction de la cellule. Donc pas de soucis à ce niveau ! Maintenant quand tu fais un update tu précises toujours la condition where pour indiquer dans quel champ tu veux apporter de modifications. Or les 2 champs info_titre et info_contenu dans la table infos sont référencés par un même id (= 1). La structure de ma table infos est : info_id, info_titre et info_contenu. Quand je fais un update par exemple du contenu du champ info_contenu avec la condition where. Je lui dis de m'enregistrer le contenu ou l'id = 1. La colonne info_titre à le même id puisque la requête cherche le premier champ qui a ce même id. Et donc il l'enregistre dans ce champ (info_titre) le contenu du champ info_contenu. Et si la modif est faite sur le champ info_titre il l'enregistre dans le même (c'est qui normal).
Maintenant trop assez parler. Si tu penses que mon problème n'est pas là, donnes-moi un exemple de code pour que je puisse tester et corriger si tu penses avoir compris mon problème.
Maintenant quand tu fais un update tu précises toujours la condition where pour indiquer dans quel champ tu veux apporter de modifications
NON
Le WHERE sert à indiquer l' ID de la ligne concernée... pas le CHAMP lui même.
Le champ lui est indiqué via le SET
Or les 2 champs info_titre et info_contenu dans la table infos sont référencés par un même id (= 1).
Oui ils sont (si on se représente la table de ta BDD comme un TABLEAU ) sur la même LIGNE
Par contre tu as bien un champ nommé info_titre et un autre nommé info_contenu
La structure de ma table infos est : info_id, info_titre et info_contenu
Nous sommes d'accord.
Ton code génèrera donc deux requêtes différentes (selon que tu modifie l'une au l'autre de tes cellules )
UPDATE infos SET info_titre = 'Je suis le titre de la cellule' WHERE info_id='1'
UPDATE infos SET info_contenu = 'Je suis le contenu de la cellule' WHERE info_id='1'
Maintenant trop assez parler. Si tu penses que mon problème n'est pas là, donnes-moi un exemple de code pour que je puisse tester et corrige
TU parles en effet beaucoup ... tu répètes plusieurs fois la même chose... sans que ça ne serve à rien.....
Je ne te demande pas de répéter ton souci ... mais de répondre aux questions (pourtant simples) que je te pose. Cela dans le but de trouver où se situe ton problème justement !
Pour ce qui est de l'exemple de code.... je t'en ai donné un !
L'as tu regardé ????
As tu appliqué les conseils que je t'ai donné pour modifier ton code ????
Si tu ne corriges pas ton code en tenant compte de mes remarques et que tu ne réponds pas aux question que je te pose.... il me sera IMPOSSIBLE de t'aider.
Sachant que...
Je veux bien t'aider à trouver le souci.... mais pas le faire à ta place
<?php
// Fichier : ajax_request.php
//---------------------------------------//
// connexion à la db
require_once('db.php');
//define index of column
$columns = array( 0 =>'info_titre', 1 => 'info_contenu');
//récupération "propre" des variable)
$colVal = isset($_POST['val']) ? $_POST['val'] : "";
$colIndex = !empty($_POST['index']) ? $_POST['index'] : 0;
$rowId = !empty($_POST['id']) ? $_POST['id'] : NULL;
// Si un id est bien passé en paramètres
if($rowId){
//préparation de la requete et des variables
$sql = "UPDATE infos SET ".$columns[$colIndex]." = :colVal WHERE info_id = :rowId";
$datas = array(":colVal"=>$colVal , ":rowId"=>$rowId);
//exécution de la requete
try{
$req = $db->prepare($sql);
$req->execute($datas);
$msg = array('status'=>false
,'msg'=>'Saisie enregistrꥠavec success !'
,'debug'=>"");
}catch(Exception $e){
//erreur dans la requete
$msg = array( 'status'=>true
,'msg'=>'Erreur ! '.$e->getMessage()
,'debug'=>array("requete"=>$sql,"datas"=>$datas)
);
}
}else{
//pas d'ID
$msg = array('status'=>true
,'msg'=>"Erreur ! ID de ligne vide !!"
,'debug'=>$_POST);
}
// send data as json format
echo json_encode($msg);