UPDATER plusieurs lignes à la fois...

Résolu
Bernard -  
 Bernard -
Bonjour,

J'ai un souci avec le UPDATE en php. En fait j'aimerais, pour chaque ligne de ma table, faire un calcul et inscrire le résultat avec UPDATE. Le problème c'est que TOUTES les lignes sont mises à jour avec une seule et même valeur. Voici mon bout de code :


$req = $bdd->prepare ("UPDATE test SET Prev_mois_en_cours=:nv_Prev_mois_en_cours"); 
$req->execute (array ('nv_Prev_mois_en_cours'=>ceil(($calcul1/$calcul2))));



Merci pour votre aide.

A voir également:

2 réponses

Utilisateur anonyme
 
Bonjour

La requête UPDATE utilisée sans condition (WHERE) met à jour toute la table. C'est son fonctionnement normal.

La façon de résoudre ton problème dépend des calculs que tu fais :
- soit le calcul porte sur les autres colonnes et peut être fait en une seule requête SQL, sans WHERE
- soit le calcul est trop compliqué pour être fait en une seule requête, et tu es obligé de faire une requête avec une condition WHERE pour ne modifier qu'une ligne à la fois. Tu dois alors boucler sur toutes tes lignes.

Peux-tu nous dire en quoi consistent tes calculs?
0
Bernard
 
Merci pour votre réponse.

Mes calculs utilisent les données de la même table. Voici par exemple le calcul 1 :
$calcul1=ROUND(($donnees ['machine1']
+$donnees ['machine2']
+$donnees ['machine3']
+$donnees ['machine4']
+$donnees ['machine5']),1)

C'est un calcul tout bête et même en utilisant un WHERE, je ne vois pas quoi mettre derrière...

Dernière chose, la valeur retournée (qui est donc toujours la même) est bonne pour la dernière ligne de ma table. C'est donc le résultat de la dernière ligne qui est reporté sur les autres.

Merci pour votre aide.
0
Utilisateur anonyme
 
Est-ce que machien1, machine2,... sot des champs de la même table ?
Si oui, et en oubliant le terme calcul2 dont tu ne donnes pas la définition, il suffirait de faire

$req = $bdd->exec ("UPDATE test SET Prev_mois_en_cours=ROUND(machine1+machine2+machine3+machine4+machine5,1)"); 

Pas besoin de boucle, la requête s'applique à chaque ligne de la table, mais en prenant les valeurs des champs de la ligne concernée à chaque fois. Si elle est applicable, c'est la solution la plus efficace.

Si le calcul est trop compliqué, il faut faire une boucle sur les lignes de ta table, et à chaque fois extraire extraire les valeurs dont tu as besoin, faire ton calcul, et faire la mise à jour. La condition du WHERE sera n'importe quoi permettant d'identifiant la ligne sur laquelle tu es en train de travailler, en général les tables ont un champ clé qui sert à ça. S'il n'y a pas de tel champ dans ta table, ça justifie d'en créer un.

(en espérant que je ne me trompe pas trop, j'utilise PDO depuis peu)

$req = $bdd->prepare ("UPDATE test SET Prev_mois_en_cours=:nv_Prev_mois_en_cours WHERE id=:id"); 
$stmt1=query (SELECT * FROM test);
while (($donnees=$stmt1->fetch(PDO:FETCH_ASSOC)) !== false) {
  // savants calculs sur ce que tu veux faire
  $req->execute (array ('nv_Prev_mois_en_cours'=>$resultat_des_savants_calculs, 'id'=>$donnees['id']));
} 
$stmt1 -> closeCursor();
0
Bernard
 
J'ai utilisé votre première méthode et ça fonctionner parfaitement !
Merci beaucoup !!
0