Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comparaison de donnees avec php-mysql

7 réponses
Avatar
Gilles
Bonjour,

Mon but : je souhaite comparer les données modifiées par l'intermédiaire de
le fonction
array_diff_assoc, puis envoyer un mail à un administrateur en précisant
uniquement
les données modifiées genre "tel old" modifié par "tel new", je ne veux pas
mettre des champs cachés supplémentaires, car je possède de nombreux
formulaires à traiter.

Mes essais :
1° étape : après la soumission (self) du formulaire, je récupère dans un
tableau $Old par un select dans ma table, les anciennes données déjà
enregistrées.
2° étape : J'hupdate ma table.
3° étape : je récupère par le même select les nouvelles données $New de ma
table
4° Je compare les deux tableaux $Old et $New avec la fonction
array_diff_assoc.

Ca me parait logique sauf que le résultat de $Old prend les valeurs de $New.
J'ai essayé de mettre manuellement les données envoyées dans le tableau
$New, c'est
pareil, par contre avec le même codage mais sans faire l'hdupdate de la
table, ça marche!
Je pense que c'est une histoire de buffer ou de mémoire tampon, quelqu'un
peut-il me donner une piste ?

Merci

7 réponses

Avatar
John GALLET
Bonjour,

1° étape : après la soumission (self) du formulaire, je récupère dans un
tableau $Old par un select dans ma table, les anciennes données déjà
enregistrées.
Oui. Attention aux transactions.


2° étape : J'hupdate ma table.
Ok.


3° étape : je récupère par le même select les nouvelles données $New de ma


C'est sous-optimal, on vient de faire l'update. Il n'y a qu'à differ les
données anciennes avec celles qu'on vient de recevoir.


J'ai essayé de mettre manuellement les données envoyées dans le tableau
$New, c'est
pareil, par contre avec le même codage mais sans faire l'hdupdate de la
table, ça marche!
Je n'ai pas compris cette phrase.


Je pense que c'est une histoire de buffer ou de mémoire tampon, quelqu'un
peut-il me donner une piste ?
Touillage dans le code ou incompréhension du momnet où à lieu le SELECT

du old (l'histoire du SELF me fait peur). Extrait du code SVP.

a++;
JG

Avatar
watayoune
Salut,

peux-tu mettre un bout de code stp ?

est-ce que $old est rempli avec un mysql_fetch_array ?

si tu fais $tmp = $Old avant de mettre à jour ta table, le problème
apparait toujours ?

Bonjour,

Mon but : je souhaite comparer les données modifiées par l'intermédiaire de
le fonction
array_diff_assoc, puis envoyer un mail à un administrateur en précisant
uniquement
les données modifiées genre "tel old" modifié par "tel new", je ne veux pas
mettre des champs cachés supplémentaires, car je possède de nombreux
formulaires à traiter.

Mes essais :
1° étape : après la soumission (self) du formulaire, je récupère dans un
tableau $Old par un select dans ma table, les anciennes données déjà
enregistrées.
2° étape : J'hupdate ma table.
3° étape : je récupère par le même select les nouvelles données $New de ma
table
4° Je compare les deux tableaux $Old et $New avec la fonction
array_diff_assoc.

Ca me parait logique sauf que le résultat de $Old prend les valeurs de $New.
J'ai essayé de mettre manuellement les données envoyées dans le tableau
$New, c'est
pareil, par contre avec le même codage mais sans faire l'hdupdate de la
table, ça marche!
Je pense que c'est une histoire de buffer ou de mémoire tampon, quelqu'un
peut-il me donner une piste ?

Merci


Avatar
loufoque
Gilles a dit le 05/10/2005 à 10:15:

3° étape : je récupère par le même select les nouvelles données $New de ma
table


Inutile, tu as les déjà en $_POST.


Je pense que c'est une histoire de buffer ou de mémoire tampon, quelqu'un
peut-il me donner une piste ?


Apparemment, ça vient du code qui est mauvais.

Avatar
Gilles
C'est sous-optimal, on vient de faire l'update. Il n'y a qu'à differ les
données anciennes avec celles qu'on vient de recevoir.


oui, mais l'avantage c'est que les deux tableaux $Old et $New sont
automatiquement avec la
même structure, plus facile à comparer avec la fonction array_diff_assoc,
contrairement a ce que je reçois.

Je n'ai pas compris cette phrase.


C'est un peu ton idée de comparer les données reçues avec les $Old, si je
compare à ce niveau tout va bien, mais si j'hupdate la table je pert les
données du $Old

du old (l'histoire du SELF me fait peur).


Pour le seft, faut pas avoir peur...c'est un formulaire qui s'appelle tout
seul et la première partie du code de la page traite les données si il y a
eu soumission, puis réaffiche la page ou redirige suivant le cas.

Extrait du code SVP.


Ok je vais vous envoyer un extrait du code que je dois refaire car il est
parti à la poubelle }:(

Merci pour vos recherches

Avatar
Gilles
est-ce que $old est rempli avec un mysql_fetch_array ?
oui


si tu fais $tmp = $Old avant de mettre à jour ta table, le problème
apparait toujours ?
tu as compris le probléme, mais j'ai essayé cette solution de transfert dans

une autre variable, utilisation de
unbufferred pour le query, de locker en ecriture la base avant et de la
delocker pour
l'update....Nada!

peux-tu mettre un bout de code stp ?
Ok le code arrive


Avatar
Gilles
Bonjour

Voici deux exemples de codage
Le premier fonctionne sans update
Le second, plus généraliste avec l'update, ne fonctionne pas ou
aléatoirement

j'aurais voulu que ça marche car j'ai automatisé la création de mes
formulaires, je ne connais donc pas à l'avance les champs que je
récupère...mais ne vous cassez pas la tête quand même!

J'espère que la suite est compréhensible :-)

////////////////////////// Premier essai ///////////////////////////////////
//Récupération des anciennes données dans la table
//
$query = "SELECT ID_Societe,Sc_Nom,Sc_Adresse,Sc_CodePostal,Sc_Ville,ID_Pays
FROM societe ";
$query .= sprintf("WHERE
ID_Societe=%s",GetSQLValueString($_REQUEST['ID_Prg'], "int"));
$Result_Old = mysql_query($query, $connexion) or die(mysql_error());
$Old=mysql_fetch_assoc($Result_Old);//assoc permet d'obtenir directement le
nom du champ à la fin du processus
//
//récupération Manuellement des données postées par le formulaire
$New['ID_Societe']=$_REQUEST['ID_Prg'];
$New['Sc_Nom']=$_REQUEST['Sc_Nom'];
$New['Sc_Adresse']=$_REQUEST['Sc_Adresse'];
$New['Sc_CodePostal']=$_REQUEST['Sc_CodePostal'];
$New['Sc_Ville']=$_REQUEST['Sc_Ville'];
$New['ID_Pays']=$_REQUEST['ID_Pays'];print_r($Old);
//
//SANS UPDATE
//
echo "<br>-----------<br>";
print_r($New);
//
//Je récupère uniquement les champs dont les données ont changé
//
$Change=array_diff_assoc($Old, $New);
//
echo "<br>-----------<br>Champs modifiés :";
print_r ($Change);
//
//CA MARCHE à tous les coups!
----------------
Résultat :
Array ( [ID_Societe] => 181 [Sc_Nom] => EssaiCode [Sc_Adresse] => Test
[Sc_CodePostal] => 00000 [Sc_Ville] => Toto )
-----------
Array ( [ID_Societe] => 181 [Sc_Nom] => EssaiCode22 [Sc_Adresse] => Test
[Sc_CodePostal] => 22222 [Sc_Ville] => Toto )
-----------
Champs modifiés :Array ( [Sc_Nom] => EssaiCode [Sc_CodePostal] => 00000 )
//
////////////////////////////// Deuxieme Essai //////////////////////////
//
$query = "SELECT ID_Societe,Sc_Nom,Sc_Adresse,Sc_CodePostal,Sc_Ville FROM
societe ";
$query .= sprintf("WHERE ID_Societe=%s",
GetSQLValueString($_REQUEST['ID_Prg'], "int"));
$Result_Old = mysql_query($query, $connexion) or die(mysql_error());
$Old=mysql_fetch_assoc($Result_Old);
//
//je souhaite mettre un code plus général qui sert pour plusieurs tables
genre un SELECT * FROM $table
//qui me permet de faire du copier coller sur toute mes pages ou le mettre
en function
//
//ci-dessous, la récupération que je veux eviter car mes formulaires sont
nombreux, automatisés et bien achallandés.
//Pour vos essais, vous pouvez laisser le codage suivant et enlever la
requête aprés l'hpdate, le résultat sera le même
// $New['ID_Societe']=$_REQUEST['ID_Prg'];
//$New['Sc_Nom']=$_REQUEST['Sc_Nom'];
//$New['Sc_Adresse']=$_REQUEST['Sc_Adresse'];
//$New['Sc_CodePostal']=$_REQUEST['Sc_CodePostal'];
//$New['Sc_Ville']=$_REQUEST['Sc_Ville']; */
//
// J'UPDATE la table;
//Code déjà existant pas de codage suppléméntaire
//
$SQL = sprintf("UPDATE societe SET Sc_Nom=%s, Sc_Adresse=%s,
Sc_CodePostal=%s, Sc_Ville=%s WHERE societe.ID_Societe= %s",
GetSQLValueString($_REQUEST['Sc_Nom'], "text"),
GetSQLValueString($_REQUEST['Sc_Adresse'], "text"),
GetSQLValueString($_REQUEST['Sc_CodePostal'],
"text"),
GetSQLValueString($_REQUEST['Sc_Ville'], "text"),
GetSQLValueString($_REQUEST['ID_Prg'], "int"));
$Result = mysql_query($SQL, $connexion) or die(mysql_error());
//
//même query pour récupérer les nouvelles données (A enlever si vous gardez
le tableau manuel)
//
$Result_New = mysql_query($query, $connexion) or die(mysql_error());
$New=mysql_fetch_assoc($Result_New);
//
print_r($Old);
echo "<br>-----------<br>";
print_r($New);
//
//Je récupère uniquement les champs dont les données ont changé pour les
analyser
//
$Change=array_diff_assoc($Old, $New);
//
echo "<br>-----------<br>";
print_r ($Change);
//
//Ca Ne marche PAS, car $Old a les même valeurs que $New ???
//faites plusieurs essais car j'ai réussi à le faire fonctionner 1 fois puis
plus rien
//
------------------
//Résultat
Array ( [ID_Societe] => 181 [Sc_Nom] => EssaiCode [Sc_Adresse] => Test
[Sc_CodePostal] => 00000 [Sc_Ville] => Toto )
-----------
Array ( [ID_Societe] => 181 [Sc_Nom] => EssaiCode [Sc_Adresse] => Test
[Sc_CodePostal] => 00000 [Sc_Ville] => Toto )
-----------
Champs modifiés :Array ( )
////////////////////////////////////////Fin
///////////////////////////////////////////

Je pense que c'est physique!
Je travaille en interne avec dreamweaver, apache, mysql

bonne journée
Gilles
Avatar
John GALLET
Bonjour,

////////////////////////////// Deuxieme Essai //////////////////////////

print_r($Old);
echo "<br>-----------<br>";
print_r($New);


Mouais.

//Ca Ne marche PAS, car $Old a les même valeurs que $New ???
//faites plusieurs essais car j'ai réussi à le faire fonctionner 1 fois puis
plus rien
Ca sent la boucle.

dans
$SQL = sprintf("UPDATE societe SET Sc_Nom=%s, Sc_Adresse=%s,
Sc_CodePostal=%s, Sc_Ville=%s WHERE societe.ID_Societe= %s",
etc... qu'est-ce qu'on a reçu ? On serait pas en train de jouer à se
renvoyer les données N fois ? Les _SELF sont très pratiques pour se
prendre les pieds dans le tapis.
Donc : ajouter un print_r($_REQUEST) au début du script, le refaire
tourner, et reposter le résultat.

Si c'est pas ça, je ne vois pas l'erreur (j'ai pas dit qu'il n'y en a
pas, mais en lecture rapide, je n'en vois pas). Ca me ferait penser à un
problème de cache SGBD ou de transactions non committée. Quelle version
de Mysql et configurée comment ?

Je travaille en interne avec dreamweaver, apache, mysql
(Aucune importance, à part la version de mysql éventuellement)

a++;
JG