Alors ça me parait pas simple hein !
Déjà j'utiliserai le formulaire de Carouge10 (j'ai juste mis des nom anglais pour les variables)
<?php foreach ($result as $value):?>
<input type="text" value="<?= $value->book_name; ?>" name="book_name_<?= $value->id; ?>">
</br>
<input type="text" value="<?= $value->quantity; ?>" name="quantity_<?= $value->id; ?>">
<?php endforeach; ?>
Bon sang ça me retourne la tête ce problème ^^
Mais je pense avoir trouvé.
Le truc c'est que,
instinctivement, on aimerait bien faire un UPDATE à chaque itération d'une boucle, et hop on en parle plus.
Le problème c'est qu'à chaque itération on a comme information, QUE
OU
On a BESOIN de 2 itérations pour avoir nos 3 informations, du coup on bloque...
C'est pour ça que je pense qu'il faut faire tout ça en 2 étapes :
- d’abord on construit un tableau bien formaté
- ensuite, on peut boucler sur ce tableau et faire un UPDATE à chaque itération
Le premier soucis à résoudre, c'est qu'au submit, on va recevoir
- "Moby Dick_0" (nom_livre et id)
- 12_0 (quantité et id)
Alors d'abord, on va créer 3 fonctions qui vont permettre d'isoler ces 3 variables :
- getId($str)
- getBookName($str)
- getQuantity($str)
Tu vas te servir des expressions régulières pour faire ça.
Maintenant qu'on a ces 3 fonctions,
on va créer un tableau vide :
$datas = array();
on boucle sur $_POST pour remplir ce tableau
Ce tableau, on va en faire un tableau de tableaux, qui ressemblera à ça :
$datas[0] = array("book_name" => "Moby Dick", "quantity" => 12)
$datas[1] = array("book_name" => ...
...
// la clé de $datas, correspondant à l'id du bouquin
La boucle n'est pas évidente :
foreach($_POST as $key => $value)
{
// on isole nos 3 variables
$id = getId($key);
// SI $key commence par 'nomLivre'
$book_name = getBookName($key);
// SINON (c'est que ça commence par 'quantity', j'imagine qu'on aura que ces 2 cas possible)
$quantity = getQuantity($key)
/* ici, on aura jamais nos 3 variables en même temps
on a QUE "le nom ET l'id" OU "la quantité ET l'id"
alors ça va pas être simple... */
// SI $quantity vaut null (on est dans le cas "nom ET id")
// SI $datas n'as pas de clé correspondant à $id
$datas[$id] = array("book_name" => $book_name);
// SINON (la clé existe)
// SI la clé $datas[$id]['book_name] n'existe pas
$datas[$id]['book_name'] = $book_name
// SINON (on est dans le cas "quantité ET id")
// on répète la même structure de IF/ELSE que dans le cas ("nom ET id"), en adaptant
}
J'ai écris ça assez vite alors ne prends pas tout au pied de la lettre parce-que l'algorithme n'est peut-être pas bon.
Fais des tests.
À partir d'ici, le plus difficile est derrière nous.
Maintenant il suffit simplement de boucler sur notre tableau $datas pour faire un UPDATE à chaque itération.
Par contre maintenant que j'ai écris mon "idée", je me dis que c'est quand même HYPER lourd.
Si tu as beaucoup de livres différents, ça va faire tellement de requêtes... Alors que parfois, peut-être qu'on aimerait faire un UPDATE sur seulement UN SEUL livre...
Soit on abandonne l'idée de permettre un UPDATE multiple.
Soit on pourrait peut-être créer ce tableau de tableaux $datas, AVANT de submit le formulaire,
et APRÈS avoir submit le formulaire, on construit un 2ème tableau $datas2, suivant exactement la même structure que $datas.
Comme ça dans une boucle, on compare les 2 tableaux, et on fait un UPDATE SEULEMENT s'il y a une différence.
Même si le tableau prend 10 000 livres, en construire un 2ème et faire des comparaisons, prendra moins de temps que faire 10 000 UPDATE en base de données, alors qu'on ne voulait faire que 10 UPDATE.