7935 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

Oui, effectivement je vais avoir pas mal d'autres valeurs à passer. Ici il n'y en a que 2 (ID et nom), parce que je ne veux pas alourdir le code pour un premier jet. J'y vois plus clair.
biduletruck a écrit :

Le problème ici c'est que chaque ligne de $_POST correspond à un tableau.
Donc id2 et nom2 n'ont pas de relation direct du coup il va falloir ruser.

Je pensais que $_Post m'avait envoyé un tableau multidimensionnel? Il n'envoie que des tableaux associatifs?

Tu veux dire qu'il faudrait que je fasse une requête du genre:
$id=$_POST[ID];
maj->bdd(UDPATE test SET nom=$ligne[nom$id] WHERE ID=$ligne[ID$id]");

Modifié par bouffandt (21 Nov 2018 - 15:29)
Maintenant que j'y pense, ma requête n'enverra que "nom2" ou "nomx" au lieu de la donnée voulue. Je vais tester ça quand même...
Peut être faut-il que je reconstruise un array multidimensionnel a partir des données de $_post et qu'ensuite je fasse un foreach dessus?
Modifié par bouffandt (21 Nov 2018 - 21:44)
Dans ta structure tu envois tout le formulaire ? cela veux dire que tu envois potentiellement des données non modifiées ?

Si c'est le cas le plus simple serait à mon sens un update dynamique en AJAX à chaque sortie d'input.

En gros tu change un champs et quand tu sors de ce champs une requête AJAX envoi la modification en BDD.

Pour çà il suffit de récupérer l'id du groupe plus le champs et sa valeur.

Une fois que tu as ces paramètres tu fais une requête qui s'adapte à condition d'utiliser les mêmes valeure entre ta BDD et tes "name" de tes inputs, genre:




// $value = $valeurDuChamp;

// '/\D+/i' retourne tous les caractères d'une chaîne, fait en sorte d'avoir la même casse entre le BDD et le nommage des champs
//  '/\d+/' retourne tous les nombres d'une chaîne

// preg_match_all('/\D+/i', $value, $matches, PREG_SET_ORDER, 0) / retourne la valeur indiquée dans le regex. (ici toutes les caractères d'une chaîne)

preg_match_all('/\D+/i', $value, $nom, PREG_SET_ORDER, 0); //retourne $nom
preg_match_all('/\d+/i', $value, $id, PREG_SET_ORDER, 0); // retourne $id


maj->bdd("UDPATE test SET nom= $nom  WHERE ID= $id  );



je fais ça vite fait je te laisse tester Smiley cligne

du coup il te faudra faire la fonction AJAX pour ça Smiley langue
Modifié par biduletruck (22 Nov 2018 - 09:15)
biduletruck a écrit :

Dans ta structure tu envois tout le formulaire ? cela veux dire que tu envois potentiellement des données non modifiées ?

Effectivement: comme il n'y aura jamais plus de 40 enregistrements, je me suis dit que ça ne risquait pas de prendre trop de temps.

biduletruck a écrit :

Si c'est le cas le plus simple serait à mon sens un update dynamique en AJAX à chaque sortie d'input.

Je n'y connais rien en Ajax... Je vais essayer mais il me faudra sans doute quelques jours pour sortir un truc.
Donc ça me donnerait dans mon fichier initial "tableau.php":
<input type = "textarea" name="nom$id" value="$nom" //ma fonction ajax ici></input>

?
Du coup, avec ce système, ais-je encore besoin du fichier "modification.php"? Car si je comprends bien, la BDD est mise à jour en temps réel dès que je quitte le champ?

Sinon, que penses-tu de l'idée de récupérer les données de $_POST sous forme d'array multidimensionnel sur ce modèle:

//je me connecte à ma bdd (je zappe la commande mais on dit que c'est fait)
//en récupérant $id, je récupère la valeur de l'ID contenue dans la bdd, qui a servit à nommer dans "tableau.php" les "name" des différents input. De cette façon, je peux apparier correctement les ID et les noms (et plus tard les autres valeurs).
$id=(SELECT ID from test WHERE Voyage='Sicile');
while ($donnees = $_POST->fetch())
				{
$tableau=array(
   array($donnees[id$id], $donnees[nom$id])
				}

Je vais tester les 2 approches et je te tiens au courant
pour l'ajax il faudra une fonction qui intercepte les changements sur tous les inputs, en gros comme ça ( je pense que c'est à adapter et il te faudra JQuery aussi).

 <script>
        $("input").focusout(function(e){

$(function(){
			$.ajax(
				{
					type: "POST",
					data: {"id":$('id').val(),"nom":$('nom').val()},
					url: "modification.php"
				}
			);
	});
}
    </script>


donc oui ta page modification.php est à garder celle qui va gérer le code php pour l'update.
En gros AJAX va juste envoyer les données (en arrière plan) à ta page modification.php

Sinon pour ta solution cela veux dire que tu vas encore régénérer des requêtes SQL pour reformater tes tableaux.

Alors sinon il te reste encore une solution une mise à jour unitaire.

Pour cela tu entoures chaque bloc par un form et du coup tu te retrouves avec 40 forms différents avec chacun son bouton update ... moins propre plus facile puisque tu pourras gérer facilement les id et les champs de formulaire (du ne passeras d'un seul champ nom par exemple) ...
Modifié par biduletruck (22 Nov 2018 - 14:52)
biduletruck a écrit :
Alors sinon il te reste encore une solution une mise à jour unitaire.

Pour cela tu entoures chaque bloc par un form et du coup tu te retrouves avec 40 forms différents avec chacun son bouton update ... moins propre plus facile puisque tu pourras gérer facilement les id et les champs de formulaire (du ne passeras d'un seul champ nom par exemple) ...

Ca ressemble un peu à ce que j'ai mis en place jusqu'ici, en moins compliqué. Je vais garder cette solution sous le coude si je n'arrive pas à mettre en oeuvre l'ajax.
biduletruck a écrit :
pour l'ajax il faudra une fonction qui intercepte les changements sur tous les inputs, en gros comme ça ( je pense que c'est à adapter et il te faudra JQuery aussi).

Je suis une bille en Javascript (sorti du html, css et un peu sql/php, je suis largué) mais je vais essayer. De toute façon il faut que je m'y mette! Je tente de poster un truc d'ici la fin du weekend.

Merci de ta patience!
Bonjour!
j'ai uploadé jquery sur mon serveur et ajouté
<script type="text/javascript" src="jquery-3.3.1.min.js"></script>

dans le <head> de mes pages.

J'ai ajouté

<script>
        $("input").focusout(function(e){

$(function(){
			$.ajax(
				{
					type: "POST",
					data: {"id":$('id').val(),"nom":$('nom').val()},
					url: "modification.php"
				}
			);
	});
}
    </script>

A la fin du fichier "tableau.php". et j'ai ajouté la classe "ajax" à tous mes inputs:
echo"<tr>";
					echo "<td style='border:1px solid black; font-weight:bolder; display:none'><input type='hidden' name="; echo"id$donnees[ID]"; echo" value='$donnees[ID]' class='ajax'></input></td>";
					echo "<td style='border:1px solid black; font-weight:bolder'><input type='textarea' name='";
				    echo"nom$donnees[ID]";
					echo"' value='$donnees[nom]' class='ajax'></input></td>";
				echo"</tr>";

Enfin, j'ai ajouté:
preg_match_all('/\D+/i', $value, $nom, PREG_SET_ORDER, 0); //retourne $nom
preg_match_all('/\d+/i', $value, $id, PREG_SET_ORDER, 0); // retourne $id


$maj=$bdd->query("UDPATE test SET nom= '$nom'  WHERE ID= '$id'");

dans le fichier "modification.php".
J'ai un message d'erreur fatale:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UDPATE test SET nom= 'Array' WHERE ID= 'Array'' at line 1'

Si je comprends bien, ça coince parceque les données sont présentées sous forme de tableau alors que la requête préférerait les traiter une par une?
un var_dump($_POST) montre que les données ont bien été envoyées...
salut,

alors pense à adapter les exemples que je te donne Smiley cligne

Sinon fait un export du var_dump pour que nous puissions voir le résultat stp.

Mais d’après le message il semblerait bien que se soit un array
Bonsoir,
j'ai réessayé, mais je ne parviens à aucun résultat. Je ne parviens pas à voir ce qu'il faut adapter ni comment. Voici le code complet de mes fichiers:
tableau.php:
<html lang="fr">
<head>
	<meta charset="utf-8">
	<title>AccueilTest</title>
	<link rel="stylesheet" href="style.css">
	<script type="text/javascript" src="jquery-3.3.1.min.js"></script>
	<LINK rel=STYLESHEET href="stylesformulaires.css" type="text/css">
<script>
        $("input").focusout(function(e){

$(function(){
			$.ajax(
				{
					type: "POST",
					data: {"id":$('id').val(),"nom":$('nom').val()},
					url: "modification.php"
				}
			);
	});
}
    </script>
	</head>
<body>
<div class="titre">Liste des élèves inscrits au voyage en Sicile</div>
<div class="formulaire" style="width:auto">
<form method="post" name="form" action="modification.php">
<table class="table">
	<tbody>
    <tr>
		<th style="font-size:1em; vertical-align:bottom; width:auto; text-align:left">Nom</th>
	</tr>
</div>
<?php 
//on se connecte à la base de données
try
	{
		$bdd = new PDO('mysql:host=sql.free.fr;dbname=mabase;charset=utf8', 'monid', 'motdepasse');
		$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	}
	catch(Exception $e)
	{
		die('Erreur : '.$e->getMessage());
	}
//on recherche les noms des participants, ce qui va servir plus bas
$reponse = $bdd->query('SELECT * FROM test where voyage="Sicile" ORDER BY nom');
// cette boucle organise les données dans un tableau
while ($donnees = $reponse->fetch())
		{
			echo"<tr>";
					echo "<td style='border:1px solid black; font-weight:bolder; display:none'><input type='textarea' id='$donnees[ID]' name='ID' value=$donnees[ID]'></input></td>";
					echo "<td style='border:1px solid black; font-weight:bolder'><input id='$donnees[ID]' type='textarea' name='nom' value='$donnees[nom]'></input></td>";
				echo"</tr>";	
		}
//fin des fonctions php.
$reponse->closeCursor();
?>
</table>
<input type="submit" value="envoyer">
</form>
</div>
</body>
</html>


modification.php
<?php
// On prolonge la session
session_start();
// On teste si la variable de session existe et contient une valeur
if(empty($_SESSION['password'])) 
{
  // Si inexistante ou nulle, on redirige vers le formulaire de login
header('Location:password.php');
  exit();
}
?><!doctype html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Modifier un participant au voyage</title>
  <link rel="stylesheet" href="style.css">
  <script type="text/javascript" src="jquery-3.3.1.min.js"></script>
  <LINK rel=STYLESHEET href="../stylesformulaires.css" type="text/css">
</head>
<body>
	<?php
try
{
	$bdd = new PDO('mysql:host=sql.free.fr;dbname=mabase;charset=utf8', 'monid', 'motdepasse');//$bdd c'est le nom de la fonction de connection à la base
	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
	die('Erreur : '.$e->getMessage());
} 

preg_match_all('/\D+/i', $value, $nom, PREG_SET_ORDER, 0); //retourne $nom
preg_match_all('/\d+/i', $value, $id, PREG_SET_ORDER, 0); // retourne $id  
?>
<pre>
<?php var_dump($_POST); ?>
</pre>

</body>
</html>


Un var_dump sur $_POST donne :
array(22) {
  [2]=>
  string(1) "2"
  [3]=>
  string(1) "3"
  [4]=>
  string(1) "4"
  [5]=>
  string(1) "5"
  [6]=>
  string(1) "6"
  [7]=>
  string(1) "7"
  [8]=>
  string(1) "8"
  [9]=>
  string(1) "9"
  [35]=>
  string(6) "André"
  [14]=>
  string(8) "Bouffand"
  [15]=>
  string(8) "Bouffand"
  [37]=>
  string(8) "Bouffand"
  [36]=>
  string(8) "Bouffand"
  [43]=>
  string(6) "Clouet"
  [41]=>
  string(9) "Lenouveau"
  [11]=>
  string(5) "Louis"
  [12]=>
  string(5) "Louis"
  [40]=>
  string(7) "Nouveau"
  [39]=>
  string(7) "Nouveau"
  [38]=>
  string(7) "Nouveau"
  [13]=>
  string(5) "Petit"
  [10]=>
  string(7) "Thierry"
}

mais je pense que ce sont les données transmises par le bouton "submit" et qu'ajax n'a rien à voir dedans (sans bouton, rien ne se passe).
Modifié par bouffandt (24 Nov 2018 - 19:03)
Bon dimanche,

voici un exemple, j'ai adapté ton fichier tableau.php pour pouvoir y travailler donc il faudrat repasser dessus, mais en gros voici les grandes ligne.

Tu verras que dans l'inspecteur a chaque fois que tu sortiras de la celule les données seront envoyées à modification.php (sans changement de page Smiley cligne )

Si tu ajoutes des colonnes il faudra adapter mais le code jquery s'exécute dans tous les inputs des que tu sors de celui-ci.
Au final tu n'as pas besoin de bouton de validation à la suite du tableau.

Une autre chose il est préférable de définir le css de ton tableau et de tes TR et TD directement dans le fichier CSS et non dans le code.
Passes par des class

il est préférable de faire :


<td class = 'maClassDeTD' >



maClassDeTD{
/* mes valeurs;
}


QUE


<td style='border:1px solid black; font-weight:bolder'>



Au final la page modification peux faire sont traitement en base et pas besoin de boucle car tu n'envois qu'un bloc de données ici 1 id , un nom et le name = le nom du champs
Avec toutes ces infos tu pourras faire ta requête dynamiquement du genre:


// A mettre dans modification.php

$name = $_POST['name '];
$nom = $_POST['nom '];
$id  = $_POST['ID'];

maj->bdd("UDPATE nomTable SET " .  $name .  " = " . $nom . " WHERE ID= " . $id . ");



tableau.php


<html lang="fr">
<head>
    <meta charset="utf-8">
    <title>AccueilTest</title>
<!--    <link rel="stylesheet" href="style.css">
    <script type="text/javascript" src="jquery-3.3.1.min.js"></script> -->
    <script
        src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous"></script>
  <!--  <LINK rel=STYLESHEET href="stylesformulaires.css" type="text/css"> -->

</head>
<body>
<div class="titre">Liste des élèves inscrits au voyage en Sicile</div>
<div class="formulaire" style="width:auto">
    <form method="post" name="form" action="modification.php">
        <table class="table">
            <tbody>
            <tr>
                <th style="font-size:1em; vertical-align:bottom; width:auto; text-align:left">Nom</th>
            </tr>
                <?php
                $valuesTest = [
                    ['ID'=>14,'nom'=>'André'],
                    ['ID'=>15,'nom'=>'Bouffand'],
                    ['ID'=>37,'nom'=>'Thierry'],
                    ['ID'=>36,'nom'=>'Bouffand'],
                    ['ID'=>43,'nom'=>'Bouffand'],
                    ['ID'=>41,'nom'=>'Clouet'],
                    ['ID'=>11,'nom'=>'Lenouveau'],
                    ['ID'=>12,'nom'=>'Louis'],
                    ['ID'=>40,'nom'=>'Louis'],
                    ['ID'=>39,'nom'=>'Nouveau'],
                    ['ID'=>38,'nom'=>'Nouveau'],
                    ['ID'=>13,'nom'=>'Nouveau'],
                    ['ID'=>10,'nom'=>'Petit'],
                ];
               //on se connecte à la base de données
            /*    try
                {
                    $bdd = new PDO('mysql:host=sql.free.fr;dbname=mabase;charset=utf8', 'monid', 'motdepasse');
                    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                }
                catch(Exception $e)
                {
                    die('Erreur : '.$e->getMessage());
                }
                //on recherche les noms des participants, ce qui va servir plus bas
                $reponse = $bdd->query('SELECT * FROM test where voyage="Sicile" ORDER BY nom'); */
                // cette boucle organise les données dans un tableau
              //  while ($donnees = $reponse->fetch()) {
                foreach ($valuesTest as $donnees){ ?>

                <tr>
                    <td style='border:1px solid black; font-weight:bolder'>
                        <input id='<?= $donnees['ID'] ?>' type='text' name='nom' value='<?= $donnees['nom'] ?>' >
                    </td>
                </tr>
                <?php } ?>
        </table>
    </form>
</div>

<script>
    $( "input" ).focusout(function(e) {
       e.preventDefault();
            $.ajax(
                {
                    type: "POST",
                    data: {"id":e.target.id,"nom": e.target.value, "name":e.target.name},
                    url: "modification.php"
                }
            );
        });
</script>
</body>
</html>


modification.php


<?php

echo '<pre>';
var_dump($_POST);
echo '<pre>';
die();


upload/1543136388-64856-capture.png
pour info tu n'as plus besoin de ça


preg_match_all('/\D+/i', $value, $nom, PREG_SET_ORDER, 0); //retourne $nom
preg_match_all('/\d+/i', $value, $id, PREG_SET_ORDER, 0); // retourne $id

Modifié par biduletruck (25 Nov 2018 - 10:07)
Merci beaucoup! c'est vraiment cool d'avoir fait tout ce boulot! Il n'y a eu que quelques détails à adapter. Le transfert des données se passe parfaitement. Le var_dump sur les 3 variables ($name, $nom, $id) donne:
string(3) "nom"
string(7) "Aragorn"
string(1) "2"

Par contre ma requête rencontre un problème. J'ai adapté ton code comme suit:
$maj=$bdd->query("UDPATE test SET $name = '$nom' WHERE ID='$id' ");
$maj->execute();

Ce code ne m'avais jamais posé de problème jusqu'ici, mais là on me renvoie une erreur de syntaxe:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UDPATE test SET nom = 'Aragorn' WHERE ID='2'' at line 1'

J'ai revérifié tout ce code, je ne vois pas ce qui peut causer l'erreur de syntaxe. Apparemment ce ne sont pas les variables.
Salut,

Pas de pb Smiley cligne

Par contre:

1- je te déconseille très FORTEMENT de faire un update de cette façon:

$maj=$bdd->query("UDPATE test SET $name = '$nom' WHERE ID='$id' ");

Là tu envois des données sans aucune protection ... Et tu ne dois JAMAIS faire confiance à l’utilisateur.

2- comme l'indique la doc php:
PDO::query — Exécute une requête SQL, retourne un jeu de résultats en tant qu'objet
http://php.net/manual/fr/pdo.query.php

donc dans ton cas voilà pourquoi cela ne fonctionne pas.

3- Pour faire un update (ou un insert) tu peux utiliser:
- soit EXEC() => PDO::exec — Exécute une requête SQL et retourne le nombre de lignes affectées
http://php.net/manual/fr/pdo.exec.php
Mais je te le déconseille dans un update ou un insert (pb de sécurité) ou alors pour certains cas spécifiques.

- soit (et ma préférence) PREPARE() => PDO::prepare — Prépare une requête à l'exécution et retourne un objet
http://php.net/manual/fr/pdo.prepare.php


$sql = $bdd->prepare("UPDATE test SET :NAME = :NOM WHERE ID = :ID");
$sql ->bindParam(':NAME ', $name);
$sql ->bindParam(':NOM ', $nom);        
$sql ->bindParam(':ID', $id);   
$sql ->execute();



bon courage
Modifié par biduletruck (26 Nov 2018 - 09:22)
Meilleure solution
Tu as raison (comme pour le css d'ailleurs). J'ai rectifié le code:
$sql = $bdd->prepare("UPDATE test SET $name=':NOM' WHERE ID=':ID'");
//$sql->bindParam(':NAME',$name,PDO::PARAM_STR);
$sql->bindParam(':NOM',$nom,PDO::PARAM_STR);        
$sql->bindParam(':ID',$id,PDO::PARAM_STR);   
$sql->execute();

Ceci étant, la modification ne se fait pas dans la base. Par ailleurs, j'ai commenté
$sql->bindParam(':NAME',$name,PDO::PARAM_STR);
et remplacé :NAME par $name dans la requête car sinon j'ai une erreur du type "Invalid parameter number: number of bound variables does not match number of tokens" pour le statement "execute".
Modifié par bouffandt (26 Nov 2018 - 14:46)
Si ça se trouve ça vient du fait qu'au lieu de
$sql->bindParam(':ID',$id,PDO::PARAM_STR); 

Je devrais mettre
$sql->bindParam(':ID',$id,PDO::PARAM_INT); 

?
Modifié par bouffandt (26 Nov 2018 - 14:58)
Je teste ça dès que je rentre chez moi. Par ailleurs, comme finalement je vais transmettre bien d'autres données via le script ajax, j'ai renommé quelques variables:
<script>
    $( "input" ).focusout(function(e) {
       e.preventDefault();
            $.ajax(
                {
                    type: "POST",
                    data: {"id":e.target.id,"valeur": e.target.value, "champ":e.target.name},
                    url: "modification.php"
                }
            );
        });
</script>

et j'ai répercuté ce renommage dans modification.php:
$champ=$POST['champ'];
$valeur=$_POST['valeur'];
$id=$_POST['id'];

$sql = $bdd->prepare("UPDATE test SET $champ=':VALEUR' WHERE ID=':ID'");
$sql->bindParam(':VALEUR',$valeur,PDO::PARAM_STR);        
$sql->bindParam(':ID',$id,PDO::PARAM_INTSSTR 
$sql->execute();


Dans la mesure où $champ répercute uniquement le "name" de l'input, et que l'utilisateur ne peut pas le modifier, il n'y a peut-être pas d'inconvénient à le mettre directement dans la requête?

A la fin, il faudra que tu fasse un tuto avec tout ce code Smiley cligne !
Modifié par bouffandt (26 Nov 2018 - 16:33)
En ait l'erreur venait de moi: j'ai échappé :VALEUR et ID... Maintenant tout fonctionne bien! Si je récapitule les codes fonctionnels, ça donne:

tableau.php
<doctype html>
<html lang="fr">
<head>
    <meta charset="utf-8">
    <title>Mon titre</title>
    <script
        src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous"></script>
</head>
<body>
Liste des inscrits
<form method="post" name="form" action="modification.php">
        <table>
            <tbody>
            <tr>
                <th>Nom</th>
            </tr>
                <?php
                //on se connecte à la base de données
			try
                {
					$bdd = new PDO('mysql:host=monhebergeur;dbname=mabase;charset=utf8', 'monid', 'motdepasse')
					$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                }
                catch(Exception $e)
                {
                    die('Erreur : '.$e->getMessage());
                }
                //on recherche les noms des participants, ce qui va servir plus bas
                $reponse = $bdd->query('SELECT * FROM mabase where //mes conditions ORDER BY nom');
                // cette boucle organise les données dans un tableau
                 foreach ($reponse as $donnees){ ?>

                <tr>
                    <td>
                        <input id='<?echo"$donnees[//indiquer ici le champ Index de la base]";?>' type='text' name='//indiquer ici le nom du champ à mettre à jour' value='<?echo"$donnees[//indiquer le nom du champ à mettre à jour]";?>' >
                    </td>
<!--on multiplie autant que nécessaire les champs à modifier dans les cellules du tableau, en faisant attention à mettre les balises <th> correspondantes dans la ligne de titre-->                </tr>
                <?php } 
				//fin des fonctions php.
				$reponse->closeCursor();
				?>
        </table>
    </form>

<script>
//transfert automatique des modifications du champ lorsque l'on quitte l'input:
    $( "input" ).focusout(function(e) {
       e.preventDefault();
            $.ajax(
                {
                    type: "POST",
                    data: {"id":e.target.id, "valeur": e.target.value, "champ":e.target.name},
                    url: "modification.php"
//id= valeur de la clé d'index dans la base pour modifier le bon enregistrement
//valeur = contenu de la cellule modifiée
//champ = cette donnée contiendra le nom du champ à modifier
//pas besoin de bouton "submit"!
                }
            );
        });
</script>
</body>
</html>


modification.php
<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Modifier un participant au voyage</title>
  <link rel="stylesheet" href="style.css">
  <script
        src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous"></script>
  <LINK rel=STYLESHEET href="../stylesformulaires.css" type="text/css">
</head>
<body>
	<?php
try
{
					$bdd = new PDO('mysql:host=monhebergeur;dbname=mabase;charset=utf8', 'monid', 'motdepasse')
					$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
	die('Erreur : '.$e->getMessage());
} 
//ces variables vont récupérer les données transmises par la fonction ajax via la méthode POST
$champ=$_POST['champ'];
$valeur=$_POST['valeur'];
$id=$_POST['id'];

//la requête qui va mettre à jour la base avec les données récupérées
$sql = $bdd->prepare("UPDATE test SET $champ=:VALEUR WHERE ID=:ID");
$sql->bindParam(':VALEUR',$valeur,PDO::PARAM_STR);        
$sql->bindParam(':ID',$id,PDO::PARAM_INT);
//évidemment il faut un $sql->bindParam pour chaque champ à mettre à jour
$sql->execute();
?>
</body>
</html>


Il ne me restera plus qu'à créer des scripts spécifiques pour les différents types d'input, comme les case à cocher par exemple. Tu crois que celui-ci pourrait marcher?

<script>
    $( "input" [type="checkbox"] ).on('click' function(e) 
		{
       e.preventDefault();
	   if(this).checked=true
			{
            $.ajax(
                {
                    type: "POST",
                    data: {"id":e.target.id,"valeur": e.target.value, "champ":e.target.name},
                    url: "modification.php"
                }
			}
		else
			{
				$.ajax(
                {
                    type: "POST",
                    data: {"id":e.target.id,"valeur": return "", "champ":e.target.name},
                    url: "modification.php"
                }
			}
            );
        });
</script>

[edit: vérification faite, il fonctionne à condition que l'attribut "value" de la checkbox soit codé ainsi:
value='<?php if ($donnees[nomduchampcheckbox] == 'oui') {echo "non";} else {echo"oui";} ?>'
]
Modifié par bouffandt (26 Nov 2018 - 22:59)
C'était le but Smiley cligne

mais perso j'aurai fait un truc comme cela pour ton script JS


<script>
//ici on récupère le changement de tous les inputs et en fonction on envoi les bonnes valeurs
  $('input').change(function(e) {
    if (e.target.type == 'checkbox')
      {
//e.target.checked renvoi True ou False - donc si dans ta base ton champs est un boolean tu pourras le gérer automatiquement
        sendDatas(e.target.id,e.target.name,e.target.checked)
      }
    else
      {
       sendDatas(e.target.id,e.target.name,e.target.value)
      }
  });
  
 //fonction ne je gérant que la partie AJAX
  function sendDatas(id,name,value){
    // console.log(id,name,value)
    $.ajax(
            {
              type: "POST",
              data: {"id":id, "valeur": value, "champ":name},
              url: "modification.php"
            }
          )
  };
</script>