IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Comparaison de données


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut Comparaison de données
    Bonjour,

    Je souhaite comparer des données et j'ai imaginé le code suivant. Je rencontre cependant une difficulté avec des données binaires, où false est matérialisé par NULL ou une absence de donnée (!isset) et true est représenté par 1. La difficulté est que si j'ai le même nombre de 1, le résultat est vrai (ligne 14) alors qu'il ne s'agit pas des mêmes clés (shower1, toilet1 dans le premier tableau, shower2, toilet2 dans le deuxième). J'utilise implode pour ne pas tenir compte des chaînes vides et des valeurs nulles. L'objectif est de ne pas réenregistrer des données identiques pour ne pas mettre à jour le champ 'ON UPDATE' de ma base de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    			var_dump($inData['comment']['score']); // 5
    			// Sélection des données à sauvegarder
    			$tables = ['hotel', 'comment', 'services'];
    			$isToSave = array_fill_keys($tables, true);
    			foreach (DATA_GROUPS as $group=>$table) {
    				$arrTest1 = $_SESSION['inData'][$group];
    				$arrTest2 = $outData[$group];
    				unset($arrTest1['id'], $arrTest1['update_date'], $arrTest2['id'], $arrTest2['update_date']);
    			var_dump($arrTest1);
    			var_dump($arrTest2);
    			var_dump(implode($arrTest1));
    			var_dump(implode($arrTest2));
    				if (implode($arrTest1) === implode($arrTest2))
    					$isToSave[$group] = false;
    			}
    			var_dump($isToSave);
    Voici un exemple de données considérées à tort comme identiques.
    C:\wamp64\www\hotels\mainFormHandle.php:9:
    array (size=22)
    'currency' => string 'EUR' (length=3)
    '1bed' => string '49.00' (length=5)
    '2beds' => string '82.00' (length=5)
    'extra' => null
    'free_breakfast' => null
    'pay_breakfast' => null
    '1bed_shower' => null
    '1bed_toilet' => null
    '1bed_shower_toilet' => null
    '2beds_shower_toilet' => null
    'shower1' => string '1' (length=1)
    'toilet1' => string '1' (length=1)
    'shower2' => null
    'toilet2' => null
    'special1' => null
    'special2' => null
    'fair1' => null
    'seasonal1' => null
    'duration1' => null
    'fair2' => null
    'seasonal2' => null
    'duration2' => null

    C:\wamp64\www\hotels\mainFormHandle.php:10:
    array (size=9)
    'currency' => string 'EUR' (length=3)
    '1bed' => string '49.00' (length=5)
    '2beds' => string '82.00' (length=5)
    'extra' => null
    'special1' => null
    'special2' => null
    'pay_breakfast' => null
    'shower2' => string '1' (length=1)
    'toilet2' => string '1' (length=1)
    C:\wamp64\www\hotels\mainFormHandle.php:169:string 'EUR49.0082.0011' (length=15)
    C:\wamp64\www\hotels\mainFormHandle.php:170:string 'EUR49.0082.0011' (length=15)

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    J'ai trouvé une solution:
    J'ai créé une moulinette qui me formate les données de la même façon et dans le même ordre ce qui me permet de comparer directement les deux tableaux.

  3. #3
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Ton but est-il d'insérer dans une table seulement si la clé d'unicité est respectée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert ignore into ma_table...
    Ton but est-il d'insérer dans une table, et si l'élément est déjà présent, de simplement le mettre à jour ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Insert into ma_table (id, nom, prenom, mail, fonction)  values (NULL, 'CRUCHOT', 'Ludovic', 'ludo.cruchot@gmail.com', 'gendarme')
    on duplicate key update fonction='gendarme';
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    EDIT: J'ai un formulaire prérempli avec les données existant dans la table. Si dans un champ l'utilisateur remplace l'ancienne valeur par la même, je n'enregistre pas. S'il remplace l'ancienne valeur par une valeur différente, j'enregistre.

    Mon but est de ne modifier la table que si les données utiles sans la date de mise à jour sont différentes pour NE PAS mettre à jour le champ update_date si les données sont identiques. Car l'utilisateur a besoin de connaître la date de dernière modification significative. S'il tente d'enregistrer sans avoir fait de modification réelle, on n'enregistre pas.
    Suis-je assez clair?
    Le code donné en #1 est un contrôle (fichier de contrôle) qui intervient avant le code d'enregistrement dans la table (fichier model).

    J'aurais du préciser qu'il ne s'agit pas d'insertion mais de modification, au temps pour moi.

    EDIT 2: Mon seul problème est que je ne suis pas sûr de l'efficacité de mon code de contrôle.

  5. #5
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Ca c'est une question marrante ! Je vais vérifier un truc. Je reviens.

    edit me revoilà...

    Je crois que tu te fatigues pour rien.

    Si je fais une table avec les mêmes données, et que je modifie avec les mêmes données, et un champ maj "on update current_timestamp", il ne se passe rien, la maj ne bouge pas.
    Car 0 ligne affectée. Je viens de tester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE `ma_table` SET nom="MOIMP", prenom="Edgar", mail="edgar.moimp@fai.com", `boisson` = 'lait' WHERE `ma_table`.`id` = 1;
    Si bien sûr, j'ai bien compris ta problématique.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    Merci @Dendrite.

    Je ne l'ai pas encore testée mais ta remarque est intéressante.
    Plusieurs points sont cependant à considérer:
    1. Un champ date suffit et je n'ai pas besoin de TIMESTAMP ni de DATETIME.
    2. Jusqu'à maintenant, mon hébergeur (Ionos 1&1) fonctionnait uniquement avec la version 5.5 de MySQL.
    3. En conséquence, l'utilisation du CURRENT_TIMESTAMP posait des problèmes: Ils sont à peu près exposés ici: https://stackoverrun.com/fr/q/3462017.
    4. En seconde conséquence je n'utilisais pas le CURRENT_TIMESTAMP, mais je générais la date ou le DATETIME à partir de PHP.
    5. Je découvre que Ionos est passé récemment à la version 5.7 et d'après le lien précédent, il semblerait que ce problème soit résolu.
    6. Je dois donc reprendre et rationaliser mon code en tenant compte de ces évolutions et tester ta remarque.

  7. #7
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    EDIT !

    Ah oui, je comprends mieux.
    Il y a cette fonction native alors, si tu veux tout traiter en PHP.
    Trouvée sur le manuel PHP, page array_diff_assoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $differences = array_diff_assoc($array1, $array2);
    if(count($differences)>0){
       //update
    }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 364
    Points : 5 734
    Points
    5 734
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dendrite Voir le message

    Ton but est-il d'insérer dans une table, et si l'élément est déjà présent, de simplement le mettre à jour ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Insert into ma_table (id, nom, prenom, mail, fonction)  values (NULL, 'CRUCHOT', 'Ludovic', 'ludo.cruchot@gmail.com', 'gendarme')
    on duplicate key update fonction='gendarme';
    Salut Dendrite, pour le INSERT ou UPDATE, tu conseilles le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Insert into ma_table ...
    on duplicate key update
    Ayant le même besoin, j'étais aussi parti là-dessus, mais comme j'ai aussi besoin de faire un compteur des INSERT et un compteur des UPDATE, je reviens en arrière et fais 3 requêtes SQL (d'abord un SELECT pour tester la présence dans la bdd, puis selon, soit un INSERT, soit un UPDATE (soit rien si présence avérée et valeurs identiques)). Penses-tu que c'est le bon choix ?

    EDIT : la fonction array_diff_assoc que tu me fais connaître, semble intéressante dans mon cas. En gros, je ferais un SELECT puis un array_diff_assoc où je compare le résultat du SELECT et le tableau à traiter (une liste de valeurs) et selon, je décide un INSERT, un UPDATE (la clé primaire de la table n'appartient pas à la liste des différences) ou rien.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    EDIT !

    Ah oui, je comprends mieux.
    Il y a cette fonction native alors, si tu veux tout traiter en PHP.
    Trouvée sur le manuel PHP, page array_diff_assoc
    Vu le lien au point 3 et les points 5 et 6 de mon message #6, je préfère tester la solution SQL si elle fonctionne, sauf qu'il va me falloir un peu de temps.

  10. #10
    Membre éclairé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 576
    Points : 803
    Points
    803
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Si je fais une table avec les mêmes données, et que je modifie avec les mêmes données, et un champ maj "on update current_timestamp", il ne se passe rien, la maj ne bouge pas.
    Car 0 ligne affectée. Je viens de tester.
    Je viens de tester avec un champ datetime 'update_date', d'abord avec une valeur NULL au départ, puis avec une valeur sur ce champ.
    Le champ update_date n'évolue que si les données sont réellement différentes.
    Merci super Dendrite!

    C'est donc parti, je modifie mon code!

  11. #11
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Super !

    Je reviens sur une chose, à propos de INSERT... ON DUPLICATE KEY UPDATE, tu dis ceci

    Ayant le même besoin, j'étais aussi parti là-dessus, mais comme j'ai aussi besoin de faire un compteur des INSERT et un compteur des UPDATE
    Aucun problème, comme il est indiqué dans le lien vers mon blog, l'instruction retourne 1 si insert, et 2 si update...
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparaison de données dans un tableau
    Par Azertime dans le forum LabVIEW
    Réponses: 3
    Dernier message: 12/05/2007, 23h13
  2. [VBA-E] Comparaison de donnée + Msgbox
    Par GardienDuCode dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 01/03/2007, 09h55
  3. comparaison de données
    Par fbu78 dans le forum Access
    Réponses: 2
    Dernier message: 01/02/2007, 08h06
  4. Comparaison de données entre deux arrays
    Par sironimo dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 20/04/2006, 17h44
  5. Comparaison des données de deux schéma de mêmes structure
    Par Moez Sokrati dans le forum Oracle
    Réponses: 1
    Dernier message: 28/03/2006, 18h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo