cela fait quelques jours que je cherche à comparer les valeurs de 2 tableaux associatifs provenant d'une requête.
En gros, je génère 2 tableaux qui contiennent chacun les valeurs d'une table sql (les 2 tables SQL ont comme champs : CAM_ID, CAM_IMMAT, CAM_MARQUE, CAM_CUBAGE)
J'arrive bien à mettre mes résultats dans 2 tableaux associatifs et j'obtiens ce genre de résultat :
Là où ça se complique, c'est quand je tente de vérifier si la ligne [CAM_ID] =>1 provenant de mon tableau 1 est également présente dans mon tableau 2.
J'ai tenté, tout un tas de fonctions différentes : array_diff, array_diff_assoc, array_diff_key, array_diff_ukey mais à chaque fois sans succès...
Je ne pense pas être trop loin de la vérité, mais en plus de ne pas comprendre quelle fonction est la mieux adaptée à mes besoins, je pense aussi avoir un problème de syntaxe dans ces fonctions (erreurs Argument #1 is not an array et Array to string conversion à gogo !)
Bref, voici mon code, si quelqu'un pourrait éclairer un peu ma lanterne :
$sth = $intrapole->prepare("SELECT CAM_ID, CAM_IMMAT, CAM_MARQUE, CAM_CUBAGE FROM xxx");
$sth->execute();
$sth2 = $ovh->prepare("SELECT CAM_ID, CAM_IMMAT, CAM_MARQUE, CAM_CUBAGE FROM xxx");
$sth2->execute();
/* ovh */
echo '<br/><br/>ovh : <br/><br/>';
$result_ovh = $sth2->fetchAll(PDO::FETCH_ASSOC);
foreach($result_ovh as $cle3 => $element3)
{
echo 'ovh : ['.$cle3.'] vaut '.$element3['CAM_ID'].' - '.$element3['CAM_IMMAT'].'<br/>';
}
echo '<br/><br/>Intra : <br/><br/>';
$result2 = $sth->fetchAll(PDO::FETCH_ASSOC);
foreach($result2 as $cle2 => $element2)
{
echo 'intra : ['.$cle2.'] vaut '.$element2['CAM_ID'].' - '.$element2['CAM_IMMAT'].'<br/>';
}
echo'<pre>';
print_r($result2);
echo'<pre>';
$comp = array_diff($element2['CAM_ID'], $element3['CAM_ID']);
echo'<pre>';
print_r($comp);
echo'<pre>';
unset($result2); // Détruit la référence sur le dernier élément
unset($result_ovh); // Détruit la référence sur le dernier élément
Tu ne peux pas mettre la valeur de CAM_ID en clé ? (via l'option PDO::FETCH_UNIQUE) Ca pourrait considérablement simplifier les choses (et être plus performant)
en gros, les 2 tables sql dont je parle sont situées sur 2 serveurs différents. Je cherche donc à mettre à jour la table du serveur 2 en fonction de ce qui se trouve sur le serveur 1. Pour cela, j'ai identifié 2 cas de figure :
- soit l'id de la table 1 et déjà présente dans la table 2 : dans ce cas, soit je ne fais rien soit le la met à jour (je n'ai pas encore décidé)
- soit l'id de la table 1 n'est pas présente dans la table 2 et dans ce cas, je la crée dans la table 2.
C'est pour cela que les 2 requêtes sont identiques : il gros, il s'agit de 'mirrorer' les 2 tables (mais je vais rajouter des champs dans la table 2, donc je ne peux pas utiliser la solution de facilité : effacer la table 2 et dupliquer la totalité de la table 1 à chaque exécution du script)
Je ne passe pas une page php car ce script sera exécuté par une tâche cron et que j'ai plus l’habitude du php que du sql. Cela dit, si c'est plus simple/propre en passant par un script sql, pourquoi pas. J'ai encore pas mal de choses à apprendre.
Dommage que ce soit sur deux serveurs différents, on n'aurait probablement pu utiliser INSERT IGNORE ... SELECT ou INSERT ... SELECT ... ON DUPLICATE KEY UPDATE ...
Simplement :
$sth = $intrapole->query('SELECT CAM_ID, CAM_IMMAT, CAM_MARQUE, CAM_CUBAGE FROM xxx', PDO::FETCH_ASSOC);
$sth2 = $ovh->prepare('INSERT IGNORE INTO xxx(CAM_ID, CAM_IMMAT, CAM_MARQUE, CAM_CUBAGE) VALUES(:CAM_ID, :CAM_IMMAT, :CAM_MARQUE, :CAM_CUBAGE)');
foreach ($sth as $row) {
$sth2->execute($row);
}
?
Il faudrait éviter d'avoir un auto-incrément sur la table qui se fait synchroniser, il risque même d'être problématique tout court et de tout faire planter si jamais tu fais des insertions sur la table qui se fait synchroniser.
Si jamais tu voulais mettre à jour les lignes qui existent (au lieu de purement et simplement les ignorer), il faut remplacer le INSERT IGNORE ... par INSERT ... ON DUPLICATE KEY UPDATE ...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli